From c95b0d7a17492e0ce773181858cfbcd4ce50a83b Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 00:13:02 +0200 Subject: [PATCH 1/8] chore(proto): resync protos/gen from services; drop removed HPA fields; remove leaked curl.txt - make proto now also syncs hpa_connector.proto/pb.go (recommendation.proto imports it upstream). - Remove workloadRule hpaRule.targetUtilization / targetMemoryUtilization / primaryMetric: dakr reserved HPARuleConfig fields 4/5/12 on 2026-07-07 and dropped the columns, so the server ignored and never echoed them. Use hpaRule.metrics (CPU/Memory/external triggers) instead. BREAKING for programs setting them. - Delete the untracked curl.txt scratch file that contained a live bearer token and gitignore the pattern. ROTATE THAT TOKEN. --- .gitignore | 5 +- Makefile | 4 +- .../gen/api/v1/apiv1connect/k8s.connect.go | 334 +- .../api/v1/apiv1connect/profiling.connect.go | 37 +- .../v1/apiv1connect/recommendation.connect.go | 1841 +- internal/gen/api/v1/cluster.pb.go | 553 +- internal/gen/api/v1/common.pb.go | 20129 +++--- internal/gen/api/v1/hpa_connector.pb.go | 850 + internal/gen/api/v1/k8s.pb.go | 8870 ++- internal/gen/api/v1/profiling.pb.go | 1720 +- internal/gen/api/v1/profiling_grpc.pb.go | 47 +- internal/gen/api/v1/recommendation.pb.go | 54224 +++++++++++----- internal/proto/api/v1/cluster.proto | 2 + internal/proto/api/v1/common.proto | 374 +- internal/proto/api/v1/hpa_connector.proto | 67 + internal/proto/api/v1/k8s.proto | 255 +- internal/proto/api/v1/profiling.proto | 112 + internal/proto/api/v1/recommendation.proto | 2681 +- provider/pkg/resources/workload_rule.go | 32 +- provider/pkg/resources/workload_rule_test.go | 13 +- 20 files changed, 63962 insertions(+), 28188 deletions(-) create mode 100644 internal/gen/api/v1/hpa_connector.pb.go create mode 100644 internal/proto/api/v1/hpa_connector.proto diff --git a/.gitignore b/.gitignore index 7ef5054..f97afcc 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,7 @@ Pulumi.*.yaml docs/plans examples/python/ examples/typescript/node_modules/ -example-local-test/ \ No newline at end of file +example-local-test/ +# Never commit ad-hoc API scratch files (may contain tokens) +curl.txt +*.curl diff --git a/Makefile b/Makefile index 05d3b21..4437830 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ TARGET_PROTO_DIR = internal/proto/api/v1 TARGET_GEN_PB_DIR = internal/gen/api/v1 TARGET_GEN_CONNECT_DIR = internal/gen/api/v1/apiv1connect -PROTO_FILES = common.proto instance.proto k8s.proto recommendation.proto cluster.proto profiling.proto -GEN_PB_FILES = common.pb.go instance.pb.go k8s.pb.go recommendation.pb.go cluster.pb.go cluster_grpc.pb.go profiling.pb.go profiling_grpc.pb.go +PROTO_FILES = common.proto instance.proto k8s.proto recommendation.proto cluster.proto profiling.proto hpa_connector.proto +GEN_PB_FILES = common.pb.go instance.pb.go k8s.pb.go recommendation.pb.go cluster.pb.go cluster_grpc.pb.go profiling.pb.go profiling_grpc.pb.go hpa_connector.pb.go GEN_CONNECT_FILES = k8s.connect.go recommendation.connect.go cluster.connect.go profiling.connect.go OLD_IMPORT = github.com/devzero-inc/services/dakr/gen/api/v1 diff --git a/internal/gen/api/v1/apiv1connect/k8s.connect.go b/internal/gen/api/v1/apiv1connect/k8s.connect.go index 1e5ce29..f3e67fc 100644 --- a/internal/gen/api/v1/apiv1connect/k8s.connect.go +++ b/internal/gen/api/v1/apiv1connect/k8s.connect.go @@ -85,6 +85,12 @@ const ( K8SServiceGetNodeProcedure = "/api.v1.K8SService/GetNode" // K8SServiceGetWorkloadsProcedure is the fully-qualified name of the K8SService's GetWorkloads RPC. K8SServiceGetWorkloadsProcedure = "/api.v1.K8SService/GetWorkloads" + // K8SServiceListWorkloadsPaginatedProcedure is the fully-qualified name of the K8SService's + // ListWorkloadsPaginated RPC. + K8SServiceListWorkloadsPaginatedProcedure = "/api.v1.K8SService/ListWorkloadsPaginated" + // K8SServiceGetWorkloadsSummaryProcedure is the fully-qualified name of the K8SService's + // GetWorkloadsSummary RPC. + K8SServiceGetWorkloadsSummaryProcedure = "/api.v1.K8SService/GetWorkloadsSummary" // K8SServiceGetWorkloadProcedure is the fully-qualified name of the K8SService's GetWorkload RPC. K8SServiceGetWorkloadProcedure = "/api.v1.K8SService/GetWorkload" // K8SServiceGetWorkloadContainerPercentilesProcedure is the fully-qualified name of the @@ -96,6 +102,18 @@ const ( // K8SServiceGetLatestContainerRequestLimitsProcedure is the fully-qualified name of the // K8SService's GetLatestContainerRequestLimits RPC. K8SServiceGetLatestContainerRequestLimitsProcedure = "/api.v1.K8SService/GetLatestContainerRequestLimits" + // K8SServiceGetNodeGPUMigInstancesProcedure is the fully-qualified name of the K8SService's + // GetNodeGPUMigInstances RPC. + K8SServiceGetNodeGPUMigInstancesProcedure = "/api.v1.K8SService/GetNodeGPUMigInstances" + // K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure is the fully-qualified name of the + // K8SService's GetNodeGPUMigInstanceTimeseries RPC. + K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure = "/api.v1.K8SService/GetNodeGPUMigInstanceTimeseries" + // K8SServiceGetContainerIndividualGPUMetricsProcedure is the fully-qualified name of the + // K8SService's GetContainerIndividualGPUMetrics RPC. + K8SServiceGetContainerIndividualGPUMetricsProcedure = "/api.v1.K8SService/GetContainerIndividualGPUMetrics" + // K8SServiceGetWorkloadLanguagesProcedure is the fully-qualified name of the K8SService's + // GetWorkloadLanguages RPC. + K8SServiceGetWorkloadLanguagesProcedure = "/api.v1.K8SService/GetWorkloadLanguages" // K8SServiceGetForecastWorkloadsProcedure is the fully-qualified name of the K8SService's // GetForecastWorkloads RPC. K8SServiceGetForecastWorkloadsProcedure = "/api.v1.K8SService/GetForecastWorkloads" @@ -104,6 +122,9 @@ const ( K8SServiceGetForecastWorkloadProcedure = "/api.v1.K8SService/GetForecastWorkload" // K8SServiceGetResourcesProcedure is the fully-qualified name of the K8SService's GetResources RPC. K8SServiceGetResourcesProcedure = "/api.v1.K8SService/GetResources" + // K8SServiceGetResourceFilterOptionsProcedure is the fully-qualified name of the K8SService's + // GetResourceFilterOptions RPC. + K8SServiceGetResourceFilterOptionsProcedure = "/api.v1.K8SService/GetResourceFilterOptions" // K8SServiceGetPodsProcedure is the fully-qualified name of the K8SService's GetPods RPC. K8SServiceGetPodsProcedure = "/api.v1.K8SService/GetPods" // K8SServiceGetLatestOperatorVersionProcedure is the fully-qualified name of the K8SService's @@ -153,6 +174,9 @@ const ( K8SServiceRemoveClusterTagsProcedure = "/api.v1.K8SService/RemoveClusterTags" // K8SServiceListTagsProcedure is the fully-qualified name of the K8SService's ListTags RPC. K8SServiceListTagsProcedure = "/api.v1.K8SService/ListTags" + // K8SServiceGetMigPartedConfigProcedure is the fully-qualified name of the K8SService's + // GetMigPartedConfig RPC. + K8SServiceGetMigPartedConfigProcedure = "/api.v1.K8SService/GetMigPartedConfig" // ClusterMutationServiceCreateClusterProcedure is the fully-qualified name of the // ClusterMutationService's CreateCluster RPC. ClusterMutationServiceCreateClusterProcedure = "/api.v1.ClusterMutationService/CreateCluster" @@ -216,6 +240,13 @@ type K8SServiceClient interface { GetNode(context.Context, *connect.Request[v1.GetNodeRequest]) (*connect.Response[v1.GetNodeResponse], error) // GetWorkloads retrieves all workloads for a specific cluster. GetWorkloads(context.Context, *connect.Request[v1.GetWorkloadsRequest]) (*connect.Response[v1.GetWorkloadsResponse], error) + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) // GetWorkload retrieves detailed information for a specific workload. GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) // GetWorkloadContainerPercentiles retrieves per-container percentile metrics for a workload. @@ -227,6 +258,18 @@ type K8SServiceClient interface { GetWorkloadContainerTimeSeries(context.Context, *connect.Request[v1.GetWorkloadContainerTimeSeriesRequest]) (*connect.Response[v1.GetWorkloadContainerTimeSeriesResponse], error) // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. GetLatestContainerRequestLimits(context.Context, *connect.Request[v1.GetLatestContainerRequestLimitsRequest]) (*connect.Response[v1.GetLatestContainerRequestLimitsResponse], error) + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) // GetForecastWorkloads retrieves all workloads for a specific cluster. // // Deprecated: do not use. @@ -237,6 +280,8 @@ type K8SServiceClient interface { GetForecastWorkload(context.Context, *connect.Request[v1.GetForecastWorkloadRequest]) (*connect.Response[v1.GetForecastWorkloadResponse], error) // GetResources retrivers specific resource and their details from db, simulating informer. GetResources(context.Context, *connect.Request[v1.GetResourcesRequest]) (*connect.Response[v1.GetResourcesResponse], error) + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) // GetPods retrieves Pod resources and their details from db. GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) GetLatestOperatorVersion(context.Context, *connect.Request[v1.GetLatestOperatorVersionRequest]) (*connect.Response[v1.GetLatestOperatorVersionResponse], error) @@ -264,6 +309,10 @@ type K8SServiceClient interface { RemoveClusterTags(context.Context, *connect.Request[v1.RemoveClusterTagsRequest]) (*connect.Response[v1.RemoveClusterTagsResponse], error) // ListTags lists all tags for a team. ListTags(context.Context, *connect.Request[v1.ListTagsRequest]) (*connect.Response[v1.ListTagsResponse], error) + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) } // NewK8SServiceClient constructs a client for the api.v1.K8SService service. By default, it uses @@ -366,6 +415,16 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetWorkloadsProcedure, opts..., ), + listWorkloadsPaginated: connect.NewClient[v1.ListWorkloadsPaginatedRequest, v1.ListWorkloadsPaginatedResponse]( + httpClient, + baseURL+K8SServiceListWorkloadsPaginatedProcedure, + opts..., + ), + getWorkloadsSummary: connect.NewClient[v1.GetWorkloadsSummaryRequest, v1.GetWorkloadsSummaryResponse]( + httpClient, + baseURL+K8SServiceGetWorkloadsSummaryProcedure, + opts..., + ), getWorkload: connect.NewClient[v1.GetWorkloadRequest, v1.GetWorkloadResponse]( httpClient, baseURL+K8SServiceGetWorkloadProcedure, @@ -386,6 +445,26 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetLatestContainerRequestLimitsProcedure, opts..., ), + getNodeGPUMigInstances: connect.NewClient[v1.GetNodeGPUMigInstancesRequest, v1.GetNodeGPUMigInstancesResponse]( + httpClient, + baseURL+K8SServiceGetNodeGPUMigInstancesProcedure, + opts..., + ), + getNodeGPUMigInstanceTimeseries: connect.NewClient[v1.GetNodeGPUMigInstanceTimeseriesRequest, v1.GetNodeGPUMigInstanceTimeseriesResponse]( + httpClient, + baseURL+K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure, + opts..., + ), + getContainerIndividualGPUMetrics: connect.NewClient[v1.GetContainerIndividualGPUMetricsRequest, v1.GetContainerIndividualGPUMetricsResponse]( + httpClient, + baseURL+K8SServiceGetContainerIndividualGPUMetricsProcedure, + opts..., + ), + getWorkloadLanguages: connect.NewClient[v1.GetWorkloadLanguagesRequest, v1.GetWorkloadLanguagesResponse]( + httpClient, + baseURL+K8SServiceGetWorkloadLanguagesProcedure, + opts..., + ), getForecastWorkloads: connect.NewClient[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse]( httpClient, baseURL+K8SServiceGetForecastWorkloadsProcedure, @@ -401,6 +480,11 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetResourcesProcedure, opts..., ), + getResourceFilterOptions: connect.NewClient[v1.GetResourceFilterOptionsRequest, v1.GetResourceFilterOptionsResponse]( + httpClient, + baseURL+K8SServiceGetResourceFilterOptionsProcedure, + opts..., + ), getPods: connect.NewClient[v1.GetPodsRequest, v1.GetPodsResponse]( httpClient, baseURL+K8SServiceGetPodsProcedure, @@ -486,53 +570,66 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceListTagsProcedure, opts..., ), + getMigPartedConfig: connect.NewClient[v1.GetMigPartedConfigRequest, v1.GetMigPartedConfigResponse]( + httpClient, + baseURL+K8SServiceGetMigPartedConfigProcedure, + opts..., + ), } } // k8SServiceClient implements K8SServiceClient. type k8SServiceClient struct { - getWorkloadsStats *connect.Client[v1.GetWorkloadsStatsRequest, v1.GetWorkloadsStatsResponse] - getClusters *connect.Client[v1.GetClustersRequest, v1.GetClustersResponse] - listClusters *connect.Client[v1.ListClustersRequest, v1.ListClustersResponse] - getCluster *connect.Client[v1.GetClusterRequest, v1.GetClusterResponse] - getClusterMetadata *connect.Client[v1.GetClusterMetadataRequest, v1.GetClusterMetadataResponse] - getAllNamespaces *connect.Client[v1.GetAllNamespacesRequest, v1.GetAllNamespacesResponse] - searchNamespacesByCluster *connect.Client[v1.SearchNamespacesByClusterRequest, v1.SearchNamespacesByClusterResponse] - listNamespacesByCluster *connect.Client[v1.ListNamespacesByClusterRequest, v1.ListNamespacesByClusterResponse] - getAllWorkloadNames *connect.Client[v1.GetAllWorkloadNamesRequest, v1.GetAllWorkloadNamesResponse] - getAllWorkloadLabels *connect.Client[v1.GetAllWorkloadLabelsRequest, v1.GetAllWorkloadLabelsResponse] - getAllNodeGroupNames *connect.Client[v1.GetAllNodeGroupNamesRequest, v1.GetAllNodeGroupNamesResponse] - metadataForWorkloads *connect.Client[v1.MetadataForWorkloadsRequest, v1.MetadataForWorkloadsResponse] - getNodeGroups *connect.Client[v1.GetNodeGroupsRequest, v1.GetNodeGroupsResponse] - getAllNodeGroups *connect.Client[v1.GetAllNodeGroupsRequest, v1.GetAllNodeGroupsResponse] - getNodeGroupsUtilization *connect.Client[v1.GetNodeGroupsUtilizationRequest, v1.GetNodeGroupsUtilizationResponse] - getNodeGroup *connect.Client[v1.GetNodeGroupRequest, v1.GetNodeGroupResponse] - getNode *connect.Client[v1.GetNodeRequest, v1.GetNodeResponse] - getWorkloads *connect.Client[v1.GetWorkloadsRequest, v1.GetWorkloadsResponse] - getWorkload *connect.Client[v1.GetWorkloadRequest, v1.GetWorkloadResponse] - getWorkloadContainerPercentiles *connect.Client[v1.GetWorkloadContainerPercentilesRequest, v1.GetWorkloadContainerPercentilesResponse] - getWorkloadContainerTimeSeries *connect.Client[v1.GetWorkloadContainerTimeSeriesRequest, v1.GetWorkloadContainerTimeSeriesResponse] - getLatestContainerRequestLimits *connect.Client[v1.GetLatestContainerRequestLimitsRequest, v1.GetLatestContainerRequestLimitsResponse] - getForecastWorkloads *connect.Client[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse] - getForecastWorkload *connect.Client[v1.GetForecastWorkloadRequest, v1.GetForecastWorkloadResponse] - getResources *connect.Client[v1.GetResourcesRequest, v1.GetResourcesResponse] - getPods *connect.Client[v1.GetPodsRequest, v1.GetPodsResponse] - getLatestOperatorVersion *connect.Client[v1.GetLatestOperatorVersionRequest, v1.GetLatestOperatorVersionResponse] - galaxyGetWorkloadPerspective *connect.Client[v1.GalaxyGetWorkloadPerspectiveRequest, v1.GalaxyGetWorkloadPerspectiveResponse] - listAuditLogs *connect.Client[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] - listAuditLogOriginators *connect.Client[v1.ListAuditLogOriginatorsRequest, v1.ListAuditLogOriginatorsResponse] - sendWorkloadEmail *connect.Client[v1.SendWorkloadEmailRequest, v1.SendWorkloadEmailResponse] - sendWeeklySummaryEmail *connect.Client[v1.SendWeeklySummaryEmailRequest, v1.SendWeeklySummaryEmailResponse] - getClustersNodeInfo *connect.Client[v1.GetClustersNodeInfoRequest, v1.GetClustersNodeInfoResponse] - searchK8SResources *connect.Client[v1.SearchK8SResourcesRequest, v1.SearchK8SResourcesResponse] - searchK8SWorkloads *connect.Client[v1.SearchK8SWorkloadsRequest, v1.SearchK8SWorkloadsResponse] - getClusterType *connect.Client[v1.GetClusterTypeRequest, v1.GetClusterTypeResponse] - getRelationsForKind *connect.Client[v1.GetRelatedResourcesRequest, v1.GetRelatedResourcesResponse] - lookupNodeInstance *connect.Client[v1.LookupNodeInstanceRequest, v1.LookupNodeInstanceResponse] - getWorkloadPodHistory *connect.Client[v1.GetWorkloadPodHistoryRequest, v1.GetWorkloadPodHistoryResponse] - addClusterTags *connect.Client[v1.AddClusterTagsRequest, v1.AddClusterTagsResponse] - removeClusterTags *connect.Client[v1.RemoveClusterTagsRequest, v1.RemoveClusterTagsResponse] - listTags *connect.Client[v1.ListTagsRequest, v1.ListTagsResponse] + getWorkloadsStats *connect.Client[v1.GetWorkloadsStatsRequest, v1.GetWorkloadsStatsResponse] + getClusters *connect.Client[v1.GetClustersRequest, v1.GetClustersResponse] + listClusters *connect.Client[v1.ListClustersRequest, v1.ListClustersResponse] + getCluster *connect.Client[v1.GetClusterRequest, v1.GetClusterResponse] + getClusterMetadata *connect.Client[v1.GetClusterMetadataRequest, v1.GetClusterMetadataResponse] + getAllNamespaces *connect.Client[v1.GetAllNamespacesRequest, v1.GetAllNamespacesResponse] + searchNamespacesByCluster *connect.Client[v1.SearchNamespacesByClusterRequest, v1.SearchNamespacesByClusterResponse] + listNamespacesByCluster *connect.Client[v1.ListNamespacesByClusterRequest, v1.ListNamespacesByClusterResponse] + getAllWorkloadNames *connect.Client[v1.GetAllWorkloadNamesRequest, v1.GetAllWorkloadNamesResponse] + getAllWorkloadLabels *connect.Client[v1.GetAllWorkloadLabelsRequest, v1.GetAllWorkloadLabelsResponse] + getAllNodeGroupNames *connect.Client[v1.GetAllNodeGroupNamesRequest, v1.GetAllNodeGroupNamesResponse] + metadataForWorkloads *connect.Client[v1.MetadataForWorkloadsRequest, v1.MetadataForWorkloadsResponse] + getNodeGroups *connect.Client[v1.GetNodeGroupsRequest, v1.GetNodeGroupsResponse] + getAllNodeGroups *connect.Client[v1.GetAllNodeGroupsRequest, v1.GetAllNodeGroupsResponse] + getNodeGroupsUtilization *connect.Client[v1.GetNodeGroupsUtilizationRequest, v1.GetNodeGroupsUtilizationResponse] + getNodeGroup *connect.Client[v1.GetNodeGroupRequest, v1.GetNodeGroupResponse] + getNode *connect.Client[v1.GetNodeRequest, v1.GetNodeResponse] + getWorkloads *connect.Client[v1.GetWorkloadsRequest, v1.GetWorkloadsResponse] + listWorkloadsPaginated *connect.Client[v1.ListWorkloadsPaginatedRequest, v1.ListWorkloadsPaginatedResponse] + getWorkloadsSummary *connect.Client[v1.GetWorkloadsSummaryRequest, v1.GetWorkloadsSummaryResponse] + getWorkload *connect.Client[v1.GetWorkloadRequest, v1.GetWorkloadResponse] + getWorkloadContainerPercentiles *connect.Client[v1.GetWorkloadContainerPercentilesRequest, v1.GetWorkloadContainerPercentilesResponse] + getWorkloadContainerTimeSeries *connect.Client[v1.GetWorkloadContainerTimeSeriesRequest, v1.GetWorkloadContainerTimeSeriesResponse] + getLatestContainerRequestLimits *connect.Client[v1.GetLatestContainerRequestLimitsRequest, v1.GetLatestContainerRequestLimitsResponse] + getNodeGPUMigInstances *connect.Client[v1.GetNodeGPUMigInstancesRequest, v1.GetNodeGPUMigInstancesResponse] + getNodeGPUMigInstanceTimeseries *connect.Client[v1.GetNodeGPUMigInstanceTimeseriesRequest, v1.GetNodeGPUMigInstanceTimeseriesResponse] + getContainerIndividualGPUMetrics *connect.Client[v1.GetContainerIndividualGPUMetricsRequest, v1.GetContainerIndividualGPUMetricsResponse] + getWorkloadLanguages *connect.Client[v1.GetWorkloadLanguagesRequest, v1.GetWorkloadLanguagesResponse] + getForecastWorkloads *connect.Client[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse] + getForecastWorkload *connect.Client[v1.GetForecastWorkloadRequest, v1.GetForecastWorkloadResponse] + getResources *connect.Client[v1.GetResourcesRequest, v1.GetResourcesResponse] + getResourceFilterOptions *connect.Client[v1.GetResourceFilterOptionsRequest, v1.GetResourceFilterOptionsResponse] + getPods *connect.Client[v1.GetPodsRequest, v1.GetPodsResponse] + getLatestOperatorVersion *connect.Client[v1.GetLatestOperatorVersionRequest, v1.GetLatestOperatorVersionResponse] + galaxyGetWorkloadPerspective *connect.Client[v1.GalaxyGetWorkloadPerspectiveRequest, v1.GalaxyGetWorkloadPerspectiveResponse] + listAuditLogs *connect.Client[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] + listAuditLogOriginators *connect.Client[v1.ListAuditLogOriginatorsRequest, v1.ListAuditLogOriginatorsResponse] + sendWorkloadEmail *connect.Client[v1.SendWorkloadEmailRequest, v1.SendWorkloadEmailResponse] + sendWeeklySummaryEmail *connect.Client[v1.SendWeeklySummaryEmailRequest, v1.SendWeeklySummaryEmailResponse] + getClustersNodeInfo *connect.Client[v1.GetClustersNodeInfoRequest, v1.GetClustersNodeInfoResponse] + searchK8SResources *connect.Client[v1.SearchK8SResourcesRequest, v1.SearchK8SResourcesResponse] + searchK8SWorkloads *connect.Client[v1.SearchK8SWorkloadsRequest, v1.SearchK8SWorkloadsResponse] + getClusterType *connect.Client[v1.GetClusterTypeRequest, v1.GetClusterTypeResponse] + getRelationsForKind *connect.Client[v1.GetRelatedResourcesRequest, v1.GetRelatedResourcesResponse] + lookupNodeInstance *connect.Client[v1.LookupNodeInstanceRequest, v1.LookupNodeInstanceResponse] + getWorkloadPodHistory *connect.Client[v1.GetWorkloadPodHistoryRequest, v1.GetWorkloadPodHistoryResponse] + addClusterTags *connect.Client[v1.AddClusterTagsRequest, v1.AddClusterTagsResponse] + removeClusterTags *connect.Client[v1.RemoveClusterTagsRequest, v1.RemoveClusterTagsResponse] + listTags *connect.Client[v1.ListTagsRequest, v1.ListTagsResponse] + getMigPartedConfig *connect.Client[v1.GetMigPartedConfigRequest, v1.GetMigPartedConfigResponse] } // GetWorkloadsStats calls api.v1.K8SService.GetWorkloadsStats. @@ -627,6 +724,16 @@ func (c *k8SServiceClient) GetWorkloads(ctx context.Context, req *connect.Reques return c.getWorkloads.CallUnary(ctx, req) } +// ListWorkloadsPaginated calls api.v1.K8SService.ListWorkloadsPaginated. +func (c *k8SServiceClient) ListWorkloadsPaginated(ctx context.Context, req *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) { + return c.listWorkloadsPaginated.CallUnary(ctx, req) +} + +// GetWorkloadsSummary calls api.v1.K8SService.GetWorkloadsSummary. +func (c *k8SServiceClient) GetWorkloadsSummary(ctx context.Context, req *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) { + return c.getWorkloadsSummary.CallUnary(ctx, req) +} + // GetWorkload calls api.v1.K8SService.GetWorkload. func (c *k8SServiceClient) GetWorkload(ctx context.Context, req *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) { return c.getWorkload.CallUnary(ctx, req) @@ -647,6 +754,26 @@ func (c *k8SServiceClient) GetLatestContainerRequestLimits(ctx context.Context, return c.getLatestContainerRequestLimits.CallUnary(ctx, req) } +// GetNodeGPUMigInstances calls api.v1.K8SService.GetNodeGPUMigInstances. +func (c *k8SServiceClient) GetNodeGPUMigInstances(ctx context.Context, req *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) { + return c.getNodeGPUMigInstances.CallUnary(ctx, req) +} + +// GetNodeGPUMigInstanceTimeseries calls api.v1.K8SService.GetNodeGPUMigInstanceTimeseries. +func (c *k8SServiceClient) GetNodeGPUMigInstanceTimeseries(ctx context.Context, req *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) { + return c.getNodeGPUMigInstanceTimeseries.CallUnary(ctx, req) +} + +// GetContainerIndividualGPUMetrics calls api.v1.K8SService.GetContainerIndividualGPUMetrics. +func (c *k8SServiceClient) GetContainerIndividualGPUMetrics(ctx context.Context, req *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) { + return c.getContainerIndividualGPUMetrics.CallUnary(ctx, req) +} + +// GetWorkloadLanguages calls api.v1.K8SService.GetWorkloadLanguages. +func (c *k8SServiceClient) GetWorkloadLanguages(ctx context.Context, req *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) { + return c.getWorkloadLanguages.CallUnary(ctx, req) +} + // GetForecastWorkloads calls api.v1.K8SService.GetForecastWorkloads. // // Deprecated: do not use. @@ -666,6 +793,11 @@ func (c *k8SServiceClient) GetResources(ctx context.Context, req *connect.Reques return c.getResources.CallUnary(ctx, req) } +// GetResourceFilterOptions calls api.v1.K8SService.GetResourceFilterOptions. +func (c *k8SServiceClient) GetResourceFilterOptions(ctx context.Context, req *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) { + return c.getResourceFilterOptions.CallUnary(ctx, req) +} + // GetPods calls api.v1.K8SService.GetPods. func (c *k8SServiceClient) GetPods(ctx context.Context, req *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) { return c.getPods.CallUnary(ctx, req) @@ -751,6 +883,11 @@ func (c *k8SServiceClient) ListTags(ctx context.Context, req *connect.Request[v1 return c.listTags.CallUnary(ctx, req) } +// GetMigPartedConfig calls api.v1.K8SService.GetMigPartedConfig. +func (c *k8SServiceClient) GetMigPartedConfig(ctx context.Context, req *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) { + return c.getMigPartedConfig.CallUnary(ctx, req) +} + // K8SServiceHandler is an implementation of the api.v1.K8SService service. type K8SServiceHandler interface { // GetWorkloadsStats retrieves stats for workloads in a specific cluster. @@ -791,6 +928,13 @@ type K8SServiceHandler interface { GetNode(context.Context, *connect.Request[v1.GetNodeRequest]) (*connect.Response[v1.GetNodeResponse], error) // GetWorkloads retrieves all workloads for a specific cluster. GetWorkloads(context.Context, *connect.Request[v1.GetWorkloadsRequest]) (*connect.Response[v1.GetWorkloadsResponse], error) + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) // GetWorkload retrieves detailed information for a specific workload. GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) // GetWorkloadContainerPercentiles retrieves per-container percentile metrics for a workload. @@ -802,6 +946,18 @@ type K8SServiceHandler interface { GetWorkloadContainerTimeSeries(context.Context, *connect.Request[v1.GetWorkloadContainerTimeSeriesRequest]) (*connect.Response[v1.GetWorkloadContainerTimeSeriesResponse], error) // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. GetLatestContainerRequestLimits(context.Context, *connect.Request[v1.GetLatestContainerRequestLimitsRequest]) (*connect.Response[v1.GetLatestContainerRequestLimitsResponse], error) + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) // GetForecastWorkloads retrieves all workloads for a specific cluster. // // Deprecated: do not use. @@ -812,6 +968,8 @@ type K8SServiceHandler interface { GetForecastWorkload(context.Context, *connect.Request[v1.GetForecastWorkloadRequest]) (*connect.Response[v1.GetForecastWorkloadResponse], error) // GetResources retrivers specific resource and their details from db, simulating informer. GetResources(context.Context, *connect.Request[v1.GetResourcesRequest]) (*connect.Response[v1.GetResourcesResponse], error) + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) // GetPods retrieves Pod resources and their details from db. GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) GetLatestOperatorVersion(context.Context, *connect.Request[v1.GetLatestOperatorVersionRequest]) (*connect.Response[v1.GetLatestOperatorVersionResponse], error) @@ -839,6 +997,10 @@ type K8SServiceHandler interface { RemoveClusterTags(context.Context, *connect.Request[v1.RemoveClusterTagsRequest]) (*connect.Response[v1.RemoveClusterTagsResponse], error) // ListTags lists all tags for a team. ListTags(context.Context, *connect.Request[v1.ListTagsRequest]) (*connect.Response[v1.ListTagsResponse], error) + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) } // NewK8SServiceHandler builds an HTTP handler from the service implementation. It returns the path @@ -937,6 +1099,16 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetWorkloads, opts..., ) + k8SServiceListWorkloadsPaginatedHandler := connect.NewUnaryHandler( + K8SServiceListWorkloadsPaginatedProcedure, + svc.ListWorkloadsPaginated, + opts..., + ) + k8SServiceGetWorkloadsSummaryHandler := connect.NewUnaryHandler( + K8SServiceGetWorkloadsSummaryProcedure, + svc.GetWorkloadsSummary, + opts..., + ) k8SServiceGetWorkloadHandler := connect.NewUnaryHandler( K8SServiceGetWorkloadProcedure, svc.GetWorkload, @@ -957,6 +1129,26 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetLatestContainerRequestLimits, opts..., ) + k8SServiceGetNodeGPUMigInstancesHandler := connect.NewUnaryHandler( + K8SServiceGetNodeGPUMigInstancesProcedure, + svc.GetNodeGPUMigInstances, + opts..., + ) + k8SServiceGetNodeGPUMigInstanceTimeseriesHandler := connect.NewUnaryHandler( + K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure, + svc.GetNodeGPUMigInstanceTimeseries, + opts..., + ) + k8SServiceGetContainerIndividualGPUMetricsHandler := connect.NewUnaryHandler( + K8SServiceGetContainerIndividualGPUMetricsProcedure, + svc.GetContainerIndividualGPUMetrics, + opts..., + ) + k8SServiceGetWorkloadLanguagesHandler := connect.NewUnaryHandler( + K8SServiceGetWorkloadLanguagesProcedure, + svc.GetWorkloadLanguages, + opts..., + ) k8SServiceGetForecastWorkloadsHandler := connect.NewUnaryHandler( K8SServiceGetForecastWorkloadsProcedure, svc.GetForecastWorkloads, @@ -972,6 +1164,11 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetResources, opts..., ) + k8SServiceGetResourceFilterOptionsHandler := connect.NewUnaryHandler( + K8SServiceGetResourceFilterOptionsProcedure, + svc.GetResourceFilterOptions, + opts..., + ) k8SServiceGetPodsHandler := connect.NewUnaryHandler( K8SServiceGetPodsProcedure, svc.GetPods, @@ -1057,6 +1254,11 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.ListTags, opts..., ) + k8SServiceGetMigPartedConfigHandler := connect.NewUnaryHandler( + K8SServiceGetMigPartedConfigProcedure, + svc.GetMigPartedConfig, + opts..., + ) return "/api.v1.K8SService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case K8SServiceGetWorkloadsStatsProcedure: @@ -1095,6 +1297,10 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceGetNodeHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadsProcedure: k8SServiceGetWorkloadsHandler.ServeHTTP(w, r) + case K8SServiceListWorkloadsPaginatedProcedure: + k8SServiceListWorkloadsPaginatedHandler.ServeHTTP(w, r) + case K8SServiceGetWorkloadsSummaryProcedure: + k8SServiceGetWorkloadsSummaryHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadProcedure: k8SServiceGetWorkloadHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadContainerPercentilesProcedure: @@ -1103,12 +1309,22 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceGetWorkloadContainerTimeSeriesHandler.ServeHTTP(w, r) case K8SServiceGetLatestContainerRequestLimitsProcedure: k8SServiceGetLatestContainerRequestLimitsHandler.ServeHTTP(w, r) + case K8SServiceGetNodeGPUMigInstancesProcedure: + k8SServiceGetNodeGPUMigInstancesHandler.ServeHTTP(w, r) + case K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure: + k8SServiceGetNodeGPUMigInstanceTimeseriesHandler.ServeHTTP(w, r) + case K8SServiceGetContainerIndividualGPUMetricsProcedure: + k8SServiceGetContainerIndividualGPUMetricsHandler.ServeHTTP(w, r) + case K8SServiceGetWorkloadLanguagesProcedure: + k8SServiceGetWorkloadLanguagesHandler.ServeHTTP(w, r) case K8SServiceGetForecastWorkloadsProcedure: k8SServiceGetForecastWorkloadsHandler.ServeHTTP(w, r) case K8SServiceGetForecastWorkloadProcedure: k8SServiceGetForecastWorkloadHandler.ServeHTTP(w, r) case K8SServiceGetResourcesProcedure: k8SServiceGetResourcesHandler.ServeHTTP(w, r) + case K8SServiceGetResourceFilterOptionsProcedure: + k8SServiceGetResourceFilterOptionsHandler.ServeHTTP(w, r) case K8SServiceGetPodsProcedure: k8SServiceGetPodsHandler.ServeHTTP(w, r) case K8SServiceGetLatestOperatorVersionProcedure: @@ -1143,6 +1359,8 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceRemoveClusterTagsHandler.ServeHTTP(w, r) case K8SServiceListTagsProcedure: k8SServiceListTagsHandler.ServeHTTP(w, r) + case K8SServiceGetMigPartedConfigProcedure: + k8SServiceGetMigPartedConfigHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -1224,6 +1442,14 @@ func (UnimplementedK8SServiceHandler) GetWorkloads(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloads is not implemented")) } +func (UnimplementedK8SServiceHandler) ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.ListWorkloadsPaginated is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloadsSummary is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkload is not implemented")) } @@ -1240,6 +1466,22 @@ func (UnimplementedK8SServiceHandler) GetLatestContainerRequestLimits(context.Co return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetLatestContainerRequestLimits is not implemented")) } +func (UnimplementedK8SServiceHandler) GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetNodeGPUMigInstances is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetNodeGPUMigInstanceTimeseries is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetContainerIndividualGPUMetrics is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloadLanguages is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetForecastWorkloads(context.Context, *connect.Request[v1.GetForecastWorkloadsRequest]) (*connect.Response[v1.GetForecastWorkloadsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetForecastWorkloads is not implemented")) } @@ -1252,6 +1494,10 @@ func (UnimplementedK8SServiceHandler) GetResources(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetResources is not implemented")) } +func (UnimplementedK8SServiceHandler) GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetResourceFilterOptions is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetPods is not implemented")) } @@ -1320,6 +1566,10 @@ func (UnimplementedK8SServiceHandler) ListTags(context.Context, *connect.Request return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.ListTags is not implemented")) } +func (UnimplementedK8SServiceHandler) GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetMigPartedConfig is not implemented")) +} + // ClusterMutationServiceClient is a client for the api.v1.ClusterMutationService service. type ClusterMutationServiceClient interface { // CreateCluster creates a new cluster. diff --git a/internal/gen/api/v1/apiv1connect/profiling.connect.go b/internal/gen/api/v1/apiv1connect/profiling.connect.go index a8a4868..7bf5a1c 100644 --- a/internal/gen/api/v1/apiv1connect/profiling.connect.go +++ b/internal/gen/api/v1/apiv1connect/profiling.connect.go @@ -36,11 +36,19 @@ const ( // ProfilingServiceGetWorkloadProfilesProcedure is the fully-qualified name of the // ProfilingService's GetWorkloadProfiles RPC. ProfilingServiceGetWorkloadProfilesProcedure = "/api.v1.ProfilingService/GetWorkloadProfiles" + // ProfilingServiceGetWorkloadProfileAvailabilityProcedure is the fully-qualified name of the + // ProfilingService's GetWorkloadProfileAvailability RPC. + ProfilingServiceGetWorkloadProfileAvailabilityProcedure = "/api.v1.ProfilingService/GetWorkloadProfileAvailability" ) // ProfilingServiceClient is a client for the api.v1.ProfilingService service. type ProfilingServiceClient interface { GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) } // NewProfilingServiceClient constructs a client for the api.v1.ProfilingService service. By @@ -58,12 +66,18 @@ func NewProfilingServiceClient(httpClient connect.HTTPClient, baseURL string, op baseURL+ProfilingServiceGetWorkloadProfilesProcedure, opts..., ), + getWorkloadProfileAvailability: connect.NewClient[v1.GetWorkloadProfileAvailabilityRequest, v1.GetWorkloadProfileAvailabilityResponse]( + httpClient, + baseURL+ProfilingServiceGetWorkloadProfileAvailabilityProcedure, + opts..., + ), } } // profilingServiceClient implements ProfilingServiceClient. type profilingServiceClient struct { - getWorkloadProfiles *connect.Client[v1.GetWorkloadProfilesRequest, v1.GetWorkloadProfilesResponse] + getWorkloadProfiles *connect.Client[v1.GetWorkloadProfilesRequest, v1.GetWorkloadProfilesResponse] + getWorkloadProfileAvailability *connect.Client[v1.GetWorkloadProfileAvailabilityRequest, v1.GetWorkloadProfileAvailabilityResponse] } // GetWorkloadProfiles calls api.v1.ProfilingService.GetWorkloadProfiles. @@ -71,9 +85,19 @@ func (c *profilingServiceClient) GetWorkloadProfiles(ctx context.Context, req *c return c.getWorkloadProfiles.CallUnary(ctx, req) } +// GetWorkloadProfileAvailability calls api.v1.ProfilingService.GetWorkloadProfileAvailability. +func (c *profilingServiceClient) GetWorkloadProfileAvailability(ctx context.Context, req *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) { + return c.getWorkloadProfileAvailability.CallUnary(ctx, req) +} + // ProfilingServiceHandler is an implementation of the api.v1.ProfilingService service. type ProfilingServiceHandler interface { GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) } // NewProfilingServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -87,10 +111,17 @@ func NewProfilingServiceHandler(svc ProfilingServiceHandler, opts ...connect.Han svc.GetWorkloadProfiles, opts..., ) + profilingServiceGetWorkloadProfileAvailabilityHandler := connect.NewUnaryHandler( + ProfilingServiceGetWorkloadProfileAvailabilityProcedure, + svc.GetWorkloadProfileAvailability, + opts..., + ) return "/api.v1.ProfilingService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case ProfilingServiceGetWorkloadProfilesProcedure: profilingServiceGetWorkloadProfilesHandler.ServeHTTP(w, r) + case ProfilingServiceGetWorkloadProfileAvailabilityProcedure: + profilingServiceGetWorkloadProfileAvailabilityHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -103,3 +134,7 @@ type UnimplementedProfilingServiceHandler struct{} func (UnimplementedProfilingServiceHandler) GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.ProfilingService.GetWorkloadProfiles is not implemented")) } + +func (UnimplementedProfilingServiceHandler) GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.ProfilingService.GetWorkloadProfileAvailability is not implemented")) +} diff --git a/internal/gen/api/v1/apiv1connect/recommendation.connect.go b/internal/gen/api/v1/apiv1connect/recommendation.connect.go index 79a55df..38d1198 100644 --- a/internal/gen/api/v1/apiv1connect/recommendation.connect.go +++ b/internal/gen/api/v1/apiv1connect/recommendation.connect.go @@ -203,21 +203,66 @@ const ( // K8SRecommendationServiceSuggestedKarpenterConfigProcedure is the fully-qualified name of the // K8sRecommendationService's SuggestedKarpenterConfig RPC. K8SRecommendationServiceSuggestedKarpenterConfigProcedure = "/api.v1.K8sRecommendationService/SuggestedKarpenterConfig" + // K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure is the fully-qualified name of the + // K8sRecommendationService's SuggestNodePolicyImprovements RPC. + K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure = "/api.v1.K8sRecommendationService/SuggestNodePolicyImprovements" + // K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListClusterNodePolicySuggestions RPC. + K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure = "/api.v1.K8sRecommendationService/ListClusterNodePolicySuggestions" // K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure is the fully-qualified name of // the K8sRecommendationService's GenerateNodePoliciesFromKarpenter RPC. K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure = "/api.v1.K8sRecommendationService/GenerateNodePoliciesFromKarpenter" // K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure is the fully-qualified name // of the K8sRecommendationService's GenerateNodePoliciesFromNodeGroups RPC. K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure = "/api.v1.K8sRecommendationService/GenerateNodePoliciesFromNodeGroups" + // K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure is the fully-qualified name of the + // K8sRecommendationService's GetNodeGroupsCheckpointStatus RPC. + K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure = "/api.v1.K8sRecommendationService/GetNodeGroupsCheckpointStatus" + // K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure is the fully-qualified name of the + // K8sRecommendationService's SetNodePolicyCheckpointLabel RPC. + K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure = "/api.v1.K8sRecommendationService/SetNodePolicyCheckpointLabel" + // K8SRecommendationServiceEnableCheckpointForPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's EnableCheckpointForPolicy RPC. + K8SRecommendationServiceEnableCheckpointForPolicyProcedure = "/api.v1.K8sRecommendationService/EnableCheckpointForPolicy" + // K8SRecommendationServiceGetCheckpointApplyStatusProcedure is the fully-qualified name of the + // K8sRecommendationService's GetCheckpointApplyStatus RPC. + K8SRecommendationServiceGetCheckpointApplyStatusProcedure = "/api.v1.K8sRecommendationService/GetCheckpointApplyStatus" + // K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure is the fully-qualified name of + // the K8sRecommendationService's GetClusterCheckpointLabelCoverage RPC. + K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure = "/api.v1.K8sRecommendationService/GetClusterCheckpointLabelCoverage" + // K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure is the fully-qualified name of + // the K8sRecommendationService's ListNodeGroupCheckpointLabelState RPC. + K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure = "/api.v1.K8sRecommendationService/ListNodeGroupCheckpointLabelState" // K8SRecommendationServiceGetNodeAnnotationReadinessProcedure is the fully-qualified name of the // K8sRecommendationService's GetNodeAnnotationReadiness RPC. K8SRecommendationServiceGetNodeAnnotationReadinessProcedure = "/api.v1.K8sRecommendationService/GetNodeAnnotationReadiness" + // K8SRecommendationServiceDetectClusterAutoscalerProcedure is the fully-qualified name of the + // K8sRecommendationService's DetectClusterAutoscaler RPC. + K8SRecommendationServiceDetectClusterAutoscalerProcedure = "/api.v1.K8sRecommendationService/DetectClusterAutoscaler" // K8SRecommendationServiceGetMigrationStateProcedure is the fully-qualified name of the // K8sRecommendationService's GetMigrationState RPC. K8SRecommendationServiceGetMigrationStateProcedure = "/api.v1.K8sRecommendationService/GetMigrationState" // K8SRecommendationServiceUpdateMigrationStateProcedure is the fully-qualified name of the // K8sRecommendationService's UpdateMigrationState RPC. K8SRecommendationServiceUpdateMigrationStateProcedure = "/api.v1.K8sRecommendationService/UpdateMigrationState" + // K8SRecommendationServiceGetKarpenterMigrationStateProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterMigrationState RPC. + K8SRecommendationServiceGetKarpenterMigrationStateProcedure = "/api.v1.K8sRecommendationService/GetKarpenterMigrationState" + // K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateKarpenterMigrationState RPC. + K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure = "/api.v1.K8sRecommendationService/UpdateKarpenterMigrationState" + // K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure is the fully-qualified name of + // the K8sRecommendationService's DetectKarpenterOwnershipConflicts RPC. + K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure = "/api.v1.K8sRecommendationService/DetectKarpenterOwnershipConflicts" + // K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure is the fully-qualified + // name of the K8sRecommendationService's AcknowledgeKarpenterOwnershipConflict RPC. + K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure = "/api.v1.K8sRecommendationService/AcknowledgeKarpenterOwnershipConflict" + // K8SRecommendationServiceGetKarpenterSourceResourcesProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterSourceResources RPC. + K8SRecommendationServiceGetKarpenterSourceResourcesProcedure = "/api.v1.K8sRecommendationService/GetKarpenterSourceResources" + // K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterAdoptionStatus RPC. + K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure = "/api.v1.K8sRecommendationService/GetKarpenterAdoptionStatus" // K8SRecommendationServiceReportNodePoolValidationProcedure is the fully-qualified name of the // K8sRecommendationService's ReportNodePoolValidation RPC. K8SRecommendationServiceReportNodePoolValidationProcedure = "/api.v1.K8sRecommendationService/ReportNodePoolValidation" @@ -245,6 +290,9 @@ const ( // K8SRecommendationServiceGetInstanceCategoriesProcedure is the fully-qualified name of the // K8sRecommendationService's GetInstanceCategories RPC. K8SRecommendationServiceGetInstanceCategoriesProcedure = "/api.v1.K8sRecommendationService/GetInstanceCategories" + // K8SRecommendationServiceGetInstanceShapesProcedure is the fully-qualified name of the + // K8sRecommendationService's GetInstanceShapes RPC. + K8SRecommendationServiceGetInstanceShapesProcedure = "/api.v1.K8sRecommendationService/GetInstanceShapes" // K8SRecommendationServiceGetInstanceCPUsProcedure is the fully-qualified name of the // K8sRecommendationService's GetInstanceCPUs RPC. K8SRecommendationServiceGetInstanceCPUsProcedure = "/api.v1.K8sRecommendationService/GetInstanceCPUs" @@ -263,6 +311,9 @@ const ( // K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure is the fully-qualified name of // the K8sRecommendationService's GetPDBRecommendationForWorkload RPC. K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure = "/api.v1.K8sRecommendationService/GetPDBRecommendationForWorkload" + // K8SRecommendationServiceListWorkloadStructuralHealthProcedure is the fully-qualified name of the + // K8sRecommendationService's ListWorkloadStructuralHealth RPC. + K8SRecommendationServiceListWorkloadStructuralHealthProcedure = "/api.v1.K8sRecommendationService/ListWorkloadStructuralHealth" // K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's CreateStorageRecommendationPolicy RPC. K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure = "/api.v1.K8sRecommendationService/CreateStorageRecommendationPolicy" @@ -326,15 +377,48 @@ const ( // K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure is the fully-qualified name of the // K8sRecommendationService's GetWorkloadOptimizationPolicy RPC. K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/GetWorkloadOptimizationPolicy" + // K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure is the fully-qualified + // name of the K8sRecommendationService's GetWorkloadOptimizationPolicyByWorkload RPC. + K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure = "/api.v1.K8sRecommendationService/GetWorkloadOptimizationPolicyByWorkload" // K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's UpdateWorkloadOptimizationPolicy RPC. K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateWorkloadOptimizationPolicy" + // K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure is the fully-qualified + // name of the K8sRecommendationService's ToggleWorkloadOptimizationPolicyDisabled RPC. + K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleWorkloadOptimizationPolicyDisabled" // K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's DeleteWorkloadOptimizationPolicy RPC. K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteWorkloadOptimizationPolicy" + // K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure is the fully-qualified + // name of the K8sRecommendationService's PreviewWorkloadOptimizationPolicyMatches RPC. + K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewWorkloadOptimizationPolicyMatches" + // K8SRecommendationServiceCreateSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSchedulerPolicy RPC. + K8SRecommendationServiceCreateSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/CreateSchedulerPolicy" + // K8SRecommendationServiceListSchedulerPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSchedulerPolicies RPC. + K8SRecommendationServiceListSchedulerPoliciesProcedure = "/api.v1.K8sRecommendationService/ListSchedulerPolicies" + // K8SRecommendationServiceUpdateSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSchedulerPolicy RPC. + K8SRecommendationServiceUpdateSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateSchedulerPolicy" + // K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure is the fully-qualified name of the + // K8sRecommendationService's ToggleSchedulerPolicyDisabled RPC. + K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleSchedulerPolicyDisabled" + // K8SRecommendationServiceDeleteSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSchedulerPolicy RPC. + K8SRecommendationServiceDeleteSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteSchedulerPolicy" + // K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's PreviewSchedulerPolicyTargets RPC. + K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/PreviewSchedulerPolicyTargets" + // K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListSchedulerPolicyEnrollments RPC. + K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure = "/api.v1.K8sRecommendationService/ListSchedulerPolicyEnrollments" // K8SRecommendationServiceUpsertManualWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's UpsertManualWorkloadRule RPC. K8SRecommendationServiceUpsertManualWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/UpsertManualWorkloadRule" + // K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure is the fully-qualified name of the + // K8sRecommendationService's ToggleWorkloadRuleDisabled RPC. + K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleWorkloadRuleDisabled" // K8SRecommendationServicePreviewWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's PreviewWorkloadRule RPC. K8SRecommendationServicePreviewWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/PreviewWorkloadRule" @@ -356,15 +440,117 @@ const ( // K8SRecommendationServiceDeleteWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's DeleteWorkloadRule RPC. K8SRecommendationServiceDeleteWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/DeleteWorkloadRule" + // K8SRecommendationServiceDeleteAllWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteAllWorkloadRules RPC. + K8SRecommendationServiceDeleteAllWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/DeleteAllWorkloadRules" + // K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's BulkDeleteWorkloadRules RPC. + K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BulkDeleteWorkloadRules" + // K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure is the fully-qualified name of + // the K8sRecommendationService's BulkToggleWorkloadRulesDisabled RPC. + K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure = "/api.v1.K8sRecommendationService/BulkToggleWorkloadRulesDisabled" // K8SRecommendationServiceGetWorkloadContainerNamesProcedure is the fully-qualified name of the // K8sRecommendationService's GetWorkloadContainerNames RPC. K8SRecommendationServiceGetWorkloadContainerNamesProcedure = "/api.v1.K8sRecommendationService/GetWorkloadContainerNames" // K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure is the fully-qualified name of the // K8sRecommendationService's BatchAutoOptimizeWorkloads RPC. K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure = "/api.v1.K8sRecommendationService/BatchAutoOptimizeWorkloads" + // K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure is the fully-qualified name of + // the K8sRecommendationService's BatchUpsertManualWorkloadRules RPC. + K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BatchUpsertManualWorkloadRules" + // K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's BatchPreviewWorkloadRules RPC. + K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BatchPreviewWorkloadRules" + // K8SRecommendationServiceApplyOneTimeOptimizationProcedure is the fully-qualified name of the + // K8sRecommendationService's ApplyOneTimeOptimization RPC. + K8SRecommendationServiceApplyOneTimeOptimizationProcedure = "/api.v1.K8sRecommendationService/ApplyOneTimeOptimization" + // K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure is the fully-qualified name of + // the K8sRecommendationService's DeleteRuleAndApplyRecommendation RPC. + K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure = "/api.v1.K8sRecommendationService/DeleteRuleAndApplyRecommendation" // K8SRecommendationServiceGetNodeRecommendationStatusProcedure is the fully-qualified name of the // K8sRecommendationService's GetNodeRecommendationStatus RPC. K8SRecommendationServiceGetNodeRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetNodeRecommendationStatus" + // K8SRecommendationServiceCreateSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSnapshotPolicies RPC. + K8SRecommendationServiceCreateSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/CreateSnapshotPolicies" + // K8SRecommendationServiceListSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSnapshotPolicies RPC. + K8SRecommendationServiceListSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/ListSnapshotPolicies" + // K8SRecommendationServiceUpdateSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSnapshotPolicy RPC. + K8SRecommendationServiceUpdateSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateSnapshotPolicy" + // K8SRecommendationServiceDeleteSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSnapshotPolicy RPC. + K8SRecommendationServiceDeleteSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteSnapshotPolicy" + // K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSnapshotPolicyTargets RPC. + K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/CreateSnapshotPolicyTargets" + // K8SRecommendationServiceListSnapshotPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSnapshotPolicyTargets RPC. + K8SRecommendationServiceListSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/ListSnapshotPolicyTargets" + // K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSnapshotPolicyTarget RPC. + K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/UpdateSnapshotPolicyTarget" + // K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSnapshotPolicyTarget RPC. + K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/DeleteSnapshotPolicyTarget" + // K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure is the fully-qualified name of + // the K8sRecommendationService's CreateForensicSnapshotPolicies RPC. + K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/CreateForensicSnapshotPolicies" + // K8SRecommendationServiceListForensicSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListForensicSnapshotPolicies RPC. + K8SRecommendationServiceListForensicSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/ListForensicSnapshotPolicies" + // K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateForensicSnapshotPolicy RPC. + K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateForensicSnapshotPolicy" + // K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteForensicSnapshotPolicy RPC. + K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteForensicSnapshotPolicy" + // K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure is the fully-qualified name + // of the K8sRecommendationService's CreateForensicSnapshotPolicyTargets RPC. + K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/CreateForensicSnapshotPolicyTargets" + // K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListForensicSnapshotPolicyTargets RPC. + K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/ListForensicSnapshotPolicyTargets" + // K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure is the fully-qualified name + // of the K8sRecommendationService's UpdateForensicSnapshotPolicyTarget RPC. + K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/UpdateForensicSnapshotPolicyTarget" + // K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure is the fully-qualified name + // of the K8sRecommendationService's DeleteForensicSnapshotPolicyTarget RPC. + K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/DeleteForensicSnapshotPolicyTarget" + // K8SRecommendationServiceTriggerForensicSnapshotRunProcedure is the fully-qualified name of the + // K8sRecommendationService's TriggerForensicSnapshotRun RPC. + K8SRecommendationServiceTriggerForensicSnapshotRunProcedure = "/api.v1.K8sRecommendationService/TriggerForensicSnapshotRun" + // K8SRecommendationServiceListReferencedAuthenticationsProcedure is the fully-qualified name of the + // K8sRecommendationService's ListReferencedAuthentications RPC. + K8SRecommendationServiceListReferencedAuthenticationsProcedure = "/api.v1.K8sRecommendationService/ListReferencedAuthentications" + // K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure is the fully-qualified name + // of the K8sRecommendationService's PreviewSnapshotPolicyTargetMatches RPC. + K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewSnapshotPolicyTargetMatches" + // K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure is the + // fully-qualified name of the K8sRecommendationService's PreviewForensicSnapshotPolicyTargetMatches + // RPC. + K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewForensicSnapshotPolicyTargetMatches" + // K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure is the fully-qualified name + // of the K8sRecommendationService's GetSnapshotPolicyTargetRenderedScope RPC. + K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure = "/api.v1.K8sRecommendationService/GetSnapshotPolicyTargetRenderedScope" + // K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure is the + // fully-qualified name of the K8sRecommendationService's + // GetForensicSnapshotPolicyTargetRenderedScope RPC. + K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure = "/api.v1.K8sRecommendationService/GetForensicSnapshotPolicyTargetRenderedScope" + // K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure is the fully-qualified name of + // the K8sRecommendationService's GetSnapshotRecommendationStatus RPC. + K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetSnapshotRecommendationStatus" + // K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure is the fully-qualified + // name of the K8sRecommendationService's GetForensicSnapshotRecommendationStatus RPC. + K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetForensicSnapshotRecommendationStatus" + // K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure is the fully-qualified name + // of the K8sRecommendationService's PreviewSnapshotRecommendationConfig RPC. + K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure = "/api.v1.K8sRecommendationService/PreviewSnapshotRecommendationConfig" + // K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure is the + // fully-qualified name of the K8sRecommendationService's + // PreviewForensicSnapshotRecommendationConfig RPC. + K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure = "/api.v1.K8sRecommendationService/PreviewForensicSnapshotRecommendationConfig" ) // K8SRecommendationServiceClient is a client for the api.v1.K8sRecommendationService service. @@ -467,18 +653,84 @@ type K8SRecommendationServiceClient interface { DeleteNodePolicy(context.Context, *connect.Request[v1.DeleteNodePolicyRequest]) (*connect.Response[v1.DeleteNodePolicyResponse], error) SuggestedNodePolicy(context.Context, *connect.Request[v1.SuggestedNodePolicyRequest]) (*connect.Response[v1.SuggestedNodePolicyResponse], error) SuggestedKarpenterConfig(context.Context, *connect.Request[v1.SuggestedKarpenterConfigRequest]) (*connect.Response[v1.SuggestedKarpenterConfigResponse], error) + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) // GenerateNodePoliciesFromNodeGroups generates NodePolicy objects by inspecting // k8s_nodes metadata for clusters without Karpenter/dzkarp. GenerateNodePoliciesFromNodeGroups(context.Context, *connect.Request[v1.GenerateNodePoliciesFromNodeGroupsRequest]) (*connect.Response[v1.GenerateNodePoliciesFromNodeGroupsResponse], error) + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // policy. The FE polls this while a batch is in flight so the toggle CTA can + // render "9/10 labelled, 1 failed". + GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) // Migration wizard state management GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) UpdateMigrationState(context.Context, *connect.Request[v1.UpdateMigrationStateRequest]) (*connect.Response[v1.UpdateMigrationStateResponse], error) + // Karpenter migration wizard + GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) + UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) + DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) + AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) + GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) + GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) // NodePool validation phone-home ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) GetNodePoolValidations(context.Context, *connect.Request[v1.GetNodePoolValidationsRequest]) (*connect.Response[v1.GetNodePoolValidationsResponse], error) @@ -489,6 +741,7 @@ type K8SRecommendationServiceClient interface { GetInstanceFamilies(context.Context, *connect.Request[v1.GetInstanceFamiliesRequest]) (*connect.Response[v1.GetInstanceFamiliesResponse], error) GetInstanceSizes(context.Context, *connect.Request[v1.GetInstanceSizesRequest]) (*connect.Response[v1.GetInstanceSizesResponse], error) GetInstanceCategories(context.Context, *connect.Request[v1.GetInstanceCategoriesRequest]) (*connect.Response[v1.GetInstanceCategoriesResponse], error) + GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) GetInstanceTypeNames(context.Context, *connect.Request[v1.GetInstanceTypeNamesRequest]) (*connect.Response[v1.GetInstanceTypeNamesResponse], error) // PodDisruptionBudget RPCs @@ -497,6 +750,11 @@ type K8SRecommendationServiceClient interface { CreatePodDisruptionBudget(context.Context, *connect.Request[v1.CreatePodDisruptionBudgetRequest]) (*connect.Response[v1.CreatePodDisruptionBudgetResponse], error) // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) GetPDBRecommendationForWorkload(context.Context, *connect.Request[v1.GetPDBRecommendationForWorkloadRequest]) (*connect.Response[v1.GetPDBRecommendationForWorkloadResponse], error) + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) // Storage Recommendation Policies CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) GetStorageRecommendationPolicy(context.Context, *connect.Request[v1.GetStorageRecommendationPolicyRequest]) (*connect.Response[v1.GetStorageRecommendationPolicyResponse], error) @@ -525,10 +783,30 @@ type K8SRecommendationServiceClient interface { CreateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.CreateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.CreateWorkloadOptimizationPolicyResponse], error) ListWorkloadOptimizationPolicies(context.Context, *connect.Request[v1.ListWorkloadOptimizationPoliciesRequest]) (*connect.Response[v1.ListWorkloadOptimizationPoliciesResponse], error) GetWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyResponse], error) + GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) + // The sole way to change an existing policy's disabled state. See message doc. + ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) + // Scheduler Policies: CRUD + targeting preview + CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) + ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) + UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) + ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) + DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) + PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) // MPA V3: Workload Rules (CRUD) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) + // The sole way to change an EXISTING rule's disabled state. See message doc. + ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) GetWorkloadRulesByPolicy(context.Context, *connect.Request[v1.GetWorkloadRulesByPolicyRequest]) (*connect.Response[v1.GetWorkloadRulesByPolicyResponse], error) ListWorkloadRules(context.Context, *connect.Request[v1.ListWorkloadRulesRequest]) (*connect.Response[v1.ListWorkloadRulesResponse], error) @@ -536,10 +814,58 @@ type K8SRecommendationServiceClient interface { GetWorkloadRuleByWorkload(context.Context, *connect.Request[v1.GetWorkloadRuleByWorkloadRequest]) (*connect.Response[v1.GetWorkloadRuleByWorkloadResponse], error) GetWorkloadByWorkloadRule(context.Context, *connect.Request[v1.GetWorkloadByWorkloadRuleRequest]) (*connect.Response[v1.GetWorkloadByWorkloadRuleResponse], error) DeleteWorkloadRule(context.Context, *connect.Request[v1.DeleteWorkloadRuleRequest]) (*connect.Response[v1.DeleteWorkloadRuleResponse], error) + DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) + BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) + BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) BatchAutoOptimizeWorkloads(context.Context, *connect.Request[v1.BatchAutoOptimizeWorkloadsRequest]) (*connect.Response[v1.BatchAutoOptimizeWorkloadsResponse], error) + BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) + BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) + ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) // Get current node pool config status and recent apply history for a cluster GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) + // ---- Snapshot policies (resilience) — spec §5 ---- + CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) + ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) + UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) + DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) + CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) + ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) + UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) + DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) + ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) + UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) + DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) + CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) + ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) + UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) + DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) + // Arms a forensic capture run: the ONLY way run_generation moves. + TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) + // ---- Targeting preview + read model + delivery status ---- + PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) + PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) + GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) + GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) + GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) + GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) + PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) } // NewK8SRecommendationServiceClient constructs a client for the api.v1.K8sRecommendationService @@ -832,6 +1158,16 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceSuggestedKarpenterConfigProcedure, opts..., ), + suggestNodePolicyImprovements: connect.NewClient[v1.SuggestNodePolicyImprovementsRequest, v1.SuggestNodePolicyImprovementsResponse]( + httpClient, + baseURL+K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure, + opts..., + ), + listClusterNodePolicySuggestions: connect.NewClient[v1.ListClusterNodePolicySuggestionsRequest, v1.ListClusterNodePolicySuggestionsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure, + opts..., + ), generateNodePoliciesFromKarpenter: connect.NewClient[v1.GenerateNodePoliciesFromKarpenterRequest, v1.GenerateNodePoliciesFromKarpenterResponse]( httpClient, baseURL+K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure, @@ -842,11 +1178,46 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure, opts..., ), + getNodeGroupsCheckpointStatus: connect.NewClient[v1.GetNodeGroupsCheckpointStatusRequest, v1.GetNodeGroupsCheckpointStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure, + opts..., + ), + setNodePolicyCheckpointLabel: connect.NewClient[v1.SetNodePolicyCheckpointLabelRequest, v1.SetNodePolicyCheckpointLabelResponse]( + httpClient, + baseURL+K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure, + opts..., + ), + enableCheckpointForPolicy: connect.NewClient[v1.EnableCheckpointForPolicyRequest, v1.EnableCheckpointForPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceEnableCheckpointForPolicyProcedure, + opts..., + ), + getCheckpointApplyStatus: connect.NewClient[v1.GetCheckpointApplyStatusRequest, v1.GetCheckpointApplyStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetCheckpointApplyStatusProcedure, + opts..., + ), + getClusterCheckpointLabelCoverage: connect.NewClient[v1.GetClusterCheckpointLabelCoverageRequest, v1.GetClusterCheckpointLabelCoverageResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure, + opts..., + ), + listNodeGroupCheckpointLabelState: connect.NewClient[v1.ListNodeGroupCheckpointLabelStateRequest, v1.ListNodeGroupCheckpointLabelStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure, + opts..., + ), getNodeAnnotationReadiness: connect.NewClient[v1.GetNodeAnnotationReadinessRequest, v1.GetNodeAnnotationReadinessResponse]( httpClient, baseURL+K8SRecommendationServiceGetNodeAnnotationReadinessProcedure, opts..., ), + detectClusterAutoscaler: connect.NewClient[v1.DetectClusterAutoscalerRequest, v1.DetectClusterAutoscalerResponse]( + httpClient, + baseURL+K8SRecommendationServiceDetectClusterAutoscalerProcedure, + opts..., + ), getMigrationState: connect.NewClient[v1.GetMigrationStateRequest, v1.GetMigrationStateResponse]( httpClient, baseURL+K8SRecommendationServiceGetMigrationStateProcedure, @@ -857,6 +1228,36 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceUpdateMigrationStateProcedure, opts..., ), + getKarpenterMigrationState: connect.NewClient[v1.GetKarpenterMigrationStateRequest, v1.GetKarpenterMigrationStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterMigrationStateProcedure, + opts..., + ), + updateKarpenterMigrationState: connect.NewClient[v1.UpdateKarpenterMigrationStateRequest, v1.UpdateKarpenterMigrationStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure, + opts..., + ), + detectKarpenterOwnershipConflicts: connect.NewClient[v1.DetectKarpenterOwnershipConflictsRequest, v1.DetectKarpenterOwnershipConflictsResponse]( + httpClient, + baseURL+K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure, + opts..., + ), + acknowledgeKarpenterOwnershipConflict: connect.NewClient[v1.AcknowledgeKarpenterOwnershipConflictRequest, v1.AcknowledgeKarpenterOwnershipConflictResponse]( + httpClient, + baseURL+K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure, + opts..., + ), + getKarpenterSourceResources: connect.NewClient[v1.GetKarpenterSourceResourcesRequest, v1.GetKarpenterSourceResourcesResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterSourceResourcesProcedure, + opts..., + ), + getKarpenterAdoptionStatus: connect.NewClient[v1.GetKarpenterAdoptionStatusRequest, v1.GetKarpenterAdoptionStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure, + opts..., + ), reportNodePoolValidation: connect.NewClient[v1.ReportNodePoolValidationRequest, v1.ReportNodePoolValidationResponse]( httpClient, baseURL+K8SRecommendationServiceReportNodePoolValidationProcedure, @@ -902,6 +1303,11 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetInstanceCategoriesProcedure, opts..., ), + getInstanceShapes: connect.NewClient[v1.GetInstanceShapesRequest, v1.GetInstanceShapesResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetInstanceShapesProcedure, + opts..., + ), getInstanceCPUs: connect.NewClient[v1.GetInstanceCPUsRequest, v1.GetInstanceCPUsResponse]( httpClient, baseURL+K8SRecommendationServiceGetInstanceCPUsProcedure, @@ -932,6 +1338,11 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure, opts..., ), + listWorkloadStructuralHealth: connect.NewClient[v1.ListWorkloadStructuralHealthRequest, v1.ListWorkloadStructuralHealthResponse]( + httpClient, + baseURL+K8SRecommendationServiceListWorkloadStructuralHealthProcedure, + opts..., + ), createStorageRecommendationPolicy: connect.NewClient[v1.CreateStorageRecommendationPolicyRequest, v1.CreateStorageRecommendationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure, @@ -1037,21 +1448,76 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure, opts..., ), + getWorkloadOptimizationPolicyByWorkload: connect.NewClient[v1.GetWorkloadOptimizationPolicyByWorkloadRequest, v1.GetWorkloadOptimizationPolicyByWorkloadResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure, + opts..., + ), updateWorkloadOptimizationPolicy: connect.NewClient[v1.UpdateWorkloadOptimizationPolicyRequest, v1.UpdateWorkloadOptimizationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure, opts..., ), + toggleWorkloadOptimizationPolicyDisabled: connect.NewClient[v1.ToggleWorkloadOptimizationPolicyDisabledRequest, v1.ToggleWorkloadOptimizationPolicyDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure, + opts..., + ), deleteWorkloadOptimizationPolicy: connect.NewClient[v1.DeleteWorkloadOptimizationPolicyRequest, v1.DeleteWorkloadOptimizationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure, opts..., ), + previewWorkloadOptimizationPolicyMatches: connect.NewClient[v1.PreviewWorkloadOptimizationPolicyMatchesRequest, v1.PreviewWorkloadOptimizationPolicyMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure, + opts..., + ), + createSchedulerPolicy: connect.NewClient[v1.CreateSchedulerPolicyRequest, v1.CreateSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSchedulerPolicyProcedure, + opts..., + ), + listSchedulerPolicies: connect.NewClient[v1.ListSchedulerPoliciesRequest, v1.ListSchedulerPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSchedulerPoliciesProcedure, + opts..., + ), + updateSchedulerPolicy: connect.NewClient[v1.UpdateSchedulerPolicyRequest, v1.UpdateSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSchedulerPolicyProcedure, + opts..., + ), + toggleSchedulerPolicyDisabled: connect.NewClient[v1.ToggleSchedulerPolicyDisabledRequest, v1.ToggleSchedulerPolicyDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure, + opts..., + ), + deleteSchedulerPolicy: connect.NewClient[v1.DeleteSchedulerPolicyRequest, v1.DeleteSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSchedulerPolicyProcedure, + opts..., + ), + previewSchedulerPolicyTargets: connect.NewClient[v1.PreviewSchedulerPolicyTargetsRequest, v1.PreviewSchedulerPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure, + opts..., + ), + listSchedulerPolicyEnrollments: connect.NewClient[v1.ListSchedulerPolicyEnrollmentsRequest, v1.ListSchedulerPolicyEnrollmentsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure, + opts..., + ), upsertManualWorkloadRule: connect.NewClient[v1.UpsertManualWorkloadRuleRequest, v1.UpsertManualWorkloadRuleResponse]( httpClient, baseURL+K8SRecommendationServiceUpsertManualWorkloadRuleProcedure, opts..., ), + toggleWorkloadRuleDisabled: connect.NewClient[v1.ToggleWorkloadRuleDisabledRequest, v1.ToggleWorkloadRuleDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure, + opts..., + ), previewWorkloadRule: connect.NewClient[v1.PreviewWorkloadRuleRequest, v1.PreviewWorkloadRuleResponse]( httpClient, baseURL+K8SRecommendationServicePreviewWorkloadRuleProcedure, @@ -1087,6 +1553,21 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceDeleteWorkloadRuleProcedure, opts..., ), + deleteAllWorkloadRules: connect.NewClient[v1.DeleteAllWorkloadRulesRequest, v1.DeleteAllWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteAllWorkloadRulesProcedure, + opts..., + ), + bulkDeleteWorkloadRules: connect.NewClient[v1.BulkDeleteWorkloadRulesRequest, v1.BulkDeleteWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure, + opts..., + ), + bulkToggleWorkloadRulesDisabled: connect.NewClient[v1.BulkToggleWorkloadRulesDisabledRequest, v1.BulkToggleWorkloadRulesDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure, + opts..., + ), getWorkloadContainerNames: connect.NewClient[v1.GetWorkloadContainerNamesRequest, v1.GetWorkloadContainerNamesResponse]( httpClient, baseURL+K8SRecommendationServiceGetWorkloadContainerNamesProcedure, @@ -1097,11 +1578,161 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure, opts..., ), + batchUpsertManualWorkloadRules: connect.NewClient[v1.BatchUpsertManualWorkloadRulesRequest, v1.BatchUpsertManualWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure, + opts..., + ), + batchPreviewWorkloadRules: connect.NewClient[v1.BatchPreviewWorkloadRulesRequest, v1.BatchPreviewWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure, + opts..., + ), + applyOneTimeOptimization: connect.NewClient[v1.ApplyOneTimeOptimizationRequest, v1.ApplyOneTimeOptimizationResponse]( + httpClient, + baseURL+K8SRecommendationServiceApplyOneTimeOptimizationProcedure, + opts..., + ), + deleteRuleAndApplyRecommendation: connect.NewClient[v1.DeleteRuleAndApplyRecommendationRequest, v1.DeleteRuleAndApplyRecommendationResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure, + opts..., + ), getNodeRecommendationStatus: connect.NewClient[v1.GetNodeRecommendationStatusRequest, v1.GetNodeRecommendationStatusResponse]( httpClient, baseURL+K8SRecommendationServiceGetNodeRecommendationStatusProcedure, opts..., ), + createSnapshotPolicies: connect.NewClient[v1.CreateSnapshotPoliciesRequest, v1.CreateSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSnapshotPoliciesProcedure, + opts..., + ), + listSnapshotPolicies: connect.NewClient[v1.ListSnapshotPoliciesRequest, v1.ListSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSnapshotPoliciesProcedure, + opts..., + ), + updateSnapshotPolicy: connect.NewClient[v1.UpdateSnapshotPolicyRequest, v1.UpdateSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSnapshotPolicyProcedure, + opts..., + ), + deleteSnapshotPolicy: connect.NewClient[v1.DeleteSnapshotPolicyRequest, v1.DeleteSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSnapshotPolicyProcedure, + opts..., + ), + createSnapshotPolicyTargets: connect.NewClient[v1.CreateSnapshotPolicyTargetsRequest, v1.CreateSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure, + opts..., + ), + listSnapshotPolicyTargets: connect.NewClient[v1.ListSnapshotPolicyTargetsRequest, v1.ListSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSnapshotPolicyTargetsProcedure, + opts..., + ), + updateSnapshotPolicyTarget: connect.NewClient[v1.UpdateSnapshotPolicyTargetRequest, v1.UpdateSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure, + opts..., + ), + deleteSnapshotPolicyTarget: connect.NewClient[v1.DeleteSnapshotPolicyTargetRequest, v1.DeleteSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure, + opts..., + ), + createForensicSnapshotPolicies: connect.NewClient[v1.CreateForensicSnapshotPoliciesRequest, v1.CreateForensicSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure, + opts..., + ), + listForensicSnapshotPolicies: connect.NewClient[v1.ListForensicSnapshotPoliciesRequest, v1.ListForensicSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListForensicSnapshotPoliciesProcedure, + opts..., + ), + updateForensicSnapshotPolicy: connect.NewClient[v1.UpdateForensicSnapshotPolicyRequest, v1.UpdateForensicSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure, + opts..., + ), + deleteForensicSnapshotPolicy: connect.NewClient[v1.DeleteForensicSnapshotPolicyRequest, v1.DeleteForensicSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure, + opts..., + ), + createForensicSnapshotPolicyTargets: connect.NewClient[v1.CreateForensicSnapshotPolicyTargetsRequest, v1.CreateForensicSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure, + opts..., + ), + listForensicSnapshotPolicyTargets: connect.NewClient[v1.ListForensicSnapshotPolicyTargetsRequest, v1.ListForensicSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure, + opts..., + ), + updateForensicSnapshotPolicyTarget: connect.NewClient[v1.UpdateForensicSnapshotPolicyTargetRequest, v1.UpdateForensicSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure, + opts..., + ), + deleteForensicSnapshotPolicyTarget: connect.NewClient[v1.DeleteForensicSnapshotPolicyTargetRequest, v1.DeleteForensicSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure, + opts..., + ), + triggerForensicSnapshotRun: connect.NewClient[v1.TriggerForensicSnapshotRunRequest, v1.TriggerForensicSnapshotRunResponse]( + httpClient, + baseURL+K8SRecommendationServiceTriggerForensicSnapshotRunProcedure, + opts..., + ), + listReferencedAuthentications: connect.NewClient[v1.ListReferencedAuthenticationsRequest, v1.ListReferencedAuthenticationsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListReferencedAuthenticationsProcedure, + opts..., + ), + previewSnapshotPolicyTargetMatches: connect.NewClient[v1.PreviewSnapshotPolicyTargetMatchesRequest, v1.PreviewSnapshotPolicyTargetMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure, + opts..., + ), + previewForensicSnapshotPolicyTargetMatches: connect.NewClient[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest, v1.PreviewForensicSnapshotPolicyTargetMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure, + opts..., + ), + getSnapshotPolicyTargetRenderedScope: connect.NewClient[v1.GetSnapshotPolicyTargetRenderedScopeRequest, v1.GetSnapshotPolicyTargetRenderedScopeResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure, + opts..., + ), + getForensicSnapshotPolicyTargetRenderedScope: connect.NewClient[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest, v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure, + opts..., + ), + getSnapshotRecommendationStatus: connect.NewClient[v1.GetSnapshotRecommendationStatusRequest, v1.GetSnapshotRecommendationStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure, + opts..., + ), + getForensicSnapshotRecommendationStatus: connect.NewClient[v1.GetForensicSnapshotRecommendationStatusRequest, v1.GetForensicSnapshotRecommendationStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure, + opts..., + ), + previewSnapshotRecommendationConfig: connect.NewClient[v1.PreviewSnapshotRecommendationConfigRequest, v1.PreviewSnapshotRecommendationConfigResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure, + opts..., + ), + previewForensicSnapshotRecommendationConfig: connect.NewClient[v1.PreviewForensicSnapshotRecommendationConfigRequest, v1.PreviewForensicSnapshotRecommendationConfigResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure, + opts..., + ), } } @@ -1163,11 +1794,26 @@ type k8SRecommendationServiceClient struct { deleteNodePolicy *connect.Client[v1.DeleteNodePolicyRequest, v1.DeleteNodePolicyResponse] suggestedNodePolicy *connect.Client[v1.SuggestedNodePolicyRequest, v1.SuggestedNodePolicyResponse] suggestedKarpenterConfig *connect.Client[v1.SuggestedKarpenterConfigRequest, v1.SuggestedKarpenterConfigResponse] + suggestNodePolicyImprovements *connect.Client[v1.SuggestNodePolicyImprovementsRequest, v1.SuggestNodePolicyImprovementsResponse] + listClusterNodePolicySuggestions *connect.Client[v1.ListClusterNodePolicySuggestionsRequest, v1.ListClusterNodePolicySuggestionsResponse] generateNodePoliciesFromKarpenter *connect.Client[v1.GenerateNodePoliciesFromKarpenterRequest, v1.GenerateNodePoliciesFromKarpenterResponse] generateNodePoliciesFromNodeGroups *connect.Client[v1.GenerateNodePoliciesFromNodeGroupsRequest, v1.GenerateNodePoliciesFromNodeGroupsResponse] + getNodeGroupsCheckpointStatus *connect.Client[v1.GetNodeGroupsCheckpointStatusRequest, v1.GetNodeGroupsCheckpointStatusResponse] + setNodePolicyCheckpointLabel *connect.Client[v1.SetNodePolicyCheckpointLabelRequest, v1.SetNodePolicyCheckpointLabelResponse] + enableCheckpointForPolicy *connect.Client[v1.EnableCheckpointForPolicyRequest, v1.EnableCheckpointForPolicyResponse] + getCheckpointApplyStatus *connect.Client[v1.GetCheckpointApplyStatusRequest, v1.GetCheckpointApplyStatusResponse] + getClusterCheckpointLabelCoverage *connect.Client[v1.GetClusterCheckpointLabelCoverageRequest, v1.GetClusterCheckpointLabelCoverageResponse] + listNodeGroupCheckpointLabelState *connect.Client[v1.ListNodeGroupCheckpointLabelStateRequest, v1.ListNodeGroupCheckpointLabelStateResponse] getNodeAnnotationReadiness *connect.Client[v1.GetNodeAnnotationReadinessRequest, v1.GetNodeAnnotationReadinessResponse] + detectClusterAutoscaler *connect.Client[v1.DetectClusterAutoscalerRequest, v1.DetectClusterAutoscalerResponse] getMigrationState *connect.Client[v1.GetMigrationStateRequest, v1.GetMigrationStateResponse] updateMigrationState *connect.Client[v1.UpdateMigrationStateRequest, v1.UpdateMigrationStateResponse] + getKarpenterMigrationState *connect.Client[v1.GetKarpenterMigrationStateRequest, v1.GetKarpenterMigrationStateResponse] + updateKarpenterMigrationState *connect.Client[v1.UpdateKarpenterMigrationStateRequest, v1.UpdateKarpenterMigrationStateResponse] + detectKarpenterOwnershipConflicts *connect.Client[v1.DetectKarpenterOwnershipConflictsRequest, v1.DetectKarpenterOwnershipConflictsResponse] + acknowledgeKarpenterOwnershipConflict *connect.Client[v1.AcknowledgeKarpenterOwnershipConflictRequest, v1.AcknowledgeKarpenterOwnershipConflictResponse] + getKarpenterSourceResources *connect.Client[v1.GetKarpenterSourceResourcesRequest, v1.GetKarpenterSourceResourcesResponse] + getKarpenterAdoptionStatus *connect.Client[v1.GetKarpenterAdoptionStatusRequest, v1.GetKarpenterAdoptionStatusResponse] reportNodePoolValidation *connect.Client[v1.ReportNodePoolValidationRequest, v1.ReportNodePoolValidationResponse] getNodePoolValidations *connect.Client[v1.GetNodePoolValidationsRequest, v1.GetNodePoolValidationsResponse] createNodePolicyTargets *connect.Client[v1.CreateNodePolicyTargetsRequest, v1.CreateNodePolicyTargetsResponse] @@ -1177,12 +1823,14 @@ type k8SRecommendationServiceClient struct { getInstanceFamilies *connect.Client[v1.GetInstanceFamiliesRequest, v1.GetInstanceFamiliesResponse] getInstanceSizes *connect.Client[v1.GetInstanceSizesRequest, v1.GetInstanceSizesResponse] getInstanceCategories *connect.Client[v1.GetInstanceCategoriesRequest, v1.GetInstanceCategoriesResponse] + getInstanceShapes *connect.Client[v1.GetInstanceShapesRequest, v1.GetInstanceShapesResponse] getInstanceCPUs *connect.Client[v1.GetInstanceCPUsRequest, v1.GetInstanceCPUsResponse] getInstanceTypeNames *connect.Client[v1.GetInstanceTypeNamesRequest, v1.GetInstanceTypeNamesResponse] generatePodDisruptionBudget *connect.Client[v1.GeneratePodDisruptionBudgetRequest, v1.GeneratePodDisruptionBudgetResponse] generateAndCreatePodDisruptionBudget *connect.Client[v1.GenerateAndCreatePodDisruptionBudgetRequest, v1.GenerateAndCreatePodDisruptionBudgetResponse] createPodDisruptionBudget *connect.Client[v1.CreatePodDisruptionBudgetRequest, v1.CreatePodDisruptionBudgetResponse] getPDBRecommendationForWorkload *connect.Client[v1.GetPDBRecommendationForWorkloadRequest, v1.GetPDBRecommendationForWorkloadResponse] + listWorkloadStructuralHealth *connect.Client[v1.ListWorkloadStructuralHealthRequest, v1.ListWorkloadStructuralHealthResponse] createStorageRecommendationPolicy *connect.Client[v1.CreateStorageRecommendationPolicyRequest, v1.CreateStorageRecommendationPolicyResponse] getStorageRecommendationPolicy *connect.Client[v1.GetStorageRecommendationPolicyRequest, v1.GetStorageRecommendationPolicyResponse] listStorageRecommendationPolicies *connect.Client[v1.ListStorageRecommendationPoliciesRequest, v1.ListStorageRecommendationPoliciesResponse] @@ -1204,9 +1852,20 @@ type k8SRecommendationServiceClient struct { createWorkloadOptimizationPolicy *connect.Client[v1.CreateWorkloadOptimizationPolicyRequest, v1.CreateWorkloadOptimizationPolicyResponse] listWorkloadOptimizationPolicies *connect.Client[v1.ListWorkloadOptimizationPoliciesRequest, v1.ListWorkloadOptimizationPoliciesResponse] getWorkloadOptimizationPolicy *connect.Client[v1.GetWorkloadOptimizationPolicyRequest, v1.GetWorkloadOptimizationPolicyResponse] + getWorkloadOptimizationPolicyByWorkload *connect.Client[v1.GetWorkloadOptimizationPolicyByWorkloadRequest, v1.GetWorkloadOptimizationPolicyByWorkloadResponse] updateWorkloadOptimizationPolicy *connect.Client[v1.UpdateWorkloadOptimizationPolicyRequest, v1.UpdateWorkloadOptimizationPolicyResponse] + toggleWorkloadOptimizationPolicyDisabled *connect.Client[v1.ToggleWorkloadOptimizationPolicyDisabledRequest, v1.ToggleWorkloadOptimizationPolicyDisabledResponse] deleteWorkloadOptimizationPolicy *connect.Client[v1.DeleteWorkloadOptimizationPolicyRequest, v1.DeleteWorkloadOptimizationPolicyResponse] + previewWorkloadOptimizationPolicyMatches *connect.Client[v1.PreviewWorkloadOptimizationPolicyMatchesRequest, v1.PreviewWorkloadOptimizationPolicyMatchesResponse] + createSchedulerPolicy *connect.Client[v1.CreateSchedulerPolicyRequest, v1.CreateSchedulerPolicyResponse] + listSchedulerPolicies *connect.Client[v1.ListSchedulerPoliciesRequest, v1.ListSchedulerPoliciesResponse] + updateSchedulerPolicy *connect.Client[v1.UpdateSchedulerPolicyRequest, v1.UpdateSchedulerPolicyResponse] + toggleSchedulerPolicyDisabled *connect.Client[v1.ToggleSchedulerPolicyDisabledRequest, v1.ToggleSchedulerPolicyDisabledResponse] + deleteSchedulerPolicy *connect.Client[v1.DeleteSchedulerPolicyRequest, v1.DeleteSchedulerPolicyResponse] + previewSchedulerPolicyTargets *connect.Client[v1.PreviewSchedulerPolicyTargetsRequest, v1.PreviewSchedulerPolicyTargetsResponse] + listSchedulerPolicyEnrollments *connect.Client[v1.ListSchedulerPolicyEnrollmentsRequest, v1.ListSchedulerPolicyEnrollmentsResponse] upsertManualWorkloadRule *connect.Client[v1.UpsertManualWorkloadRuleRequest, v1.UpsertManualWorkloadRuleResponse] + toggleWorkloadRuleDisabled *connect.Client[v1.ToggleWorkloadRuleDisabledRequest, v1.ToggleWorkloadRuleDisabledResponse] previewWorkloadRule *connect.Client[v1.PreviewWorkloadRuleRequest, v1.PreviewWorkloadRuleResponse] getWorkloadRulesByPolicy *connect.Client[v1.GetWorkloadRulesByPolicyRequest, v1.GetWorkloadRulesByPolicyResponse] listWorkloadRules *connect.Client[v1.ListWorkloadRulesRequest, v1.ListWorkloadRulesResponse] @@ -1214,9 +1873,42 @@ type k8SRecommendationServiceClient struct { getWorkloadRuleByWorkload *connect.Client[v1.GetWorkloadRuleByWorkloadRequest, v1.GetWorkloadRuleByWorkloadResponse] getWorkloadByWorkloadRule *connect.Client[v1.GetWorkloadByWorkloadRuleRequest, v1.GetWorkloadByWorkloadRuleResponse] deleteWorkloadRule *connect.Client[v1.DeleteWorkloadRuleRequest, v1.DeleteWorkloadRuleResponse] + deleteAllWorkloadRules *connect.Client[v1.DeleteAllWorkloadRulesRequest, v1.DeleteAllWorkloadRulesResponse] + bulkDeleteWorkloadRules *connect.Client[v1.BulkDeleteWorkloadRulesRequest, v1.BulkDeleteWorkloadRulesResponse] + bulkToggleWorkloadRulesDisabled *connect.Client[v1.BulkToggleWorkloadRulesDisabledRequest, v1.BulkToggleWorkloadRulesDisabledResponse] getWorkloadContainerNames *connect.Client[v1.GetWorkloadContainerNamesRequest, v1.GetWorkloadContainerNamesResponse] batchAutoOptimizeWorkloads *connect.Client[v1.BatchAutoOptimizeWorkloadsRequest, v1.BatchAutoOptimizeWorkloadsResponse] + batchUpsertManualWorkloadRules *connect.Client[v1.BatchUpsertManualWorkloadRulesRequest, v1.BatchUpsertManualWorkloadRulesResponse] + batchPreviewWorkloadRules *connect.Client[v1.BatchPreviewWorkloadRulesRequest, v1.BatchPreviewWorkloadRulesResponse] + applyOneTimeOptimization *connect.Client[v1.ApplyOneTimeOptimizationRequest, v1.ApplyOneTimeOptimizationResponse] + deleteRuleAndApplyRecommendation *connect.Client[v1.DeleteRuleAndApplyRecommendationRequest, v1.DeleteRuleAndApplyRecommendationResponse] getNodeRecommendationStatus *connect.Client[v1.GetNodeRecommendationStatusRequest, v1.GetNodeRecommendationStatusResponse] + createSnapshotPolicies *connect.Client[v1.CreateSnapshotPoliciesRequest, v1.CreateSnapshotPoliciesResponse] + listSnapshotPolicies *connect.Client[v1.ListSnapshotPoliciesRequest, v1.ListSnapshotPoliciesResponse] + updateSnapshotPolicy *connect.Client[v1.UpdateSnapshotPolicyRequest, v1.UpdateSnapshotPolicyResponse] + deleteSnapshotPolicy *connect.Client[v1.DeleteSnapshotPolicyRequest, v1.DeleteSnapshotPolicyResponse] + createSnapshotPolicyTargets *connect.Client[v1.CreateSnapshotPolicyTargetsRequest, v1.CreateSnapshotPolicyTargetsResponse] + listSnapshotPolicyTargets *connect.Client[v1.ListSnapshotPolicyTargetsRequest, v1.ListSnapshotPolicyTargetsResponse] + updateSnapshotPolicyTarget *connect.Client[v1.UpdateSnapshotPolicyTargetRequest, v1.UpdateSnapshotPolicyTargetResponse] + deleteSnapshotPolicyTarget *connect.Client[v1.DeleteSnapshotPolicyTargetRequest, v1.DeleteSnapshotPolicyTargetResponse] + createForensicSnapshotPolicies *connect.Client[v1.CreateForensicSnapshotPoliciesRequest, v1.CreateForensicSnapshotPoliciesResponse] + listForensicSnapshotPolicies *connect.Client[v1.ListForensicSnapshotPoliciesRequest, v1.ListForensicSnapshotPoliciesResponse] + updateForensicSnapshotPolicy *connect.Client[v1.UpdateForensicSnapshotPolicyRequest, v1.UpdateForensicSnapshotPolicyResponse] + deleteForensicSnapshotPolicy *connect.Client[v1.DeleteForensicSnapshotPolicyRequest, v1.DeleteForensicSnapshotPolicyResponse] + createForensicSnapshotPolicyTargets *connect.Client[v1.CreateForensicSnapshotPolicyTargetsRequest, v1.CreateForensicSnapshotPolicyTargetsResponse] + listForensicSnapshotPolicyTargets *connect.Client[v1.ListForensicSnapshotPolicyTargetsRequest, v1.ListForensicSnapshotPolicyTargetsResponse] + updateForensicSnapshotPolicyTarget *connect.Client[v1.UpdateForensicSnapshotPolicyTargetRequest, v1.UpdateForensicSnapshotPolicyTargetResponse] + deleteForensicSnapshotPolicyTarget *connect.Client[v1.DeleteForensicSnapshotPolicyTargetRequest, v1.DeleteForensicSnapshotPolicyTargetResponse] + triggerForensicSnapshotRun *connect.Client[v1.TriggerForensicSnapshotRunRequest, v1.TriggerForensicSnapshotRunResponse] + listReferencedAuthentications *connect.Client[v1.ListReferencedAuthenticationsRequest, v1.ListReferencedAuthenticationsResponse] + previewSnapshotPolicyTargetMatches *connect.Client[v1.PreviewSnapshotPolicyTargetMatchesRequest, v1.PreviewSnapshotPolicyTargetMatchesResponse] + previewForensicSnapshotPolicyTargetMatches *connect.Client[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest, v1.PreviewForensicSnapshotPolicyTargetMatchesResponse] + getSnapshotPolicyTargetRenderedScope *connect.Client[v1.GetSnapshotPolicyTargetRenderedScopeRequest, v1.GetSnapshotPolicyTargetRenderedScopeResponse] + getForensicSnapshotPolicyTargetRenderedScope *connect.Client[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest, v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse] + getSnapshotRecommendationStatus *connect.Client[v1.GetSnapshotRecommendationStatusRequest, v1.GetSnapshotRecommendationStatusResponse] + getForensicSnapshotRecommendationStatus *connect.Client[v1.GetForensicSnapshotRecommendationStatusRequest, v1.GetForensicSnapshotRecommendationStatusResponse] + previewSnapshotRecommendationConfig *connect.Client[v1.PreviewSnapshotRecommendationConfigRequest, v1.PreviewSnapshotRecommendationConfigResponse] + previewForensicSnapshotRecommendationConfig *connect.Client[v1.PreviewForensicSnapshotRecommendationConfigRequest, v1.PreviewForensicSnapshotRecommendationConfigResponse] } // GetNodeGroupStats calls api.v1.K8sRecommendationService.GetNodeGroupStats. @@ -1562,6 +2254,18 @@ func (c *k8SRecommendationServiceClient) SuggestedKarpenterConfig(ctx context.Co return c.suggestedKarpenterConfig.CallUnary(ctx, req) } +// SuggestNodePolicyImprovements calls +// api.v1.K8sRecommendationService.SuggestNodePolicyImprovements. +func (c *k8SRecommendationServiceClient) SuggestNodePolicyImprovements(ctx context.Context, req *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) { + return c.suggestNodePolicyImprovements.CallUnary(ctx, req) +} + +// ListClusterNodePolicySuggestions calls +// api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions. +func (c *k8SRecommendationServiceClient) ListClusterNodePolicySuggestions(ctx context.Context, req *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) { + return c.listClusterNodePolicySuggestions.CallUnary(ctx, req) +} + // GenerateNodePoliciesFromKarpenter calls // api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter. func (c *k8SRecommendationServiceClient) GenerateNodePoliciesFromKarpenter(ctx context.Context, req *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) { @@ -1574,11 +2278,49 @@ func (c *k8SRecommendationServiceClient) GenerateNodePoliciesFromNodeGroups(ctx return c.generateNodePoliciesFromNodeGroups.CallUnary(ctx, req) } +// GetNodeGroupsCheckpointStatus calls +// api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus. +func (c *k8SRecommendationServiceClient) GetNodeGroupsCheckpointStatus(ctx context.Context, req *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) { + return c.getNodeGroupsCheckpointStatus.CallUnary(ctx, req) +} + +// SetNodePolicyCheckpointLabel calls api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel. +func (c *k8SRecommendationServiceClient) SetNodePolicyCheckpointLabel(ctx context.Context, req *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) { + return c.setNodePolicyCheckpointLabel.CallUnary(ctx, req) +} + +// EnableCheckpointForPolicy calls api.v1.K8sRecommendationService.EnableCheckpointForPolicy. +func (c *k8SRecommendationServiceClient) EnableCheckpointForPolicy(ctx context.Context, req *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) { + return c.enableCheckpointForPolicy.CallUnary(ctx, req) +} + +// GetCheckpointApplyStatus calls api.v1.K8sRecommendationService.GetCheckpointApplyStatus. +func (c *k8SRecommendationServiceClient) GetCheckpointApplyStatus(ctx context.Context, req *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) { + return c.getCheckpointApplyStatus.CallUnary(ctx, req) +} + +// GetClusterCheckpointLabelCoverage calls +// api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage. +func (c *k8SRecommendationServiceClient) GetClusterCheckpointLabelCoverage(ctx context.Context, req *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) { + return c.getClusterCheckpointLabelCoverage.CallUnary(ctx, req) +} + +// ListNodeGroupCheckpointLabelState calls +// api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState. +func (c *k8SRecommendationServiceClient) ListNodeGroupCheckpointLabelState(ctx context.Context, req *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) { + return c.listNodeGroupCheckpointLabelState.CallUnary(ctx, req) +} + // GetNodeAnnotationReadiness calls api.v1.K8sRecommendationService.GetNodeAnnotationReadiness. func (c *k8SRecommendationServiceClient) GetNodeAnnotationReadiness(ctx context.Context, req *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) { return c.getNodeAnnotationReadiness.CallUnary(ctx, req) } +// DetectClusterAutoscaler calls api.v1.K8sRecommendationService.DetectClusterAutoscaler. +func (c *k8SRecommendationServiceClient) DetectClusterAutoscaler(ctx context.Context, req *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) { + return c.detectClusterAutoscaler.CallUnary(ctx, req) +} + // GetMigrationState calls api.v1.K8sRecommendationService.GetMigrationState. func (c *k8SRecommendationServiceClient) GetMigrationState(ctx context.Context, req *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) { return c.getMigrationState.CallUnary(ctx, req) @@ -1589,6 +2331,39 @@ func (c *k8SRecommendationServiceClient) UpdateMigrationState(ctx context.Contex return c.updateMigrationState.CallUnary(ctx, req) } +// GetKarpenterMigrationState calls api.v1.K8sRecommendationService.GetKarpenterMigrationState. +func (c *k8SRecommendationServiceClient) GetKarpenterMigrationState(ctx context.Context, req *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) { + return c.getKarpenterMigrationState.CallUnary(ctx, req) +} + +// UpdateKarpenterMigrationState calls +// api.v1.K8sRecommendationService.UpdateKarpenterMigrationState. +func (c *k8SRecommendationServiceClient) UpdateKarpenterMigrationState(ctx context.Context, req *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) { + return c.updateKarpenterMigrationState.CallUnary(ctx, req) +} + +// DetectKarpenterOwnershipConflicts calls +// api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts. +func (c *k8SRecommendationServiceClient) DetectKarpenterOwnershipConflicts(ctx context.Context, req *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) { + return c.detectKarpenterOwnershipConflicts.CallUnary(ctx, req) +} + +// AcknowledgeKarpenterOwnershipConflict calls +// api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict. +func (c *k8SRecommendationServiceClient) AcknowledgeKarpenterOwnershipConflict(ctx context.Context, req *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) { + return c.acknowledgeKarpenterOwnershipConflict.CallUnary(ctx, req) +} + +// GetKarpenterSourceResources calls api.v1.K8sRecommendationService.GetKarpenterSourceResources. +func (c *k8SRecommendationServiceClient) GetKarpenterSourceResources(ctx context.Context, req *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) { + return c.getKarpenterSourceResources.CallUnary(ctx, req) +} + +// GetKarpenterAdoptionStatus calls api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus. +func (c *k8SRecommendationServiceClient) GetKarpenterAdoptionStatus(ctx context.Context, req *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) { + return c.getKarpenterAdoptionStatus.CallUnary(ctx, req) +} + // ReportNodePoolValidation calls api.v1.K8sRecommendationService.ReportNodePoolValidation. func (c *k8SRecommendationServiceClient) ReportNodePoolValidation(ctx context.Context, req *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) { return c.reportNodePoolValidation.CallUnary(ctx, req) @@ -1635,6 +2410,11 @@ func (c *k8SRecommendationServiceClient) GetInstanceCategories(ctx context.Conte return c.getInstanceCategories.CallUnary(ctx, req) } +// GetInstanceShapes calls api.v1.K8sRecommendationService.GetInstanceShapes. +func (c *k8SRecommendationServiceClient) GetInstanceShapes(ctx context.Context, req *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) { + return c.getInstanceShapes.CallUnary(ctx, req) +} + // GetInstanceCPUs calls api.v1.K8sRecommendationService.GetInstanceCPUs. func (c *k8SRecommendationServiceClient) GetInstanceCPUs(ctx context.Context, req *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) { return c.getInstanceCPUs.CallUnary(ctx, req) @@ -1667,6 +2447,11 @@ func (c *k8SRecommendationServiceClient) GetPDBRecommendationForWorkload(ctx con return c.getPDBRecommendationForWorkload.CallUnary(ctx, req) } +// ListWorkloadStructuralHealth calls api.v1.K8sRecommendationService.ListWorkloadStructuralHealth. +func (c *k8SRecommendationServiceClient) ListWorkloadStructuralHealth(ctx context.Context, req *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) { + return c.listWorkloadStructuralHealth.CallUnary(ctx, req) +} + // CreateStorageRecommendationPolicy calls // api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy. func (c *k8SRecommendationServiceClient) CreateStorageRecommendationPolicy(ctx context.Context, req *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) { @@ -1785,23 +2570,84 @@ func (c *k8SRecommendationServiceClient) GetWorkloadOptimizationPolicy(ctx conte return c.getWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// GetWorkloadOptimizationPolicyByWorkload calls +// api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload. +func (c *k8SRecommendationServiceClient) GetWorkloadOptimizationPolicyByWorkload(ctx context.Context, req *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) { + return c.getWorkloadOptimizationPolicyByWorkload.CallUnary(ctx, req) +} + // UpdateWorkloadOptimizationPolicy calls // api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy. func (c *k8SRecommendationServiceClient) UpdateWorkloadOptimizationPolicy(ctx context.Context, req *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) { return c.updateWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// ToggleWorkloadOptimizationPolicyDisabled calls +// api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled. +func (c *k8SRecommendationServiceClient) ToggleWorkloadOptimizationPolicyDisabled(ctx context.Context, req *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) { + return c.toggleWorkloadOptimizationPolicyDisabled.CallUnary(ctx, req) +} + // DeleteWorkloadOptimizationPolicy calls // api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy. func (c *k8SRecommendationServiceClient) DeleteWorkloadOptimizationPolicy(ctx context.Context, req *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) { return c.deleteWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// PreviewWorkloadOptimizationPolicyMatches calls +// api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches. +func (c *k8SRecommendationServiceClient) PreviewWorkloadOptimizationPolicyMatches(ctx context.Context, req *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) { + return c.previewWorkloadOptimizationPolicyMatches.CallUnary(ctx, req) +} + +// CreateSchedulerPolicy calls api.v1.K8sRecommendationService.CreateSchedulerPolicy. +func (c *k8SRecommendationServiceClient) CreateSchedulerPolicy(ctx context.Context, req *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) { + return c.createSchedulerPolicy.CallUnary(ctx, req) +} + +// ListSchedulerPolicies calls api.v1.K8sRecommendationService.ListSchedulerPolicies. +func (c *k8SRecommendationServiceClient) ListSchedulerPolicies(ctx context.Context, req *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) { + return c.listSchedulerPolicies.CallUnary(ctx, req) +} + +// UpdateSchedulerPolicy calls api.v1.K8sRecommendationService.UpdateSchedulerPolicy. +func (c *k8SRecommendationServiceClient) UpdateSchedulerPolicy(ctx context.Context, req *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) { + return c.updateSchedulerPolicy.CallUnary(ctx, req) +} + +// ToggleSchedulerPolicyDisabled calls +// api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled. +func (c *k8SRecommendationServiceClient) ToggleSchedulerPolicyDisabled(ctx context.Context, req *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) { + return c.toggleSchedulerPolicyDisabled.CallUnary(ctx, req) +} + +// DeleteSchedulerPolicy calls api.v1.K8sRecommendationService.DeleteSchedulerPolicy. +func (c *k8SRecommendationServiceClient) DeleteSchedulerPolicy(ctx context.Context, req *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) { + return c.deleteSchedulerPolicy.CallUnary(ctx, req) +} + +// PreviewSchedulerPolicyTargets calls +// api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets. +func (c *k8SRecommendationServiceClient) PreviewSchedulerPolicyTargets(ctx context.Context, req *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) { + return c.previewSchedulerPolicyTargets.CallUnary(ctx, req) +} + +// ListSchedulerPolicyEnrollments calls +// api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments. +func (c *k8SRecommendationServiceClient) ListSchedulerPolicyEnrollments(ctx context.Context, req *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) { + return c.listSchedulerPolicyEnrollments.CallUnary(ctx, req) +} + // UpsertManualWorkloadRule calls api.v1.K8sRecommendationService.UpsertManualWorkloadRule. func (c *k8SRecommendationServiceClient) UpsertManualWorkloadRule(ctx context.Context, req *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) { return c.upsertManualWorkloadRule.CallUnary(ctx, req) } +// ToggleWorkloadRuleDisabled calls api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled. +func (c *k8SRecommendationServiceClient) ToggleWorkloadRuleDisabled(ctx context.Context, req *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) { + return c.toggleWorkloadRuleDisabled.CallUnary(ctx, req) +} + // PreviewWorkloadRule calls api.v1.K8sRecommendationService.PreviewWorkloadRule. func (c *k8SRecommendationServiceClient) PreviewWorkloadRule(ctx context.Context, req *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) { return c.previewWorkloadRule.CallUnary(ctx, req) @@ -1837,6 +2683,22 @@ func (c *k8SRecommendationServiceClient) DeleteWorkloadRule(ctx context.Context, return c.deleteWorkloadRule.CallUnary(ctx, req) } +// DeleteAllWorkloadRules calls api.v1.K8sRecommendationService.DeleteAllWorkloadRules. +func (c *k8SRecommendationServiceClient) DeleteAllWorkloadRules(ctx context.Context, req *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) { + return c.deleteAllWorkloadRules.CallUnary(ctx, req) +} + +// BulkDeleteWorkloadRules calls api.v1.K8sRecommendationService.BulkDeleteWorkloadRules. +func (c *k8SRecommendationServiceClient) BulkDeleteWorkloadRules(ctx context.Context, req *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) { + return c.bulkDeleteWorkloadRules.CallUnary(ctx, req) +} + +// BulkToggleWorkloadRulesDisabled calls +// api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled. +func (c *k8SRecommendationServiceClient) BulkToggleWorkloadRulesDisabled(ctx context.Context, req *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) { + return c.bulkToggleWorkloadRulesDisabled.CallUnary(ctx, req) +} + // GetWorkloadContainerNames calls api.v1.K8sRecommendationService.GetWorkloadContainerNames. func (c *k8SRecommendationServiceClient) GetWorkloadContainerNames(ctx context.Context, req *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) { return c.getWorkloadContainerNames.CallUnary(ctx, req) @@ -1847,12 +2709,178 @@ func (c *k8SRecommendationServiceClient) BatchAutoOptimizeWorkloads(ctx context. return c.batchAutoOptimizeWorkloads.CallUnary(ctx, req) } +// BatchUpsertManualWorkloadRules calls +// api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules. +func (c *k8SRecommendationServiceClient) BatchUpsertManualWorkloadRules(ctx context.Context, req *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) { + return c.batchUpsertManualWorkloadRules.CallUnary(ctx, req) +} + +// BatchPreviewWorkloadRules calls api.v1.K8sRecommendationService.BatchPreviewWorkloadRules. +func (c *k8SRecommendationServiceClient) BatchPreviewWorkloadRules(ctx context.Context, req *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) { + return c.batchPreviewWorkloadRules.CallUnary(ctx, req) +} + +// ApplyOneTimeOptimization calls api.v1.K8sRecommendationService.ApplyOneTimeOptimization. +func (c *k8SRecommendationServiceClient) ApplyOneTimeOptimization(ctx context.Context, req *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) { + return c.applyOneTimeOptimization.CallUnary(ctx, req) +} + +// DeleteRuleAndApplyRecommendation calls +// api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation. +func (c *k8SRecommendationServiceClient) DeleteRuleAndApplyRecommendation(ctx context.Context, req *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) { + return c.deleteRuleAndApplyRecommendation.CallUnary(ctx, req) +} + // GetNodeRecommendationStatus calls api.v1.K8sRecommendationService.GetNodeRecommendationStatus. func (c *k8SRecommendationServiceClient) GetNodeRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) { return c.getNodeRecommendationStatus.CallUnary(ctx, req) } -// K8SRecommendationServiceHandler is an implementation of the api.v1.K8sRecommendationService +// CreateSnapshotPolicies calls api.v1.K8sRecommendationService.CreateSnapshotPolicies. +func (c *k8SRecommendationServiceClient) CreateSnapshotPolicies(ctx context.Context, req *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) { + return c.createSnapshotPolicies.CallUnary(ctx, req) +} + +// ListSnapshotPolicies calls api.v1.K8sRecommendationService.ListSnapshotPolicies. +func (c *k8SRecommendationServiceClient) ListSnapshotPolicies(ctx context.Context, req *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) { + return c.listSnapshotPolicies.CallUnary(ctx, req) +} + +// UpdateSnapshotPolicy calls api.v1.K8sRecommendationService.UpdateSnapshotPolicy. +func (c *k8SRecommendationServiceClient) UpdateSnapshotPolicy(ctx context.Context, req *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) { + return c.updateSnapshotPolicy.CallUnary(ctx, req) +} + +// DeleteSnapshotPolicy calls api.v1.K8sRecommendationService.DeleteSnapshotPolicy. +func (c *k8SRecommendationServiceClient) DeleteSnapshotPolicy(ctx context.Context, req *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) { + return c.deleteSnapshotPolicy.CallUnary(ctx, req) +} + +// CreateSnapshotPolicyTargets calls api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) CreateSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) { + return c.createSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// ListSnapshotPolicyTargets calls api.v1.K8sRecommendationService.ListSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) ListSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) { + return c.listSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// UpdateSnapshotPolicyTarget calls api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) UpdateSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) { + return c.updateSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// DeleteSnapshotPolicyTarget calls api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) DeleteSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) { + return c.deleteSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// CreateForensicSnapshotPolicies calls +// api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies. +func (c *k8SRecommendationServiceClient) CreateForensicSnapshotPolicies(ctx context.Context, req *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) { + return c.createForensicSnapshotPolicies.CallUnary(ctx, req) +} + +// ListForensicSnapshotPolicies calls api.v1.K8sRecommendationService.ListForensicSnapshotPolicies. +func (c *k8SRecommendationServiceClient) ListForensicSnapshotPolicies(ctx context.Context, req *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) { + return c.listForensicSnapshotPolicies.CallUnary(ctx, req) +} + +// UpdateForensicSnapshotPolicy calls api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy. +func (c *k8SRecommendationServiceClient) UpdateForensicSnapshotPolicy(ctx context.Context, req *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) { + return c.updateForensicSnapshotPolicy.CallUnary(ctx, req) +} + +// DeleteForensicSnapshotPolicy calls api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy. +func (c *k8SRecommendationServiceClient) DeleteForensicSnapshotPolicy(ctx context.Context, req *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) { + return c.deleteForensicSnapshotPolicy.CallUnary(ctx, req) +} + +// CreateForensicSnapshotPolicyTargets calls +// api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) CreateForensicSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) { + return c.createForensicSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// ListForensicSnapshotPolicyTargets calls +// api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) ListForensicSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) { + return c.listForensicSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// UpdateForensicSnapshotPolicyTarget calls +// api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) UpdateForensicSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) { + return c.updateForensicSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// DeleteForensicSnapshotPolicyTarget calls +// api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) DeleteForensicSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) { + return c.deleteForensicSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// TriggerForensicSnapshotRun calls api.v1.K8sRecommendationService.TriggerForensicSnapshotRun. +func (c *k8SRecommendationServiceClient) TriggerForensicSnapshotRun(ctx context.Context, req *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) { + return c.triggerForensicSnapshotRun.CallUnary(ctx, req) +} + +// ListReferencedAuthentications calls +// api.v1.K8sRecommendationService.ListReferencedAuthentications. +func (c *k8SRecommendationServiceClient) ListReferencedAuthentications(ctx context.Context, req *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) { + return c.listReferencedAuthentications.CallUnary(ctx, req) +} + +// PreviewSnapshotPolicyTargetMatches calls +// api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches. +func (c *k8SRecommendationServiceClient) PreviewSnapshotPolicyTargetMatches(ctx context.Context, req *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) { + return c.previewSnapshotPolicyTargetMatches.CallUnary(ctx, req) +} + +// PreviewForensicSnapshotPolicyTargetMatches calls +// api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches. +func (c *k8SRecommendationServiceClient) PreviewForensicSnapshotPolicyTargetMatches(ctx context.Context, req *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) { + return c.previewForensicSnapshotPolicyTargetMatches.CallUnary(ctx, req) +} + +// GetSnapshotPolicyTargetRenderedScope calls +// api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope. +func (c *k8SRecommendationServiceClient) GetSnapshotPolicyTargetRenderedScope(ctx context.Context, req *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) { + return c.getSnapshotPolicyTargetRenderedScope.CallUnary(ctx, req) +} + +// GetForensicSnapshotPolicyTargetRenderedScope calls +// api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope. +func (c *k8SRecommendationServiceClient) GetForensicSnapshotPolicyTargetRenderedScope(ctx context.Context, req *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) { + return c.getForensicSnapshotPolicyTargetRenderedScope.CallUnary(ctx, req) +} + +// GetSnapshotRecommendationStatus calls +// api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus. +func (c *k8SRecommendationServiceClient) GetSnapshotRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) { + return c.getSnapshotRecommendationStatus.CallUnary(ctx, req) +} + +// GetForensicSnapshotRecommendationStatus calls +// api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus. +func (c *k8SRecommendationServiceClient) GetForensicSnapshotRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) { + return c.getForensicSnapshotRecommendationStatus.CallUnary(ctx, req) +} + +// PreviewSnapshotRecommendationConfig calls +// api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig. +func (c *k8SRecommendationServiceClient) PreviewSnapshotRecommendationConfig(ctx context.Context, req *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) { + return c.previewSnapshotRecommendationConfig.CallUnary(ctx, req) +} + +// PreviewForensicSnapshotRecommendationConfig calls +// api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig. +func (c *k8SRecommendationServiceClient) PreviewForensicSnapshotRecommendationConfig(ctx context.Context, req *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) { + return c.previewForensicSnapshotRecommendationConfig.CallUnary(ctx, req) +} + +// K8SRecommendationServiceHandler is an implementation of the api.v1.K8sRecommendationService // service. type K8SRecommendationServiceHandler interface { // Node Group Stats @@ -1953,18 +2981,84 @@ type K8SRecommendationServiceHandler interface { DeleteNodePolicy(context.Context, *connect.Request[v1.DeleteNodePolicyRequest]) (*connect.Response[v1.DeleteNodePolicyResponse], error) SuggestedNodePolicy(context.Context, *connect.Request[v1.SuggestedNodePolicyRequest]) (*connect.Response[v1.SuggestedNodePolicyResponse], error) SuggestedKarpenterConfig(context.Context, *connect.Request[v1.SuggestedKarpenterConfigRequest]) (*connect.Response[v1.SuggestedKarpenterConfigResponse], error) + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) // GenerateNodePoliciesFromNodeGroups generates NodePolicy objects by inspecting // k8s_nodes metadata for clusters without Karpenter/dzkarp. GenerateNodePoliciesFromNodeGroups(context.Context, *connect.Request[v1.GenerateNodePoliciesFromNodeGroupsRequest]) (*connect.Response[v1.GenerateNodePoliciesFromNodeGroupsResponse], error) + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // policy. The FE polls this while a batch is in flight so the toggle CTA can + // render "9/10 labelled, 1 failed". + GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) // Migration wizard state management GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) UpdateMigrationState(context.Context, *connect.Request[v1.UpdateMigrationStateRequest]) (*connect.Response[v1.UpdateMigrationStateResponse], error) + // Karpenter migration wizard + GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) + UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) + DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) + AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) + GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) + GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) // NodePool validation phone-home ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) GetNodePoolValidations(context.Context, *connect.Request[v1.GetNodePoolValidationsRequest]) (*connect.Response[v1.GetNodePoolValidationsResponse], error) @@ -1975,6 +3069,7 @@ type K8SRecommendationServiceHandler interface { GetInstanceFamilies(context.Context, *connect.Request[v1.GetInstanceFamiliesRequest]) (*connect.Response[v1.GetInstanceFamiliesResponse], error) GetInstanceSizes(context.Context, *connect.Request[v1.GetInstanceSizesRequest]) (*connect.Response[v1.GetInstanceSizesResponse], error) GetInstanceCategories(context.Context, *connect.Request[v1.GetInstanceCategoriesRequest]) (*connect.Response[v1.GetInstanceCategoriesResponse], error) + GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) GetInstanceTypeNames(context.Context, *connect.Request[v1.GetInstanceTypeNamesRequest]) (*connect.Response[v1.GetInstanceTypeNamesResponse], error) // PodDisruptionBudget RPCs @@ -1983,6 +3078,11 @@ type K8SRecommendationServiceHandler interface { CreatePodDisruptionBudget(context.Context, *connect.Request[v1.CreatePodDisruptionBudgetRequest]) (*connect.Response[v1.CreatePodDisruptionBudgetResponse], error) // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) GetPDBRecommendationForWorkload(context.Context, *connect.Request[v1.GetPDBRecommendationForWorkloadRequest]) (*connect.Response[v1.GetPDBRecommendationForWorkloadResponse], error) + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) // Storage Recommendation Policies CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) GetStorageRecommendationPolicy(context.Context, *connect.Request[v1.GetStorageRecommendationPolicyRequest]) (*connect.Response[v1.GetStorageRecommendationPolicyResponse], error) @@ -2011,10 +3111,30 @@ type K8SRecommendationServiceHandler interface { CreateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.CreateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.CreateWorkloadOptimizationPolicyResponse], error) ListWorkloadOptimizationPolicies(context.Context, *connect.Request[v1.ListWorkloadOptimizationPoliciesRequest]) (*connect.Response[v1.ListWorkloadOptimizationPoliciesResponse], error) GetWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyResponse], error) + GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) + // The sole way to change an existing policy's disabled state. See message doc. + ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) + // Scheduler Policies: CRUD + targeting preview + CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) + ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) + UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) + ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) + DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) + PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) // MPA V3: Workload Rules (CRUD) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) + // The sole way to change an EXISTING rule's disabled state. See message doc. + ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) GetWorkloadRulesByPolicy(context.Context, *connect.Request[v1.GetWorkloadRulesByPolicyRequest]) (*connect.Response[v1.GetWorkloadRulesByPolicyResponse], error) ListWorkloadRules(context.Context, *connect.Request[v1.ListWorkloadRulesRequest]) (*connect.Response[v1.ListWorkloadRulesResponse], error) @@ -2022,10 +3142,58 @@ type K8SRecommendationServiceHandler interface { GetWorkloadRuleByWorkload(context.Context, *connect.Request[v1.GetWorkloadRuleByWorkloadRequest]) (*connect.Response[v1.GetWorkloadRuleByWorkloadResponse], error) GetWorkloadByWorkloadRule(context.Context, *connect.Request[v1.GetWorkloadByWorkloadRuleRequest]) (*connect.Response[v1.GetWorkloadByWorkloadRuleResponse], error) DeleteWorkloadRule(context.Context, *connect.Request[v1.DeleteWorkloadRuleRequest]) (*connect.Response[v1.DeleteWorkloadRuleResponse], error) + DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) + BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) + BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) BatchAutoOptimizeWorkloads(context.Context, *connect.Request[v1.BatchAutoOptimizeWorkloadsRequest]) (*connect.Response[v1.BatchAutoOptimizeWorkloadsResponse], error) + BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) + BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) + ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) // Get current node pool config status and recent apply history for a cluster GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) + // ---- Snapshot policies (resilience) — spec §5 ---- + CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) + ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) + UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) + DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) + CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) + ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) + UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) + DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) + ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) + UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) + DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) + CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) + ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) + UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) + DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) + // Arms a forensic capture run: the ONLY way run_generation moves. + TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) + // ---- Targeting preview + read model + delivery status ---- + PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) + PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) + GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) + GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) + GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) + GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) + PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) } // NewK8SRecommendationServiceHandler builds an HTTP handler from the service implementation. It @@ -2314,6 +3482,16 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.SuggestedKarpenterConfig, opts..., ) + k8SRecommendationServiceSuggestNodePolicyImprovementsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure, + svc.SuggestNodePolicyImprovements, + opts..., + ) + k8SRecommendationServiceListClusterNodePolicySuggestionsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure, + svc.ListClusterNodePolicySuggestions, + opts..., + ) k8SRecommendationServiceGenerateNodePoliciesFromKarpenterHandler := connect.NewUnaryHandler( K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure, svc.GenerateNodePoliciesFromKarpenter, @@ -2324,11 +3502,46 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GenerateNodePoliciesFromNodeGroups, opts..., ) + k8SRecommendationServiceGetNodeGroupsCheckpointStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure, + svc.GetNodeGroupsCheckpointStatus, + opts..., + ) + k8SRecommendationServiceSetNodePolicyCheckpointLabelHandler := connect.NewUnaryHandler( + K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure, + svc.SetNodePolicyCheckpointLabel, + opts..., + ) + k8SRecommendationServiceEnableCheckpointForPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceEnableCheckpointForPolicyProcedure, + svc.EnableCheckpointForPolicy, + opts..., + ) + k8SRecommendationServiceGetCheckpointApplyStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetCheckpointApplyStatusProcedure, + svc.GetCheckpointApplyStatus, + opts..., + ) + k8SRecommendationServiceGetClusterCheckpointLabelCoverageHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure, + svc.GetClusterCheckpointLabelCoverage, + opts..., + ) + k8SRecommendationServiceListNodeGroupCheckpointLabelStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure, + svc.ListNodeGroupCheckpointLabelState, + opts..., + ) k8SRecommendationServiceGetNodeAnnotationReadinessHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetNodeAnnotationReadinessProcedure, svc.GetNodeAnnotationReadiness, opts..., ) + k8SRecommendationServiceDetectClusterAutoscalerHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDetectClusterAutoscalerProcedure, + svc.DetectClusterAutoscaler, + opts..., + ) k8SRecommendationServiceGetMigrationStateHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetMigrationStateProcedure, svc.GetMigrationState, @@ -2339,6 +3552,36 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.UpdateMigrationState, opts..., ) + k8SRecommendationServiceGetKarpenterMigrationStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterMigrationStateProcedure, + svc.GetKarpenterMigrationState, + opts..., + ) + k8SRecommendationServiceUpdateKarpenterMigrationStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure, + svc.UpdateKarpenterMigrationState, + opts..., + ) + k8SRecommendationServiceDetectKarpenterOwnershipConflictsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure, + svc.DetectKarpenterOwnershipConflicts, + opts..., + ) + k8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictHandler := connect.NewUnaryHandler( + K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure, + svc.AcknowledgeKarpenterOwnershipConflict, + opts..., + ) + k8SRecommendationServiceGetKarpenterSourceResourcesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterSourceResourcesProcedure, + svc.GetKarpenterSourceResources, + opts..., + ) + k8SRecommendationServiceGetKarpenterAdoptionStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure, + svc.GetKarpenterAdoptionStatus, + opts..., + ) k8SRecommendationServiceReportNodePoolValidationHandler := connect.NewUnaryHandler( K8SRecommendationServiceReportNodePoolValidationProcedure, svc.ReportNodePoolValidation, @@ -2384,6 +3627,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetInstanceCategories, opts..., ) + k8SRecommendationServiceGetInstanceShapesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetInstanceShapesProcedure, + svc.GetInstanceShapes, + opts..., + ) k8SRecommendationServiceGetInstanceCPUsHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetInstanceCPUsProcedure, svc.GetInstanceCPUs, @@ -2414,6 +3662,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetPDBRecommendationForWorkload, opts..., ) + k8SRecommendationServiceListWorkloadStructuralHealthHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListWorkloadStructuralHealthProcedure, + svc.ListWorkloadStructuralHealth, + opts..., + ) k8SRecommendationServiceCreateStorageRecommendationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure, svc.CreateStorageRecommendationPolicy, @@ -2519,21 +3772,76 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure, + svc.GetWorkloadOptimizationPolicyByWorkload, + opts..., + ) k8SRecommendationServiceUpdateWorkloadOptimizationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure, svc.UpdateWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure, + svc.ToggleWorkloadOptimizationPolicyDisabled, + opts..., + ) k8SRecommendationServiceDeleteWorkloadOptimizationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure, svc.DeleteWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure, + svc.PreviewWorkloadOptimizationPolicyMatches, + opts..., + ) + k8SRecommendationServiceCreateSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSchedulerPolicyProcedure, + svc.CreateSchedulerPolicy, + opts..., + ) + k8SRecommendationServiceListSchedulerPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSchedulerPoliciesProcedure, + svc.ListSchedulerPolicies, + opts..., + ) + k8SRecommendationServiceUpdateSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSchedulerPolicyProcedure, + svc.UpdateSchedulerPolicy, + opts..., + ) + k8SRecommendationServiceToggleSchedulerPolicyDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure, + svc.ToggleSchedulerPolicyDisabled, + opts..., + ) + k8SRecommendationServiceDeleteSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSchedulerPolicyProcedure, + svc.DeleteSchedulerPolicy, + opts..., + ) + k8SRecommendationServicePreviewSchedulerPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure, + svc.PreviewSchedulerPolicyTargets, + opts..., + ) + k8SRecommendationServiceListSchedulerPolicyEnrollmentsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure, + svc.ListSchedulerPolicyEnrollments, + opts..., + ) k8SRecommendationServiceUpsertManualWorkloadRuleHandler := connect.NewUnaryHandler( K8SRecommendationServiceUpsertManualWorkloadRuleProcedure, svc.UpsertManualWorkloadRule, opts..., ) + k8SRecommendationServiceToggleWorkloadRuleDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure, + svc.ToggleWorkloadRuleDisabled, + opts..., + ) k8SRecommendationServicePreviewWorkloadRuleHandler := connect.NewUnaryHandler( K8SRecommendationServicePreviewWorkloadRuleProcedure, svc.PreviewWorkloadRule, @@ -2569,6 +3877,21 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.DeleteWorkloadRule, opts..., ) + k8SRecommendationServiceDeleteAllWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteAllWorkloadRulesProcedure, + svc.DeleteAllWorkloadRules, + opts..., + ) + k8SRecommendationServiceBulkDeleteWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure, + svc.BulkDeleteWorkloadRules, + opts..., + ) + k8SRecommendationServiceBulkToggleWorkloadRulesDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure, + svc.BulkToggleWorkloadRulesDisabled, + opts..., + ) k8SRecommendationServiceGetWorkloadContainerNamesHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetWorkloadContainerNamesProcedure, svc.GetWorkloadContainerNames, @@ -2579,11 +3902,161 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.BatchAutoOptimizeWorkloads, opts..., ) + k8SRecommendationServiceBatchUpsertManualWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure, + svc.BatchUpsertManualWorkloadRules, + opts..., + ) + k8SRecommendationServiceBatchPreviewWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure, + svc.BatchPreviewWorkloadRules, + opts..., + ) + k8SRecommendationServiceApplyOneTimeOptimizationHandler := connect.NewUnaryHandler( + K8SRecommendationServiceApplyOneTimeOptimizationProcedure, + svc.ApplyOneTimeOptimization, + opts..., + ) + k8SRecommendationServiceDeleteRuleAndApplyRecommendationHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure, + svc.DeleteRuleAndApplyRecommendation, + opts..., + ) k8SRecommendationServiceGetNodeRecommendationStatusHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetNodeRecommendationStatusProcedure, svc.GetNodeRecommendationStatus, opts..., ) + k8SRecommendationServiceCreateSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSnapshotPoliciesProcedure, + svc.CreateSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceListSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSnapshotPoliciesProcedure, + svc.ListSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceUpdateSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSnapshotPolicyProcedure, + svc.UpdateSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceDeleteSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSnapshotPolicyProcedure, + svc.DeleteSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceCreateSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure, + svc.CreateSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceListSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSnapshotPolicyTargetsProcedure, + svc.ListSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceUpdateSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure, + svc.UpdateSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceDeleteSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure, + svc.DeleteSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceCreateForensicSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure, + svc.CreateForensicSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceListForensicSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListForensicSnapshotPoliciesProcedure, + svc.ListForensicSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceUpdateForensicSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure, + svc.UpdateForensicSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceDeleteForensicSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure, + svc.DeleteForensicSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceCreateForensicSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure, + svc.CreateForensicSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceListForensicSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure, + svc.ListForensicSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceUpdateForensicSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure, + svc.UpdateForensicSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceDeleteForensicSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure, + svc.DeleteForensicSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceTriggerForensicSnapshotRunHandler := connect.NewUnaryHandler( + K8SRecommendationServiceTriggerForensicSnapshotRunProcedure, + svc.TriggerForensicSnapshotRun, + opts..., + ) + k8SRecommendationServiceListReferencedAuthenticationsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListReferencedAuthenticationsProcedure, + svc.ListReferencedAuthentications, + opts..., + ) + k8SRecommendationServicePreviewSnapshotPolicyTargetMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure, + svc.PreviewSnapshotPolicyTargetMatches, + opts..., + ) + k8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure, + svc.PreviewForensicSnapshotPolicyTargetMatches, + opts..., + ) + k8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure, + svc.GetSnapshotPolicyTargetRenderedScope, + opts..., + ) + k8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure, + svc.GetForensicSnapshotPolicyTargetRenderedScope, + opts..., + ) + k8SRecommendationServiceGetSnapshotRecommendationStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure, + svc.GetSnapshotRecommendationStatus, + opts..., + ) + k8SRecommendationServiceGetForensicSnapshotRecommendationStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure, + svc.GetForensicSnapshotRecommendationStatus, + opts..., + ) + k8SRecommendationServicePreviewSnapshotRecommendationConfigHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure, + svc.PreviewSnapshotRecommendationConfig, + opts..., + ) + k8SRecommendationServicePreviewForensicSnapshotRecommendationConfigHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure, + svc.PreviewForensicSnapshotRecommendationConfig, + opts..., + ) return "/api.v1.K8sRecommendationService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case K8SRecommendationServiceGetNodeGroupStatsProcedure: @@ -2698,16 +4171,46 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceSuggestedNodePolicyHandler.ServeHTTP(w, r) case K8SRecommendationServiceSuggestedKarpenterConfigProcedure: k8SRecommendationServiceSuggestedKarpenterConfigHandler.ServeHTTP(w, r) + case K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure: + k8SRecommendationServiceSuggestNodePolicyImprovementsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure: + k8SRecommendationServiceListClusterNodePolicySuggestionsHandler.ServeHTTP(w, r) case K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure: k8SRecommendationServiceGenerateNodePoliciesFromKarpenterHandler.ServeHTTP(w, r) case K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure: k8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure: + k8SRecommendationServiceGetNodeGroupsCheckpointStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure: + k8SRecommendationServiceSetNodePolicyCheckpointLabelHandler.ServeHTTP(w, r) + case K8SRecommendationServiceEnableCheckpointForPolicyProcedure: + k8SRecommendationServiceEnableCheckpointForPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetCheckpointApplyStatusProcedure: + k8SRecommendationServiceGetCheckpointApplyStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure: + k8SRecommendationServiceGetClusterCheckpointLabelCoverageHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure: + k8SRecommendationServiceListNodeGroupCheckpointLabelStateHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodeAnnotationReadinessProcedure: k8SRecommendationServiceGetNodeAnnotationReadinessHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDetectClusterAutoscalerProcedure: + k8SRecommendationServiceDetectClusterAutoscalerHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetMigrationStateProcedure: k8SRecommendationServiceGetMigrationStateHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpdateMigrationStateProcedure: k8SRecommendationServiceUpdateMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterMigrationStateProcedure: + k8SRecommendationServiceGetKarpenterMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure: + k8SRecommendationServiceUpdateKarpenterMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure: + k8SRecommendationServiceDetectKarpenterOwnershipConflictsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure: + k8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterSourceResourcesProcedure: + k8SRecommendationServiceGetKarpenterSourceResourcesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure: + k8SRecommendationServiceGetKarpenterAdoptionStatusHandler.ServeHTTP(w, r) case K8SRecommendationServiceReportNodePoolValidationProcedure: k8SRecommendationServiceReportNodePoolValidationHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodePoolValidationsProcedure: @@ -2726,6 +4229,8 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceGetInstanceSizesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceCategoriesProcedure: k8SRecommendationServiceGetInstanceCategoriesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetInstanceShapesProcedure: + k8SRecommendationServiceGetInstanceShapesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceCPUsProcedure: k8SRecommendationServiceGetInstanceCPUsHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceTypeNamesProcedure: @@ -2738,6 +4243,8 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceCreatePodDisruptionBudgetHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure: k8SRecommendationServiceGetPDBRecommendationForWorkloadHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListWorkloadStructuralHealthProcedure: + k8SRecommendationServiceListWorkloadStructuralHealthHandler.ServeHTTP(w, r) case K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure: k8SRecommendationServiceCreateStorageRecommendationPolicyHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetStorageRecommendationPolicyProcedure: @@ -2780,12 +4287,34 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceListWorkloadOptimizationPoliciesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceGetWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure: + k8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceUpdateWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure: + k8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceDeleteWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure: + k8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSchedulerPolicyProcedure: + k8SRecommendationServiceCreateSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSchedulerPoliciesProcedure: + k8SRecommendationServiceListSchedulerPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSchedulerPolicyProcedure: + k8SRecommendationServiceUpdateSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure: + k8SRecommendationServiceToggleSchedulerPolicyDisabledHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSchedulerPolicyProcedure: + k8SRecommendationServiceDeleteSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure: + k8SRecommendationServicePreviewSchedulerPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure: + k8SRecommendationServiceListSchedulerPolicyEnrollmentsHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpsertManualWorkloadRuleProcedure: k8SRecommendationServiceUpsertManualWorkloadRuleHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure: + k8SRecommendationServiceToggleWorkloadRuleDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServicePreviewWorkloadRuleProcedure: k8SRecommendationServicePreviewWorkloadRuleHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadRulesByPolicyProcedure: @@ -2800,12 +4329,78 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceGetWorkloadByWorkloadRuleHandler.ServeHTTP(w, r) case K8SRecommendationServiceDeleteWorkloadRuleProcedure: k8SRecommendationServiceDeleteWorkloadRuleHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteAllWorkloadRulesProcedure: + k8SRecommendationServiceDeleteAllWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure: + k8SRecommendationServiceBulkDeleteWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure: + k8SRecommendationServiceBulkToggleWorkloadRulesDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadContainerNamesProcedure: k8SRecommendationServiceGetWorkloadContainerNamesHandler.ServeHTTP(w, r) case K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure: k8SRecommendationServiceBatchAutoOptimizeWorkloadsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure: + k8SRecommendationServiceBatchUpsertManualWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure: + k8SRecommendationServiceBatchPreviewWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceApplyOneTimeOptimizationProcedure: + k8SRecommendationServiceApplyOneTimeOptimizationHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure: + k8SRecommendationServiceDeleteRuleAndApplyRecommendationHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodeRecommendationStatusProcedure: k8SRecommendationServiceGetNodeRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSnapshotPoliciesProcedure: + k8SRecommendationServiceCreateSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSnapshotPoliciesProcedure: + k8SRecommendationServiceListSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSnapshotPolicyProcedure: + k8SRecommendationServiceUpdateSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSnapshotPolicyProcedure: + k8SRecommendationServiceDeleteSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceCreateSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceListSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure: + k8SRecommendationServiceUpdateSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure: + k8SRecommendationServiceDeleteSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure: + k8SRecommendationServiceCreateForensicSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListForensicSnapshotPoliciesProcedure: + k8SRecommendationServiceListForensicSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure: + k8SRecommendationServiceUpdateForensicSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure: + k8SRecommendationServiceDeleteForensicSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceCreateForensicSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceListForensicSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure: + k8SRecommendationServiceUpdateForensicSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure: + k8SRecommendationServiceDeleteForensicSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceTriggerForensicSnapshotRunProcedure: + k8SRecommendationServiceTriggerForensicSnapshotRunHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListReferencedAuthenticationsProcedure: + k8SRecommendationServiceListReferencedAuthenticationsHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure: + k8SRecommendationServicePreviewSnapshotPolicyTargetMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure: + k8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure: + k8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure: + k8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure: + k8SRecommendationServiceGetSnapshotRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure: + k8SRecommendationServiceGetForensicSnapshotRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure: + k8SRecommendationServicePreviewSnapshotRecommendationConfigHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure: + k8SRecommendationServicePreviewForensicSnapshotRecommendationConfigHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -3039,6 +4634,14 @@ func (UnimplementedK8SRecommendationServiceHandler) SuggestedKarpenterConfig(con return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SuggestedKarpenterConfig is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SuggestNodePolicyImprovements is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter is not implemented")) } @@ -3047,10 +4650,38 @@ func (UnimplementedK8SRecommendationServiceHandler) GenerateNodePoliciesFromNode return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.EnableCheckpointForPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetCheckpointApplyStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeAnnotationReadiness is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DetectClusterAutoscaler is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetMigrationState is not implemented")) } @@ -3059,6 +4690,30 @@ func (UnimplementedK8SRecommendationServiceHandler) UpdateMigrationState(context return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateMigrationState is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterMigrationState is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateKarpenterMigrationState is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterSourceResources is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ReportNodePoolValidation is not implemented")) } @@ -3095,6 +4750,10 @@ func (UnimplementedK8SRecommendationServiceHandler) GetInstanceCategories(contex return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceCategories is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceShapes is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceCPUs is not implemented")) } @@ -3119,6 +4778,10 @@ func (UnimplementedK8SRecommendationServiceHandler) GetPDBRecommendationForWorkl return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListWorkloadStructuralHealth is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy is not implemented")) } @@ -3203,18 +4866,62 @@ func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadOptimizationPolic return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSchedulerPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpsertManualWorkloadRule is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewWorkloadRule is not implemented")) } @@ -3243,6 +4950,18 @@ func (UnimplementedK8SRecommendationServiceHandler) DeleteWorkloadRule(context.C return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteWorkloadRule is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteAllWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BulkDeleteWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadContainerNames is not implemented")) } @@ -3251,6 +4970,126 @@ func (UnimplementedK8SRecommendationServiceHandler) BatchAutoOptimizeWorkloads(c return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchPreviewWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ApplyOneTimeOptimization is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeRecommendationStatus is not implemented")) } + +func (UnimplementedK8SRecommendationServiceHandler) CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListForensicSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.TriggerForensicSnapshotRun is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListReferencedAuthentications is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig is not implemented")) +} diff --git a/internal/gen/api/v1/cluster.pb.go b/internal/gen/api/v1/cluster.pb.go index 8784bd7..35e3366 100644 --- a/internal/gen/api/v1/cluster.pb.go +++ b/internal/gen/api/v1/cluster.pb.go @@ -768,6 +768,8 @@ type GetNetworkDependenciesRequest struct { EndTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` SrcNamespaces []string `protobuf:"bytes,4,rep,name=src_namespaces,json=srcNamespaces,proto3" json:"src_namespaces,omitempty"` // Filter by source namespaces (optional) SrcNodeGroups []string `protobuf:"bytes,5,rep,name=src_node_groups,json=srcNodeGroups,proto3" json:"src_node_groups,omitempty"` // Filter by source node groups (optional) + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` // Max edges to return, ordered by rank_by (optional; 0/unset means no limit — all matching edges are returned) + RankBy string `protobuf:"bytes,7,opt,name=rank_by,json=rankBy,proto3" json:"rank_by,omitempty"` // Ordering dimension: "traffic" (default) or "cost" (optional; unset/unrecognized falls back to "traffic") } func (x *GetNetworkDependenciesRequest) Reset() { @@ -837,6 +839,20 @@ func (x *GetNetworkDependenciesRequest) GetSrcNodeGroups() []string { return nil } +func (x *GetNetworkDependenciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetNetworkDependenciesRequest) GetRankBy() string { + if x != nil { + return x.RankBy + } + return "" +} + // A workload node in the dependency graph type WorkloadNode struct { state protoimpl.MessageState @@ -2154,7 +2170,7 @@ var file_api_v1_cluster_proto_rawDesc = []byte{ 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x22, 0xff, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xae, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, @@ -2170,283 +2186,286 @@ var file_api_v1_cluster_proto_rawDesc = []byte{ 0x0d, 0x73, 0x72, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x72, 0x63, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x76, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x36, - 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x73, - 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x0b, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, - 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x64, 0x73, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x0a, 0x64, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x12, - 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x10, 0x64, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, - 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x4e, 0x0a, - 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2c, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0xce, 0x02, - 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x72, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8e, - 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x22, - 0xc4, 0x01, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, - 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x61, 0x6e, 0x6b, 0x42, 0x79, 0x22, 0x76, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x36, 0x0a, + 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x73, 0x72, + 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0b, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, + 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x64, 0x73, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0a, 0x64, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x64, + 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x10, 0x64, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, + 0x08, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x4e, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, + 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0xce, 0x02, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbd, 0x04, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x72, + 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, + 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8e, 0x01, + 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x2c, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x22, 0xc4, + 0x01, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x78, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x78, 0x5f, 0x70, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x14, 0x74, 0x78, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x74, 0x78, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x72, 0x78, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x0f, 0x63, 0x6f, 0x73, - 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x73, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, - 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xec, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbd, 0x04, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2a, - 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6c, 0x69, - 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, - 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, - 0x02, 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2a, 0xcb, - 0x01, 0x0a, 0x19, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, - 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x27, - 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, - 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4c, 0x55, - 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, - 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, - 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, - 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x2c, - 0x0a, 0x28, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, - 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, - 0x51, 0x55, 0x49, 0x52, 0x45, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x03, 0x32, 0x80, 0x08, 0x0a, - 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, - 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x61, 0x73, - 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x2e, 0x61, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x78, + 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x78, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x14, 0x74, 0x78, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x14, + 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x72, 0x78, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x4a, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x0f, 0x63, 0x6f, 0x73, 0x74, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x7a, + 0x6f, 0x6e, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x73, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xec, 0x01, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, + 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, + 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6c, 0x69, 0x76, + 0x65, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, + 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x02, + 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2a, 0xcb, 0x01, + 0x0a, 0x19, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, + 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x27, 0x43, + 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, + 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4c, 0x55, 0x53, + 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x01, + 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, + 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, + 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x2c, 0x0a, + 0x28, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, + 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x51, + 0x55, 0x49, 0x52, 0x45, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x03, 0x32, 0x80, 0x08, 0x0a, 0x0e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x61, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x61, 0x73, 0x69, + 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, + 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x8a, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0c, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, - 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, - 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, - 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, - 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8a, + 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, + 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, + 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, + 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/internal/gen/api/v1/common.pb.go b/internal/gen/api/v1/common.pb.go index b36e899..42cd190 100644 --- a/internal/gen/api/v1/common.pb.go +++ b/internal/gen/api/v1/common.pb.go @@ -65,6 +65,14 @@ const ( K8SObjectKind_K8S_OBJECT_KIND_CNPG_CLUSTER K8SObjectKind = 35 K8SObjectKind_K8S_OBJECT_KIND_SPARK_APPLICATION K8SObjectKind = 36 K8SObjectKind_K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION K8SObjectKind = 37 + // Kyverno Policy and ClusterPolicy (kyverno.io/v1); one kind for both scopes. + K8SObjectKind_K8S_OBJECT_KIND_KYVERNO_POLICY K8SObjectKind = 38 + // Kyverno PolicyReport and ClusterPolicyReport (wgpolicyk8s.io/v1alpha2). + K8SObjectKind_K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT K8SObjectKind = 39 + // Gatekeeper ConstraintTemplate (templates.gatekeeper.sh/v1). + K8SObjectKind_K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE K8SObjectKind = 40 + // Gatekeeper constraint instances (constraints.gatekeeper.sh, dynamic kinds). + K8SObjectKind_K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT K8SObjectKind = 41 ) // Enum value maps for K8SObjectKind. @@ -108,46 +116,54 @@ var ( 35: "K8S_OBJECT_KIND_CNPG_CLUSTER", 36: "K8S_OBJECT_KIND_SPARK_APPLICATION", 37: "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION", + 38: "K8S_OBJECT_KIND_KYVERNO_POLICY", + 39: "K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT", + 40: "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE", + 41: "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT", } K8SObjectKind_value = map[string]int32{ - "K8S_OBJECT_KIND_UNSPECIFIED": 0, - "K8S_OBJECT_KIND_DEPLOYMENT": 1, - "K8S_OBJECT_KIND_REPLICA_SET": 2, - "K8S_OBJECT_KIND_STATEFUL_SET": 3, - "K8S_OBJECT_KIND_DAEMON_SET": 4, - "K8S_OBJECT_KIND_JOB": 5, - "K8S_OBJECT_KIND_CRON_JOB": 6, - "K8S_OBJECT_KIND_REPLICATION_CONTROLLER": 7, - "K8S_OBJECT_KIND_POD": 8, - "K8S_OBJECT_KIND_NAMESPACE": 9, - "K8S_OBJECT_KIND_NODE": 10, - "K8S_OBJECT_KIND_INGRESS": 11, - "K8S_OBJECT_KIND_CONTAINER": 12, - "K8S_OBJECT_KIND_SERVICE": 13, - "K8S_OBJECT_KIND_CONFIG_MAP": 14, - "K8S_OBJECT_KIND_PERSISTENT_VOLUME": 15, - "K8S_OBJECT_KIND_PERSISTENT_VOLUME_CLAIM": 16, - "K8S_OBJECT_KIND_STORAGE_CLASS": 17, - "K8S_OBJECT_KIND_ARGO_ROLLOUT": 18, - "K8S_OBJECT_KIND_HORIZONTAL_POD_AUTOSCALER": 19, - "K8S_OBJECT_KIND_VERTICAL_POD_AUTOSCALER": 20, - "K8S_OBJECT_KIND_LIMIT_RANGE": 21, - "K8S_OBJECT_KIND_SERVICE_ACCOUNT": 22, - "K8S_OBJECT_KIND_ROLE": 23, - "K8S_OBJECT_KIND_ROLE_BINDING": 24, - "K8S_OBJECT_KIND_KEDA_SCALED_OBJECT": 25, - "K8S_OBJECT_KIND_KARPENTER_RESOURCE": 26, - "K8S_OBJECT_KIND_POD_DISRUPTION_BUDGET": 27, - "K8S_OBJECT_KIND_RESOURCE_QUOTA": 28, - "K8S_OBJECT_KIND_KUBEFLOW_NOTEBOOK": 29, - "K8S_OBJECT_KIND_VOLCANO_JOB": 30, - "K8S_OBJECT_KIND_SECRET": 31, - "K8S_OBJECT_KIND_CLUSTER_ROLE": 32, - "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING": 33, - "K8S_OBJECT_KIND_NETWORK_POLICY": 34, - "K8S_OBJECT_KIND_CNPG_CLUSTER": 35, - "K8S_OBJECT_KIND_SPARK_APPLICATION": 36, - "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION": 37, + "K8S_OBJECT_KIND_UNSPECIFIED": 0, + "K8S_OBJECT_KIND_DEPLOYMENT": 1, + "K8S_OBJECT_KIND_REPLICA_SET": 2, + "K8S_OBJECT_KIND_STATEFUL_SET": 3, + "K8S_OBJECT_KIND_DAEMON_SET": 4, + "K8S_OBJECT_KIND_JOB": 5, + "K8S_OBJECT_KIND_CRON_JOB": 6, + "K8S_OBJECT_KIND_REPLICATION_CONTROLLER": 7, + "K8S_OBJECT_KIND_POD": 8, + "K8S_OBJECT_KIND_NAMESPACE": 9, + "K8S_OBJECT_KIND_NODE": 10, + "K8S_OBJECT_KIND_INGRESS": 11, + "K8S_OBJECT_KIND_CONTAINER": 12, + "K8S_OBJECT_KIND_SERVICE": 13, + "K8S_OBJECT_KIND_CONFIG_MAP": 14, + "K8S_OBJECT_KIND_PERSISTENT_VOLUME": 15, + "K8S_OBJECT_KIND_PERSISTENT_VOLUME_CLAIM": 16, + "K8S_OBJECT_KIND_STORAGE_CLASS": 17, + "K8S_OBJECT_KIND_ARGO_ROLLOUT": 18, + "K8S_OBJECT_KIND_HORIZONTAL_POD_AUTOSCALER": 19, + "K8S_OBJECT_KIND_VERTICAL_POD_AUTOSCALER": 20, + "K8S_OBJECT_KIND_LIMIT_RANGE": 21, + "K8S_OBJECT_KIND_SERVICE_ACCOUNT": 22, + "K8S_OBJECT_KIND_ROLE": 23, + "K8S_OBJECT_KIND_ROLE_BINDING": 24, + "K8S_OBJECT_KIND_KEDA_SCALED_OBJECT": 25, + "K8S_OBJECT_KIND_KARPENTER_RESOURCE": 26, + "K8S_OBJECT_KIND_POD_DISRUPTION_BUDGET": 27, + "K8S_OBJECT_KIND_RESOURCE_QUOTA": 28, + "K8S_OBJECT_KIND_KUBEFLOW_NOTEBOOK": 29, + "K8S_OBJECT_KIND_VOLCANO_JOB": 30, + "K8S_OBJECT_KIND_SECRET": 31, + "K8S_OBJECT_KIND_CLUSTER_ROLE": 32, + "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING": 33, + "K8S_OBJECT_KIND_NETWORK_POLICY": 34, + "K8S_OBJECT_KIND_CNPG_CLUSTER": 35, + "K8S_OBJECT_KIND_SPARK_APPLICATION": 36, + "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION": 37, + "K8S_OBJECT_KIND_KYVERNO_POLICY": 38, + "K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT": 39, + "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE": 40, + "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT": 41, } ) @@ -225,13 +241,36 @@ func (OrderByEnum) EnumDescriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{1} } -// LabelSelectorOperator is the set of operators that can be used in a selector requirement. +// LabelSelectorOperator is the set of operators that can be used in a selector +// requirement. +// +// The message shape mirrors Kubernetes metav1.LabelSelector, and matching +// follows Kubernetes for the IN and NOT_IN operators. In particular, a +// workload whose labels lack the key still matches NOT_IN, because a missing +// key is not in the set. This agrees with Kubernetes: in +// k8s.io/apimachinery/pkg/labels, Requirement.Matches returns true for NotIn +// when the key is absent, so it is not a divergence. +// +// Two DevZero-specific caveats apply (PC-1452): +// +// First, the department and workload filter paths implement only IN and +// NOT_IN. EXISTS, DOES_NOT_EXIST, GT, and LT are part of this proto for shape +// compatibility but are not honored by those SQL filters. +// +// Second, a workload whose entire labels or annotations column is SQL NULL +// (an unset column, distinct from an empty map) is EXCLUDED from a NOT_IN +// match by the department query, which ANDs a column IS NOT NULL guard ahead +// of the selector condition (dakr/repositories/departments.go). This is a +// genuine divergence from Kubernetes, which matches a label-less object +// against NotIn. It is also inconsistent with the workload-metrics filter +// path, which matches a NULL column against NOT_IN +// (dakr/repositories/workload_metrics_filters.go). type LabelSelectorOperator int32 const ( LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED LabelSelectorOperator = 0 LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_IN LabelSelectorOperator = 1 // In - LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_NOT_IN LabelSelectorOperator = 2 // NotIn + LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_NOT_IN LabelSelectorOperator = 2 // NotIn (missing key matches; see caveats above and PC-1452) LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_EXISTS LabelSelectorOperator = 3 // Exists LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST LabelSelectorOperator = 4 // DoesNotExist LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT LabelSelectorOperator = 5 // GreaterThan @@ -340,6 +379,136 @@ func (WorkloadStatusFilter) EnumDescriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{3} } +// DisruptionBlockReason is the structured classification of a consolidation / scale-down +// block: why the autoscaler could not remove a node. +// +// Assigned by zxporter at ingest time, because only the collector has the inputs the +// answer needs — the blocked pods' annotations, live PodDisruptionBudget status, the +// NodeClaim's terminationGracePeriod deadline, and (on Cluster Autoscaler) the +// `cluster-autoscaler-status` ConfigMap. dakr has none of those at read time, and the +// event's own message is unversioned free text that has changed shape across releases. +// +// ONE ENUM FOR BOTH AUTOSCALERS. Karpenter's `DisruptionBlocked` events and Cluster +// Autoscaler's synthesized `ScaleDownBlocked` observations share these buckets: two mean +// the same thing under either autoscaler, the rest are specific to one. Which autoscaler +// produced a row is answered by its `reporting_controller`, not by a second enum — that is +// what lets one report cover a Karpenter cluster, a CAS cluster, and a cluster running +// both mid-migration. +// +// The value names map 1:1 to models.DisruptionBlockReason and to the +// k8s_events.disruption_block_reason ClickHouse column's string values. That column is +// LowCardinality(String), not Enum8, so appending a value here costs no migration. +type DisruptionBlockReason int32 + +const ( + // Not a disruption-block event, or an event ingested before classification existed. + // Deliberately distinct from OTHER: this means "never classified", where OTHER means + // "classified, and matched no known pattern". + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_UNSPECIFIED DisruptionBlockReason = 0 + // A PodDisruptionBudget selecting a pod on the node currently allows no disruptions. + // blocking_pdb_name carries which one. Both autoscalers (on Cluster Autoscaler this is + // the BlockedByPod unremovable reason with a NotEnoughPdb blocking pod). + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_PDB_VIOLATION DisruptionBlockReason = 1 + // A pod on the node, or the node itself, is annotated un-evictable. Both autoscalers: + // `karpenter.sh/do-not-disrupt: "true"` on a pod (Karpenter), + // `cluster-autoscaler.kubernetes.io/safe-to-evict: "false"` on a pod, or + // `cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"` on a node (CAS). + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION DisruptionBlockReason = 2 + // The NodeClaim's terminationGracePeriod deadline has already elapsed, so Karpenter + // will force-terminate past both PDBs and do-not-disrupt. Karpenter-only: Cluster + // Autoscaler has no equivalent override. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED DisruptionBlockReason = 3 + // Classified, but the block matched none of the above — e.g. a node-level block + // (uninitialized, already deleting, missing its NodePool label), or any Cluster + // Autoscaler unremovable reason without its own bucket (NodeGroupMinSizeReached, + // NotUnderutilized, CurrentlyBeingDeleted, ...). The verbatim `message` is the only + // remaining detail, which is why it is never dropped. This is the REQUIRED fallback: + // dakr rejects an event carrying a value outside this enum. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_OTHER DisruptionBlockReason = 4 + // Cluster Autoscaler considers the node underutilized but has not yet seen it stay that + // way for --scale-down-unneeded-time. A waiting state rather than a misconfiguration, + // and the most common thing a healthy CAS cluster reports — hence its own bucket rather + // than OTHER. Cluster-Autoscaler-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH DisruptionBlockReason = 5 + // Cluster Autoscaler's scheduling simulation found nowhere to move the node's pods to, + // so the node cannot be drained. Actionable, unlike NOT_UNNEEDED_LONG_ENOUGH. + // Cluster-Autoscaler-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS DisruptionBlockReason = 6 + // The scheduler has provisionally assigned a pending pod to this node + // (pod.Status.NominatedNodeName). The autoscaler will not disrupt a node it is about to + // hand a pod, since that would just make the pod re-pend immediately — a self-resolving, + // expected-waiting state, not a misconfiguration. related_pod_name carries the pod. + // Derived structurally, not from the event message — reachable via the Karpenter path + // today. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_POD_NOMINATED DisruptionBlockReason = 7 + // Karpenter's own `disruption.budgets` allowance for the NodePool is currently spent, so + // it throttled itself. Operationally the opposite of every other value here: a config + // choice the cluster's owner made, not an obstruction to go find, which is why it is not + // folded into OTHER. Reported against the NodePool rather than a node, so it counts as a + // blocking event and never as a blocked node. Karpenter-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET DisruptionBlockReason = 8 + // Karpenter's scheduling simulation found nowhere for the node's pods to go, so draining + // it would leave them pending. Same situation as NO_PLACE_TO_MOVE_PODS, which is spelled + // to match Cluster Autoscaler's own unremovable reason verbatim and is therefore kept + // CAS-only; the per-pod sub-reason stays readable in the verbatim `message`. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE DisruptionBlockReason = 9 +) + +// Enum value maps for DisruptionBlockReason. +var ( + DisruptionBlockReason_name = map[int32]string{ + 0: "DISRUPTION_BLOCK_REASON_UNSPECIFIED", + 1: "DISRUPTION_BLOCK_REASON_PDB_VIOLATION", + 2: "DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION", + 3: "DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED", + 4: "DISRUPTION_BLOCK_REASON_OTHER", + 5: "DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH", + 6: "DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS", + 7: "DISRUPTION_BLOCK_REASON_POD_NOMINATED", + 8: "DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET", + 9: "DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE", + } + DisruptionBlockReason_value = map[string]int32{ + "DISRUPTION_BLOCK_REASON_UNSPECIFIED": 0, + "DISRUPTION_BLOCK_REASON_PDB_VIOLATION": 1, + "DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION": 2, + "DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED": 3, + "DISRUPTION_BLOCK_REASON_OTHER": 4, + "DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH": 5, + "DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS": 6, + "DISRUPTION_BLOCK_REASON_POD_NOMINATED": 7, + "DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET": 8, + "DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE": 9, + } +) + +func (x DisruptionBlockReason) Enum() *DisruptionBlockReason { + p := new(DisruptionBlockReason) + *p = x + return p +} + +func (x DisruptionBlockReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DisruptionBlockReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_common_proto_enumTypes[4].Descriptor() +} + +func (DisruptionBlockReason) Type() protoreflect.EnumType { + return &file_api_v1_common_proto_enumTypes[4] +} + +func (x DisruptionBlockReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DisruptionBlockReason.Descriptor instead. +func (DisruptionBlockReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{4} +} + // Represents a single audit log entry type AuditLogEntry struct { state protoimpl.MessageState @@ -676,6 +845,7 @@ type CostInfo struct { MoneyCpuCostForTimePeriod *money.Money `protobuf:"bytes,110,opt,name=money_cpu_cost_for_time_period,json=moneyCpuCostForTimePeriod,proto3" json:"money_cpu_cost_for_time_period,omitempty"` MoneyMemoryCostForTimePeriod *money.Money `protobuf:"bytes,111,opt,name=money_memory_cost_for_time_period,json=moneyMemoryCostForTimePeriod,proto3" json:"money_memory_cost_for_time_period,omitempty"` MoneyTotalCostForTimePeriod *money.Money `protobuf:"bytes,112,opt,name=money_total_cost_for_time_period,json=moneyTotalCostForTimePeriod,proto3" json:"money_total_cost_for_time_period,omitempty"` + MoneyNetworkCostForTimePeriod *money.Money `protobuf:"bytes,122,opt,name=money_network_cost_for_time_period,json=moneyNetworkCostForTimePeriod,proto3" json:"money_network_cost_for_time_period,omitempty"` MoneyOptimizedCpuCostForTimePeriod *money.Money `protobuf:"bytes,113,opt,name=money_optimized_cpu_cost_for_time_period,json=moneyOptimizedCpuCostForTimePeriod,proto3" json:"money_optimized_cpu_cost_for_time_period,omitempty"` MoneyOptimizedMemoryCostForTimePeriod *money.Money `protobuf:"bytes,114,opt,name=money_optimized_memory_cost_for_time_period,json=moneyOptimizedMemoryCostForTimePeriod,proto3" json:"money_optimized_memory_cost_for_time_period,omitempty"` MoneyOptimizedTotalCostForTimePeriod *money.Money `protobuf:"bytes,115,opt,name=money_optimized_total_cost_for_time_period,json=moneyOptimizedTotalCostForTimePeriod,proto3" json:"money_optimized_total_cost_for_time_period,omitempty"` @@ -986,6 +1156,13 @@ func (x *CostInfo) GetMoneyTotalCostForTimePeriod() *money.Money { return nil } +func (x *CostInfo) GetMoneyNetworkCostForTimePeriod() *money.Money { + if x != nil { + return x.MoneyNetworkCostForTimePeriod + } + return nil +} + func (x *CostInfo) GetMoneyOptimizedCpuCostForTimePeriod() *money.Money { if x != nil { return x.MoneyOptimizedCpuCostForTimePeriod @@ -1112,6 +1289,38 @@ type ResourceMetrics struct { NodeFsWrites float64 `protobuf:"fixed64,104,opt,name=node_fs_writes,json=nodeFsWrites,proto3" json:"node_fs_writes,omitempty"` // number // Pod count PodCount int32 `protobuf:"varint,111,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of distinct pods observed in this time bucket. + // JVM heap metrics (0 for non-Java containers) + JvmHeapUsedBytes int64 `protobuf:"varint,121,opt,name=jvm_heap_used_bytes,json=jvmHeapUsedBytes,proto3" json:"jvm_heap_used_bytes,omitempty"` + JvmHeapMaxBytes int64 `protobuf:"varint,122,opt,name=jvm_heap_max_bytes,json=jvmHeapMaxBytes,proto3" json:"jvm_heap_max_bytes,omitempty"` + // Memory RSS (Resident Set Size) in bytes from kubelet stats/summary (0 for non-RSS-reporting nodes) + ContainerMemoryRssBytes int64 `protobuf:"varint,123,opt,name=container_memory_rss_bytes,json=containerMemoryRssBytes,proto3" json:"container_memory_rss_bytes,omitempty"` + // Memory breakdown components (bytes). Relationship: + // + // usage_bytes = anonymous + file cache + swap cache + kernel (container_memory_usage_bytes / memory.current) + // working_set = usage_bytes - inactive_file (what the kubelet/OOM-killer acts on; stored as container_memory_usage) + // cache = active_file + inactive_file (file-backed, reclaimable) + // inactive_cache = max(0, usage_bytes - working_set) (reclaimable file cache) + // active_cache = max(0, cache - inactive_cache) (recently-used file cache) + // swap = swapped-out (non-resident) pages; tracked separately, NOT part of usage/working_set + ContainerMemoryCacheBytes int64 `protobuf:"varint,124,opt,name=container_memory_cache_bytes,json=containerMemoryCacheBytes,proto3" json:"container_memory_cache_bytes,omitempty"` + ContainerMemorySwapBytes int64 `protobuf:"varint,125,opt,name=container_memory_swap_bytes,json=containerMemorySwapBytes,proto3" json:"container_memory_swap_bytes,omitempty"` + ContainerMemoryActiveCacheBytes int64 `protobuf:"varint,126,opt,name=container_memory_active_cache_bytes,json=containerMemoryActiveCacheBytes,proto3" json:"container_memory_active_cache_bytes,omitempty"` + ContainerMemoryInactiveCacheBytes int64 `protobuf:"varint,127,opt,name=container_memory_inactive_cache_bytes,json=containerMemoryInactiveCacheBytes,proto3" json:"container_memory_inactive_cache_bytes,omitempty"` + // Runtime-aware cgroup signals (Plane 0, ADR-0037). Read directly from + // /sys/fs/cgroup by zxporter-nodemon (v2 primary). All are cumulative kernel + // counters; consumers derive windowed rates as last-first. + // + // cfs_* CPU CFS throttling (cpu.stat): real throttle, not a usage/limit ratio + // memory_events_max memory.events:max — allocations pinned against memory.max, the + // Guaranteed-memory ceiling counter that fires before/without an OOM kill + // *_pressure_*_usec PSI stall time (cpu.pressure/memory.pressure "total="), microseconds + ContainerCfsPeriods int64 `protobuf:"varint,128,opt,name=container_cfs_periods,json=containerCfsPeriods,proto3" json:"container_cfs_periods,omitempty"` + ContainerCfsThrottledPeriods int64 `protobuf:"varint,129,opt,name=container_cfs_throttled_periods,json=containerCfsThrottledPeriods,proto3" json:"container_cfs_throttled_periods,omitempty"` + ContainerCfsThrottledUsec int64 `protobuf:"varint,130,opt,name=container_cfs_throttled_usec,json=containerCfsThrottledUsec,proto3" json:"container_cfs_throttled_usec,omitempty"` + ContainerMemoryEventsMax int64 `protobuf:"varint,131,opt,name=container_memory_events_max,json=containerMemoryEventsMax,proto3" json:"container_memory_events_max,omitempty"` + ContainerCpuPressureSomeUsec int64 `protobuf:"varint,132,opt,name=container_cpu_pressure_some_usec,json=containerCpuPressureSomeUsec,proto3" json:"container_cpu_pressure_some_usec,omitempty"` + ContainerMemoryPressureSomeUsec int64 `protobuf:"varint,133,opt,name=container_memory_pressure_some_usec,json=containerMemoryPressureSomeUsec,proto3" json:"container_memory_pressure_some_usec,omitempty"` + ContainerMemoryPressureFullUsec int64 `protobuf:"varint,134,opt,name=container_memory_pressure_full_usec,json=containerMemoryPressureFullUsec,proto3" json:"container_memory_pressure_full_usec,omitempty"` } func (x *ResourceMetrics) Reset() { @@ -1510,6 +1719,104 @@ func (x *ResourceMetrics) GetPodCount() int32 { return 0 } +func (x *ResourceMetrics) GetJvmHeapUsedBytes() int64 { + if x != nil { + return x.JvmHeapUsedBytes + } + return 0 +} + +func (x *ResourceMetrics) GetJvmHeapMaxBytes() int64 { + if x != nil { + return x.JvmHeapMaxBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryRssBytes() int64 { + if x != nil { + return x.ContainerMemoryRssBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemorySwapBytes() int64 { + if x != nil { + return x.ContainerMemorySwapBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryActiveCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryActiveCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryInactiveCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryInactiveCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsPeriods() int64 { + if x != nil { + return x.ContainerCfsPeriods + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsThrottledPeriods() int64 { + if x != nil { + return x.ContainerCfsThrottledPeriods + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsThrottledUsec() int64 { + if x != nil { + return x.ContainerCfsThrottledUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryEventsMax() int64 { + if x != nil { + return x.ContainerMemoryEventsMax + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCpuPressureSomeUsec() int64 { + if x != nil { + return x.ContainerCpuPressureSomeUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryPressureSomeUsec() int64 { + if x != nil { + return x.ContainerMemoryPressureSomeUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryPressureFullUsec() int64 { + if x != nil { + return x.ContainerMemoryPressureFullUsec + } + return 0 +} + // MetricPercentiles contains percentile statistics for a single metric. type MetricPercentiles struct { state protoimpl.MessageState @@ -1970,6 +2277,25 @@ type ContainerRequestLimits struct { CurrentMemoryRequest float64 `protobuf:"fixed64,3,opt,name=current_memory_request,json=currentMemoryRequest,proto3" json:"current_memory_request,omitempty"` CurrentCpuLimit float64 `protobuf:"fixed64,4,opt,name=current_cpu_limit,json=currentCpuLimit,proto3" json:"current_cpu_limit,omitempty"` CurrentMemoryLimit float64 `protobuf:"fixed64,5,opt,name=current_memory_limit,json=currentMemoryLimit,proto3" json:"current_memory_limit,omitempty"` + // JVM metadata (empty/zero for non-Java containers). + // Populated from k8s_containers table when JVM is detected via hsperfdata. + JvmJavaVersion string `protobuf:"bytes,10,opt,name=jvm_java_version,json=jvmJavaVersion,proto3" json:"jvm_java_version,omitempty"` + JvmJavaCommand string `protobuf:"bytes,11,opt,name=jvm_java_command,json=jvmJavaCommand,proto3" json:"jvm_java_command,omitempty"` + // Parsed JVM flags (typed fields instead of raw JSON for type-safe frontend access). + JvmXmxBytes int64 `protobuf:"varint,13,opt,name=jvm_xmx_bytes,json=jvmXmxBytes,proto3" json:"jvm_xmx_bytes,omitempty"` // -Xmx max heap size in bytes + JvmXmsBytes int64 `protobuf:"varint,14,opt,name=jvm_xms_bytes,json=jvmXmsBytes,proto3" json:"jvm_xms_bytes,omitempty"` // -Xms initial heap size in bytes + JvmMaxRamPercentage float64 `protobuf:"fixed64,15,opt,name=jvm_max_ram_percentage,json=jvmMaxRamPercentage,proto3" json:"jvm_max_ram_percentage,omitempty"` // -XX:MaxRAMPercentage + JvmUseContainerSupport *bool `protobuf:"varint,16,opt,name=jvm_use_container_support,json=jvmUseContainerSupport,proto3,oneof" json:"jvm_use_container_support,omitempty"` // -XX:+/-UseContainerSupport + // Source the -Xmx flag was extracted from: "cmdline", "JAVA_TOOL_OPTIONS", + // "JDK_JAVA_OPTIONS", or "JAVA_OPTS". Empty when -Xmx is unset. Matters + // because the `java` launcher ignores JAVA_OPTS — an -Xmx set there is + // inert and the JVM falls back to ergonomic (container-limit) heap sizing. + JvmXmxSource string `protobuf:"bytes,17,opt,name=jvm_xmx_source,json=jvmXmxSource,proto3" json:"jvm_xmx_source,omitempty"` + // Generic runtime detections (Node.js, .NET, Go, Rust, GraalVM native-image, + // Python, Ruby, Deno, Bun) from zxporter-nodemon: existence + best-effort + // version per runtime. Empty for containers with no detected runtime. JVM + // stays on the dedicated fields above (richer hsperfdata payload). + RuntimeProcesses []*RuntimeProcess `protobuf:"bytes,18,rep,name=runtime_processes,json=runtimeProcesses,proto3" json:"runtime_processes,omitempty"` } func (x *ContainerRequestLimits) Reset() { @@ -2039,48 +2365,84 @@ func (x *ContainerRequestLimits) GetCurrentMemoryLimit() float64 { return 0 } -// ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. -type ForecastResourceMetrics struct { +func (x *ContainerRequestLimits) GetJvmJavaVersion() string { + if x != nil { + return x.JvmJavaVersion + } + return "" +} + +func (x *ContainerRequestLimits) GetJvmJavaCommand() string { + if x != nil { + return x.JvmJavaCommand + } + return "" +} + +func (x *ContainerRequestLimits) GetJvmXmxBytes() int64 { + if x != nil { + return x.JvmXmxBytes + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmXmsBytes() int64 { + if x != nil { + return x.JvmXmsBytes + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmMaxRamPercentage() float64 { + if x != nil { + return x.JvmMaxRamPercentage + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmUseContainerSupport() bool { + if x != nil && x.JvmUseContainerSupport != nil { + return *x.JvmUseContainerSupport + } + return false +} + +func (x *ContainerRequestLimits) GetJvmXmxSource() string { + if x != nil { + return x.JvmXmxSource + } + return "" +} + +func (x *ContainerRequestLimits) GetRuntimeProcesses() []*RuntimeProcess { + if x != nil { + return x.RuntimeProcesses + } + return nil +} + +// GPUMigInstance captures per-instance identity and profiling metrics for a +// single MIG partition. GPU utilization/SM fields are intentionally absent — +// DCGM never populates them on MIG rows. +type GPUMigInstance struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Forecast timestamp. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the container. - ApplicationId string `protobuf:"bytes,3,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` // Application id of the container. - ApplicationKind string `protobuf:"bytes,4,opt,name=application_kind,json=applicationKind,proto3" json:"application_kind,omitempty"` // Application kind of the container. - Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"` // Model used for the forecast - NodeCpuCapacity float64 `protobuf:"fixed64,6,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // Total CPU capacity of nodes. - NodeMemoryCapacity float64 `protobuf:"fixed64,7,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Total memory capacity of nodes. - NodeCpuUsage float64 `protobuf:"fixed64,8,opt,name=node_cpu_usage,json=nodeCpuUsage,proto3" json:"node_cpu_usage,omitempty"` // Current CPU usage of nodes. - NodeMemoryUsage float64 `protobuf:"fixed64,9,opt,name=node_memory_usage,json=nodeMemoryUsage,proto3" json:"node_memory_usage,omitempty"` // Current memory usage of nodes. - NodeCpuUtilization float64 `protobuf:"fixed64,10,opt,name=node_cpu_utilization,json=nodeCpuUtilization,proto3" json:"node_cpu_utilization,omitempty"` // CPU utilization percentage of nodes. - NodeMemoryUtilization float64 `protobuf:"fixed64,11,opt,name=node_memory_utilization,json=nodeMemoryUtilization,proto3" json:"node_memory_utilization,omitempty"` // Memory utilization percentage of nodes. - ContainerCpuUsage float64 `protobuf:"fixed64,12,opt,name=container_cpu_usage,json=containerCpuUsage,proto3" json:"container_cpu_usage,omitempty"` // Current CPU usage of containers. - ContainerMemoryUsage float64 `protobuf:"fixed64,13,opt,name=container_memory_usage,json=containerMemoryUsage,proto3" json:"container_memory_usage,omitempty"` // Current memory usage of containers. - ContainerCpuUtilization float64 `protobuf:"fixed64,14,opt,name=container_cpu_utilization,json=containerCpuUtilization,proto3" json:"container_cpu_utilization,omitempty"` // CPU utilization percentage of containers. - ContainerMemoryUtilization float64 `protobuf:"fixed64,15,opt,name=container_memory_utilization,json=containerMemoryUtilization,proto3" json:"container_memory_utilization,omitempty"` // Memory utilization percentage of containers. - ContainerCpuRequested float64 `protobuf:"fixed64,16,opt,name=container_cpu_requested,json=containerCpuRequested,proto3" json:"container_cpu_requested,omitempty"` // CPU requested by containers. - ContainerMemoryRequested float64 `protobuf:"fixed64,17,opt,name=container_memory_requested,json=containerMemoryRequested,proto3" json:"container_memory_requested,omitempty"` // Memory requested by containers. - ContainerCpuLimits float64 `protobuf:"fixed64,18,opt,name=container_cpu_limits,json=containerCpuLimits,proto3" json:"container_cpu_limits,omitempty"` // CPU limits of containers. - ContainerMemoryLimits float64 `protobuf:"fixed64,19,opt,name=container_memory_limits,json=containerMemoryLimits,proto3" json:"container_memory_limits,omitempty"` // Memory limits of containers. - ContainerGpuUsage float64 `protobuf:"fixed64,20,opt,name=container_gpu_usage,json=containerGpuUsage,proto3" json:"container_gpu_usage,omitempty"` // GPU usage of containers. - ContainerGpuRequested float64 `protobuf:"fixed64,21,opt,name=container_gpu_requested,json=containerGpuRequested,proto3" json:"container_gpu_requested,omitempty"` // GPU requests of containers. - ContainerGpuLimits float64 `protobuf:"fixed64,22,opt,name=container_gpu_limits,json=containerGpuLimits,proto3" json:"container_gpu_limits,omitempty"` // GPU limits of containers. - ContainerGpuUtilization float64 `protobuf:"fixed64,23,opt,name=container_gpu_utilization,json=containerGpuUtilization,proto3" json:"container_gpu_utilization,omitempty"` // GPU utilization of containers. - NodeGpuCapacity float64 `protobuf:"fixed64,24,opt,name=node_gpu_capacity,json=nodeGpuCapacity,proto3" json:"node_gpu_capacity,omitempty"` // GPU capcity of nodes. - NodeGpuUsage float64 `protobuf:"fixed64,25,opt,name=node_gpu_usage,json=nodeGpuUsage,proto3" json:"node_gpu_usage,omitempty"` // GPU usage of nodes. - NodeGpuUtilization float64 `protobuf:"fixed64,26,opt,name=node_gpu_utilization,json=nodeGpuUtilization,proto3" json:"node_gpu_utilization,omitempty"` // GPU utilization of nodes. - NodeGpuVramUsage float64 `protobuf:"fixed64,27,opt,name=node_gpu_vram_usage,json=nodeGpuVramUsage,proto3" json:"node_gpu_vram_usage,omitempty"` // GPU VRAM usage of nodes. - ContainerGpuVramUsage float64 `protobuf:"fixed64,28,opt,name=container_gpu_vram_usage,json=containerGpuVramUsage,proto3" json:"container_gpu_vram_usage,omitempty"` // GPU VRAM usage of containers. - NodeGpuVramCapacity float64 `protobuf:"fixed64,29,opt,name=node_gpu_vram_capacity,json=nodeGpuVramCapacity,proto3" json:"node_gpu_vram_capacity,omitempty"` // GPU VRAM capacity of nodes. - NodeGpuVramUtilization float64 `protobuf:"fixed64,30,opt,name=node_gpu_vram_utilization,json=nodeGpuVramUtilization,proto3" json:"node_gpu_vram_utilization,omitempty"` // GPU VRAM utilization of nodes. - NormalizedNodeMemoryCapacity float64 `protobuf:"fixed64,31,opt,name=normalized_node_memory_capacity,json=normalizedNodeMemoryCapacity,proto3" json:"normalized_node_memory_capacity,omitempty"` // Total memory capacity of nodes, normalized to cover for missing bytes. - NormalizedGpuVramCapacity float64 `protobuf:"fixed64,32,opt,name=normalized_gpu_vram_capacity,json=normalizedGpuVramCapacity,proto3" json:"normalized_gpu_vram_capacity,omitempty"` // Normalized GPU VRAM capacity of nodes. + DeviceUuid string `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"` + DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + MigProfile string `protobuf:"bytes,3,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + MigInstanceId string `protobuf:"bytes,4,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + ModelName string `protobuf:"bytes,5,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + TensorActive float64 `protobuf:"fixed64,6,opt,name=tensor_active,json=tensorActive,proto3" json:"tensor_active,omitempty"` + DramActive float64 `protobuf:"fixed64,7,opt,name=dram_active,json=dramActive,proto3" json:"dram_active,omitempty"` + GraphicsEngineActive float64 `protobuf:"fixed64,8,opt,name=graphics_engine_active,json=graphicsEngineActive,proto3" json:"graphics_engine_active,omitempty"` + FramebufferUsed float64 `protobuf:"fixed64,9,opt,name=framebuffer_used,json=framebufferUsed,proto3" json:"framebuffer_used,omitempty"` + FramebufferTotal float64 `protobuf:"fixed64,10,opt,name=framebuffer_total,json=framebufferTotal,proto3" json:"framebuffer_total,omitempty"` } -func (x *ForecastResourceMetrics) Reset() { - *x = ForecastResourceMetrics{} +func (x *GPUMigInstance) Reset() { + *x = GPUMigInstance{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_common_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2088,13 +2450,13 @@ func (x *ForecastResourceMetrics) Reset() { } } -func (x *ForecastResourceMetrics) String() string { +func (x *GPUMigInstance) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ForecastResourceMetrics) ProtoMessage() {} +func (*GPUMigInstance) ProtoMessage() {} -func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { +func (x *GPUMigInstance) ProtoReflect() protoreflect.Message { mi := &file_api_v1_common_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2106,275 +2468,436 @@ func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ForecastResourceMetrics.ProtoReflect.Descriptor instead. -func (*ForecastResourceMetrics) Descriptor() ([]byte, []int) { +// Deprecated: Use GPUMigInstance.ProtoReflect.Descriptor instead. +func (*GPUMigInstance) Descriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{7} } -func (x *ForecastResourceMetrics) GetTimestamp() *timestamppb.Timestamp { +func (x *GPUMigInstance) GetDeviceUuid() string { if x != nil { - return x.Timestamp + return x.DeviceUuid } - return nil + return "" } -func (x *ForecastResourceMetrics) GetClusterId() string { +func (x *GPUMigInstance) GetDeviceId() string { if x != nil { - return x.ClusterId + return x.DeviceId } return "" } -func (x *ForecastResourceMetrics) GetApplicationId() string { +func (x *GPUMigInstance) GetMigProfile() string { if x != nil { - return x.ApplicationId + return x.MigProfile } return "" } -func (x *ForecastResourceMetrics) GetApplicationKind() string { +func (x *GPUMigInstance) GetMigInstanceId() string { if x != nil { - return x.ApplicationKind + return x.MigInstanceId } return "" } -func (x *ForecastResourceMetrics) GetModel() string { +func (x *GPUMigInstance) GetModelName() string { if x != nil { - return x.Model + return x.ModelName } return "" } -func (x *ForecastResourceMetrics) GetNodeCpuCapacity() float64 { +func (x *GPUMigInstance) GetTensorActive() float64 { if x != nil { - return x.NodeCpuCapacity + return x.TensorActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryCapacity() float64 { +func (x *GPUMigInstance) GetDramActive() float64 { if x != nil { - return x.NodeMemoryCapacity + return x.DramActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeCpuUsage() float64 { +func (x *GPUMigInstance) GetGraphicsEngineActive() float64 { if x != nil { - return x.NodeCpuUsage + return x.GraphicsEngineActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryUsage() float64 { +func (x *GPUMigInstance) GetFramebufferUsed() float64 { if x != nil { - return x.NodeMemoryUsage + return x.FramebufferUsed } return 0 } -func (x *ForecastResourceMetrics) GetNodeCpuUtilization() float64 { +func (x *GPUMigInstance) GetFramebufferTotal() float64 { if x != nil { - return x.NodeCpuUtilization + return x.FramebufferTotal } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryUtilization() float64 { - if x != nil { - return x.NodeMemoryUtilization +// IndividualGPUMetric captures point-in-time metrics for a single GPU used +// by a container. +type IndividualGPUMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` + ModelName string `protobuf:"bytes,2,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + DeviceIndex string `protobuf:"bytes,3,opt,name=device_index,json=deviceIndex,proto3" json:"device_index,omitempty"` + MigProfile string `protobuf:"bytes,4,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + MigInstanceId string `protobuf:"bytes,5,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + Utilization float64 `protobuf:"fixed64,6,opt,name=utilization,proto3" json:"utilization,omitempty"` + MemoryUsed float64 `protobuf:"fixed64,7,opt,name=memory_used,json=memoryUsed,proto3" json:"memory_used,omitempty"` + MemoryFree float64 `protobuf:"fixed64,8,opt,name=memory_free,json=memoryFree,proto3" json:"memory_free,omitempty"` + TotalMemory float64 `protobuf:"fixed64,9,opt,name=total_memory,json=totalMemory,proto3" json:"total_memory,omitempty"` + MemoryUtilizationPercentage float64 `protobuf:"fixed64,10,opt,name=memory_utilization_percentage,json=memoryUtilizationPercentage,proto3" json:"memory_utilization_percentage,omitempty"` + PowerUsage float64 `protobuf:"fixed64,11,opt,name=power_usage,json=powerUsage,proto3" json:"power_usage,omitempty"` + Temperature float64 `protobuf:"fixed64,12,opt,name=temperature,proto3" json:"temperature,omitempty"` + SmClock float64 `protobuf:"fixed64,13,opt,name=sm_clock,json=smClock,proto3" json:"sm_clock,omitempty"` + MemClock float64 `protobuf:"fixed64,14,opt,name=mem_clock,json=memClock,proto3" json:"mem_clock,omitempty"` +} + +func (x *IndividualGPUMetric) Reset() { + *x = IndividualGPUMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ForecastResourceMetrics) GetContainerCpuUsage() float64 { +func (x *IndividualGPUMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IndividualGPUMetric) ProtoMessage() {} + +func (x *IndividualGPUMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[8] + 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 IndividualGPUMetric.ProtoReflect.Descriptor instead. +func (*IndividualGPUMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{8} +} + +func (x *IndividualGPUMetric) GetUuid() string { if x != nil { - return x.ContainerCpuUsage + return x.Uuid } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryUsage() float64 { +func (x *IndividualGPUMetric) GetModelName() string { if x != nil { - return x.ContainerMemoryUsage + return x.ModelName } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerCpuUtilization() float64 { +func (x *IndividualGPUMetric) GetDeviceIndex() string { if x != nil { - return x.ContainerCpuUtilization + return x.DeviceIndex } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryUtilization() float64 { +func (x *IndividualGPUMetric) GetMigProfile() string { if x != nil { - return x.ContainerMemoryUtilization + return x.MigProfile } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerCpuRequested() float64 { +func (x *IndividualGPUMetric) GetMigInstanceId() string { if x != nil { - return x.ContainerCpuRequested + return x.MigInstanceId } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryRequested() float64 { +func (x *IndividualGPUMetric) GetUtilization() float64 { if x != nil { - return x.ContainerMemoryRequested + return x.Utilization } return 0 } -func (x *ForecastResourceMetrics) GetContainerCpuLimits() float64 { +func (x *IndividualGPUMetric) GetMemoryUsed() float64 { if x != nil { - return x.ContainerCpuLimits + return x.MemoryUsed } return 0 } -func (x *ForecastResourceMetrics) GetContainerMemoryLimits() float64 { +func (x *IndividualGPUMetric) GetMemoryFree() float64 { if x != nil { - return x.ContainerMemoryLimits + return x.MemoryFree } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuUsage() float64 { +func (x *IndividualGPUMetric) GetTotalMemory() float64 { if x != nil { - return x.ContainerGpuUsage + return x.TotalMemory } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuRequested() float64 { +func (x *IndividualGPUMetric) GetMemoryUtilizationPercentage() float64 { if x != nil { - return x.ContainerGpuRequested + return x.MemoryUtilizationPercentage } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuLimits() float64 { +func (x *IndividualGPUMetric) GetPowerUsage() float64 { if x != nil { - return x.ContainerGpuLimits + return x.PowerUsage } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuUtilization() float64 { +func (x *IndividualGPUMetric) GetTemperature() float64 { if x != nil { - return x.ContainerGpuUtilization + return x.Temperature } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuCapacity() float64 { +func (x *IndividualGPUMetric) GetSmClock() float64 { if x != nil { - return x.NodeGpuCapacity + return x.SmClock } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuUsage() float64 { +func (x *IndividualGPUMetric) GetMemClock() float64 { if x != nil { - return x.NodeGpuUsage + return x.MemClock } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuUtilization() float64 { +// ContainerIndividualGPUMetrics is the most recent per-GPU breakdown for a +// single container. +type ContainerIndividualGPUMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Instances []*IndividualGPUMetric `protobuf:"bytes,2,rep,name=instances,proto3" json:"instances,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=collected_at,json=collectedAt,proto3,oneof" json:"collected_at,omitempty"` +} + +func (x *ContainerIndividualGPUMetrics) Reset() { + *x = ContainerIndividualGPUMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerIndividualGPUMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerIndividualGPUMetrics) ProtoMessage() {} + +func (x *ContainerIndividualGPUMetrics) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[9] + 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 ContainerIndividualGPUMetrics.ProtoReflect.Descriptor instead. +func (*ContainerIndividualGPUMetrics) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{9} +} + +func (x *ContainerIndividualGPUMetrics) GetContainerName() string { if x != nil { - return x.NodeGpuUtilization + return x.ContainerName } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNodeGpuVramUsage() float64 { +func (x *ContainerIndividualGPUMetrics) GetInstances() []*IndividualGPUMetric { if x != nil { - return x.NodeGpuVramUsage + return x.Instances } - return 0 + return nil } -func (x *ForecastResourceMetrics) GetContainerGpuVramUsage() float64 { +func (x *ContainerIndividualGPUMetrics) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.ContainerGpuVramUsage + return x.CollectedAt } - return 0 + return nil } -func (x *ForecastResourceMetrics) GetNodeGpuVramCapacity() float64 { +// RuntimeProcess is one detected language runtime in a container. +type RuntimeProcess struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Runtime name: "nodejs" | "dotnet" | "go" | "rust" | + // "graalvm-native-image" | "python" | "ruby" | "deno" | "bun". + Runtime string `protobuf:"bytes,1,opt,name=runtime,proto3" json:"runtime,omitempty"` + // Best-effort version; may be empty (stripped/custom binaries) — the + // detection itself is still meaningful. + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // How the version was resolved: "env" | "maps" | "buildinfo" | "elf-comment" + // | "binary-scan" | "exe-path" | "comm". + VersionSource string `protobuf:"bytes,3,opt,name=version_source,json=versionSource,proto3" json:"version_source,omitempty"` + // Raw process cmdline (useful for future flag heuristics, e.g. + // --max-old-space-size). + RawCmdline string `protobuf:"bytes,4,opt,name=raw_cmdline,json=rawCmdline,proto3" json:"raw_cmdline,omitempty"` +} + +func (x *RuntimeProcess) Reset() { + *x = RuntimeProcess{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RuntimeProcess) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RuntimeProcess) ProtoMessage() {} + +func (x *RuntimeProcess) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[10] + 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 RuntimeProcess.ProtoReflect.Descriptor instead. +func (*RuntimeProcess) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{10} +} + +func (x *RuntimeProcess) GetRuntime() string { if x != nil { - return x.NodeGpuVramCapacity + return x.Runtime } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNodeGpuVramUtilization() float64 { +func (x *RuntimeProcess) GetVersion() string { if x != nil { - return x.NodeGpuVramUtilization + return x.Version } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNormalizedNodeMemoryCapacity() float64 { +func (x *RuntimeProcess) GetVersionSource() string { if x != nil { - return x.NormalizedNodeMemoryCapacity + return x.VersionSource } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNormalizedGpuVramCapacity() float64 { +func (x *RuntimeProcess) GetRawCmdline() string { if x != nil { - return x.NormalizedGpuVramCapacity + return x.RawCmdline } - return 0 + return "" } -// ResourceSummary provides aggregated resource counts and pod status counts for a cluster or workload. -type ResourceSummary struct { +// ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. +type ForecastResourceMetrics struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeploymentCount int32 `protobuf:"varint,1,opt,name=deployment_count,json=deploymentCount,proto3" json:"deployment_count,omitempty"` // Number of Deployments. - StatefulSetCount int32 `protobuf:"varint,2,opt,name=stateful_set_count,json=statefulSetCount,proto3" json:"stateful_set_count,omitempty"` // Number of StatefulSets. - DaemonSetCount int32 `protobuf:"varint,3,opt,name=daemon_set_count,json=daemonSetCount,proto3" json:"daemon_set_count,omitempty"` // Number of DaemonSets. - JobCount int32 `protobuf:"varint,4,opt,name=job_count,json=jobCount,proto3" json:"job_count,omitempty"` // Number of Jobs. - CronJobCount int32 `protobuf:"varint,5,opt,name=cron_job_count,json=cronJobCount,proto3" json:"cron_job_count,omitempty"` // Number of CronJobs. - ReplicaSetCount int32 `protobuf:"varint,6,opt,name=replica_set_count,json=replicaSetCount,proto3" json:"replica_set_count,omitempty"` // Number of ReplicaSets. - PodCount int32 `protobuf:"varint,7,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of Pods. - ContainerCount int32 `protobuf:"varint,8,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of Containers. - PendingPods int32 `protobuf:"varint,9,opt,name=pending_pods,json=pendingPods,proto3" json:"pending_pods,omitempty"` // Number of Pods in Pending state. - RunningPods int32 `protobuf:"varint,10,opt,name=running_pods,json=runningPods,proto3" json:"running_pods,omitempty"` // Number of Pods in Running state. - SucceededPods int32 `protobuf:"varint,11,opt,name=succeeded_pods,json=succeededPods,proto3" json:"succeeded_pods,omitempty"` // Number of Pods in Succeeded state. - FailedPods int32 `protobuf:"varint,12,opt,name=failed_pods,json=failedPods,proto3" json:"failed_pods,omitempty"` // Number of Pods in Failed state. - UnknownPods int32 `protobuf:"varint,13,opt,name=unknown_pods,json=unknownPods,proto3" json:"unknown_pods,omitempty"` // Number of Pods in Unknown state. - UnderProvisionedCount int32 `protobuf:"varint,14,opt,name=under_provisioned_count,json=underProvisionedCount,proto3" json:"under_provisioned_count,omitempty"` // Number of resources under-provisioned. - OverProvisionedCount int32 `protobuf:"varint,15,opt,name=over_provisioned_count,json=overProvisionedCount,proto3" json:"over_provisioned_count,omitempty"` // Number of resources over-provisioned. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Forecast timestamp. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the container. + ApplicationId string `protobuf:"bytes,3,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` // Application id of the container. + ApplicationKind string `protobuf:"bytes,4,opt,name=application_kind,json=applicationKind,proto3" json:"application_kind,omitempty"` // Application kind of the container. + Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"` // Model used for the forecast + NodeCpuCapacity float64 `protobuf:"fixed64,6,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // Total CPU capacity of nodes. + NodeMemoryCapacity float64 `protobuf:"fixed64,7,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Total memory capacity of nodes. + NodeCpuUsage float64 `protobuf:"fixed64,8,opt,name=node_cpu_usage,json=nodeCpuUsage,proto3" json:"node_cpu_usage,omitempty"` // Current CPU usage of nodes. + NodeMemoryUsage float64 `protobuf:"fixed64,9,opt,name=node_memory_usage,json=nodeMemoryUsage,proto3" json:"node_memory_usage,omitempty"` // Current memory usage of nodes. + NodeCpuUtilization float64 `protobuf:"fixed64,10,opt,name=node_cpu_utilization,json=nodeCpuUtilization,proto3" json:"node_cpu_utilization,omitempty"` // CPU utilization percentage of nodes. + NodeMemoryUtilization float64 `protobuf:"fixed64,11,opt,name=node_memory_utilization,json=nodeMemoryUtilization,proto3" json:"node_memory_utilization,omitempty"` // Memory utilization percentage of nodes. + ContainerCpuUsage float64 `protobuf:"fixed64,12,opt,name=container_cpu_usage,json=containerCpuUsage,proto3" json:"container_cpu_usage,omitempty"` // Current CPU usage of containers. + ContainerMemoryUsage float64 `protobuf:"fixed64,13,opt,name=container_memory_usage,json=containerMemoryUsage,proto3" json:"container_memory_usage,omitempty"` // Current memory usage of containers. + ContainerCpuUtilization float64 `protobuf:"fixed64,14,opt,name=container_cpu_utilization,json=containerCpuUtilization,proto3" json:"container_cpu_utilization,omitempty"` // CPU utilization percentage of containers. + ContainerMemoryUtilization float64 `protobuf:"fixed64,15,opt,name=container_memory_utilization,json=containerMemoryUtilization,proto3" json:"container_memory_utilization,omitempty"` // Memory utilization percentage of containers. + ContainerCpuRequested float64 `protobuf:"fixed64,16,opt,name=container_cpu_requested,json=containerCpuRequested,proto3" json:"container_cpu_requested,omitempty"` // CPU requested by containers. + ContainerMemoryRequested float64 `protobuf:"fixed64,17,opt,name=container_memory_requested,json=containerMemoryRequested,proto3" json:"container_memory_requested,omitempty"` // Memory requested by containers. + ContainerCpuLimits float64 `protobuf:"fixed64,18,opt,name=container_cpu_limits,json=containerCpuLimits,proto3" json:"container_cpu_limits,omitempty"` // CPU limits of containers. + ContainerMemoryLimits float64 `protobuf:"fixed64,19,opt,name=container_memory_limits,json=containerMemoryLimits,proto3" json:"container_memory_limits,omitempty"` // Memory limits of containers. + ContainerGpuUsage float64 `protobuf:"fixed64,20,opt,name=container_gpu_usage,json=containerGpuUsage,proto3" json:"container_gpu_usage,omitempty"` // GPU usage of containers. + ContainerGpuRequested float64 `protobuf:"fixed64,21,opt,name=container_gpu_requested,json=containerGpuRequested,proto3" json:"container_gpu_requested,omitempty"` // GPU requests of containers. + ContainerGpuLimits float64 `protobuf:"fixed64,22,opt,name=container_gpu_limits,json=containerGpuLimits,proto3" json:"container_gpu_limits,omitempty"` // GPU limits of containers. + ContainerGpuUtilization float64 `protobuf:"fixed64,23,opt,name=container_gpu_utilization,json=containerGpuUtilization,proto3" json:"container_gpu_utilization,omitempty"` // GPU utilization of containers. + NodeGpuCapacity float64 `protobuf:"fixed64,24,opt,name=node_gpu_capacity,json=nodeGpuCapacity,proto3" json:"node_gpu_capacity,omitempty"` // GPU capcity of nodes. + NodeGpuUsage float64 `protobuf:"fixed64,25,opt,name=node_gpu_usage,json=nodeGpuUsage,proto3" json:"node_gpu_usage,omitempty"` // GPU usage of nodes. + NodeGpuUtilization float64 `protobuf:"fixed64,26,opt,name=node_gpu_utilization,json=nodeGpuUtilization,proto3" json:"node_gpu_utilization,omitempty"` // GPU utilization of nodes. + NodeGpuVramUsage float64 `protobuf:"fixed64,27,opt,name=node_gpu_vram_usage,json=nodeGpuVramUsage,proto3" json:"node_gpu_vram_usage,omitempty"` // GPU VRAM usage of nodes. + ContainerGpuVramUsage float64 `protobuf:"fixed64,28,opt,name=container_gpu_vram_usage,json=containerGpuVramUsage,proto3" json:"container_gpu_vram_usage,omitempty"` // GPU VRAM usage of containers. + NodeGpuVramCapacity float64 `protobuf:"fixed64,29,opt,name=node_gpu_vram_capacity,json=nodeGpuVramCapacity,proto3" json:"node_gpu_vram_capacity,omitempty"` // GPU VRAM capacity of nodes. + NodeGpuVramUtilization float64 `protobuf:"fixed64,30,opt,name=node_gpu_vram_utilization,json=nodeGpuVramUtilization,proto3" json:"node_gpu_vram_utilization,omitempty"` // GPU VRAM utilization of nodes. + NormalizedNodeMemoryCapacity float64 `protobuf:"fixed64,31,opt,name=normalized_node_memory_capacity,json=normalizedNodeMemoryCapacity,proto3" json:"normalized_node_memory_capacity,omitempty"` // Total memory capacity of nodes, normalized to cover for missing bytes. + NormalizedGpuVramCapacity float64 `protobuf:"fixed64,32,opt,name=normalized_gpu_vram_capacity,json=normalizedGpuVramCapacity,proto3" json:"normalized_gpu_vram_capacity,omitempty"` // Normalized GPU VRAM capacity of nodes. } -func (x *ResourceSummary) Reset() { - *x = ResourceSummary{} +func (x *ForecastResourceMetrics) Reset() { + *x = ForecastResourceMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[8] + mi := &file_api_v1_common_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceSummary) String() string { +func (x *ForecastResourceMetrics) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceSummary) ProtoMessage() {} +func (*ForecastResourceMetrics) ProtoMessage() {} -func (x *ResourceSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[8] +func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2385,400 +2908,423 @@ func (x *ResourceSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceSummary.ProtoReflect.Descriptor instead. -func (*ResourceSummary) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{8} +// Deprecated: Use ForecastResourceMetrics.ProtoReflect.Descriptor instead. +func (*ForecastResourceMetrics) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{11} } -func (x *ResourceSummary) GetDeploymentCount() int32 { +func (x *ForecastResourceMetrics) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.DeploymentCount + return x.Timestamp } - return 0 + return nil } -func (x *ResourceSummary) GetStatefulSetCount() int32 { +func (x *ForecastResourceMetrics) GetClusterId() string { if x != nil { - return x.StatefulSetCount + return x.ClusterId } - return 0 + return "" } -func (x *ResourceSummary) GetDaemonSetCount() int32 { +func (x *ForecastResourceMetrics) GetApplicationId() string { if x != nil { - return x.DaemonSetCount + return x.ApplicationId } - return 0 + return "" } -func (x *ResourceSummary) GetJobCount() int32 { +func (x *ForecastResourceMetrics) GetApplicationKind() string { if x != nil { - return x.JobCount + return x.ApplicationKind } - return 0 + return "" } -func (x *ResourceSummary) GetCronJobCount() int32 { +func (x *ForecastResourceMetrics) GetModel() string { if x != nil { - return x.CronJobCount + return x.Model + } + return "" +} + +func (x *ForecastResourceMetrics) GetNodeCpuCapacity() float64 { + if x != nil { + return x.NodeCpuCapacity } return 0 } -func (x *ResourceSummary) GetReplicaSetCount() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryCapacity() float64 { if x != nil { - return x.ReplicaSetCount + return x.NodeMemoryCapacity } return 0 } -func (x *ResourceSummary) GetPodCount() int32 { +func (x *ForecastResourceMetrics) GetNodeCpuUsage() float64 { if x != nil { - return x.PodCount + return x.NodeCpuUsage } return 0 } -func (x *ResourceSummary) GetContainerCount() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryUsage() float64 { if x != nil { - return x.ContainerCount + return x.NodeMemoryUsage } return 0 } -func (x *ResourceSummary) GetPendingPods() int32 { +func (x *ForecastResourceMetrics) GetNodeCpuUtilization() float64 { if x != nil { - return x.PendingPods + return x.NodeCpuUtilization } return 0 } -func (x *ResourceSummary) GetRunningPods() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryUtilization() float64 { if x != nil { - return x.RunningPods + return x.NodeMemoryUtilization } return 0 } -func (x *ResourceSummary) GetSucceededPods() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuUsage() float64 { if x != nil { - return x.SucceededPods + return x.ContainerCpuUsage } return 0 } -func (x *ResourceSummary) GetFailedPods() int32 { +func (x *ForecastResourceMetrics) GetContainerMemoryUsage() float64 { if x != nil { - return x.FailedPods + return x.ContainerMemoryUsage } return 0 } -func (x *ResourceSummary) GetUnknownPods() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuUtilization() float64 { if x != nil { - return x.UnknownPods + return x.ContainerCpuUtilization } return 0 } -func (x *ResourceSummary) GetUnderProvisionedCount() int32 { +func (x *ForecastResourceMetrics) GetContainerMemoryUtilization() float64 { if x != nil { - return x.UnderProvisionedCount + return x.ContainerMemoryUtilization } return 0 } -func (x *ResourceSummary) GetOverProvisionedCount() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuRequested() float64 { if x != nil { - return x.OverProvisionedCount + return x.ContainerCpuRequested } return 0 } -// WorkloadItem represents a Kubernetes resource and its hierarchical children. -type WorkloadItem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the resource (e.g., Pod, Container, Deployment). - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the resource. - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the resource. - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Namespace of the resource. - OwnerKind string `protobuf:"bytes,5,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. - OwnerUid string `protobuf:"bytes,6,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. - Children []*WorkloadItem `protobuf:"bytes,7,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. - Labels map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. - Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. - CreationTimestamp int64 `protobuf:"varint,10,opt,name=creation_timestamp,json=creationTimestamp,proto3" json:"creation_timestamp,omitempty"` // Creation time as a Unix timestamp. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,11,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the workload item. - CostInfo *CostInfo `protobuf:"bytes,12,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the workload item. - CostDataPoints []*CostDataPoint `protobuf:"bytes,13,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,14,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. - ImpactScore float64 `protobuf:"fixed64,15,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` // Optimization impact score for workload - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // Creation time of the workload item. - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` // Last update time of the workload item. - ClusterId string `protobuf:"bytes,18,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the workload - Id string `protobuf:"bytes,19,opt,name=id,proto3" json:"id,omitempty"` // DevZero unique identifier - // Resource-specific details for different K8s resource types - IsKarpenterResource bool `protobuf:"varint,20,opt,name=is_karpenter_resource,json=isKarpenterResource,proto3" json:"is_karpenter_resource,omitempty"` - ResourceDetails *ResourceDetails `protobuf:"bytes,30,opt,name=resource_details,json=resourceDetails,proto3,oneof" json:"resource_details,omitempty"` - PolicyIds []string `protobuf:"bytes,56,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this workload - ReplicasFromStatus int32 `protobuf:"varint,76,opt,name=replicas_from_status,json=replicasFromStatus,proto3" json:"replicas_from_status,omitempty"` - ReplicasFromSpec int32 `protobuf:"varint,77,opt,name=replicas_from_spec,json=replicasFromSpec,proto3" json:"replicas_from_spec,omitempty"` - ReplicasFromMetrics int32 `protobuf:"varint,78,opt,name=replicas_from_metrics,json=replicasFromMetrics,proto3" json:"replicas_from_metrics,omitempty"` - RootOwnerKind string `protobuf:"bytes,91,opt,name=root_owner_kind,json=rootOwnerKind,proto3" json:"root_owner_kind,omitempty"` // Kind of the root owning resource, if any. - RootOwnerUid string `protobuf:"bytes,92,opt,name=root_owner_uid,json=rootOwnerUid,proto3" json:"root_owner_uid,omitempty"` // UID of the root owning resource, if any. -} - -func (x *WorkloadItem) Reset() { - *x = WorkloadItem{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ForecastResourceMetrics) GetContainerMemoryRequested() float64 { + if x != nil { + return x.ContainerMemoryRequested } + return 0 } -func (x *WorkloadItem) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ForecastResourceMetrics) GetContainerCpuLimits() float64 { + if x != nil { + return x.ContainerCpuLimits + } + return 0 } -func (*WorkloadItem) ProtoMessage() {} - -func (x *WorkloadItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ForecastResourceMetrics) GetContainerMemoryLimits() float64 { + if x != nil { + return x.ContainerMemoryLimits } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use WorkloadItem.ProtoReflect.Descriptor instead. -func (*WorkloadItem) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{9} +func (x *ForecastResourceMetrics) GetContainerGpuUsage() float64 { + if x != nil { + return x.ContainerGpuUsage + } + return 0 } -func (x *WorkloadItem) GetKind() string { +func (x *ForecastResourceMetrics) GetContainerGpuRequested() float64 { if x != nil { - return x.Kind + return x.ContainerGpuRequested } - return "" + return 0 } -func (x *WorkloadItem) GetName() string { +func (x *ForecastResourceMetrics) GetContainerGpuLimits() float64 { if x != nil { - return x.Name + return x.ContainerGpuLimits } - return "" + return 0 } -func (x *WorkloadItem) GetUid() string { +func (x *ForecastResourceMetrics) GetContainerGpuUtilization() float64 { if x != nil { - return x.Uid + return x.ContainerGpuUtilization } - return "" + return 0 } -func (x *WorkloadItem) GetNamespace() string { +func (x *ForecastResourceMetrics) GetNodeGpuCapacity() float64 { if x != nil { - return x.Namespace + return x.NodeGpuCapacity } - return "" + return 0 } -func (x *WorkloadItem) GetOwnerKind() string { +func (x *ForecastResourceMetrics) GetNodeGpuUsage() float64 { if x != nil { - return x.OwnerKind + return x.NodeGpuUsage } - return "" + return 0 } -func (x *WorkloadItem) GetOwnerUid() string { +func (x *ForecastResourceMetrics) GetNodeGpuUtilization() float64 { if x != nil { - return x.OwnerUid + return x.NodeGpuUtilization } - return "" + return 0 } -func (x *WorkloadItem) GetChildren() []*WorkloadItem { +func (x *ForecastResourceMetrics) GetNodeGpuVramUsage() float64 { if x != nil { - return x.Children + return x.NodeGpuVramUsage } - return nil + return 0 } -func (x *WorkloadItem) GetLabels() map[string]string { +func (x *ForecastResourceMetrics) GetContainerGpuVramUsage() float64 { if x != nil { - return x.Labels + return x.ContainerGpuVramUsage } - return nil + return 0 } -func (x *WorkloadItem) GetAnnotations() map[string]string { +func (x *ForecastResourceMetrics) GetNodeGpuVramCapacity() float64 { if x != nil { - return x.Annotations + return x.NodeGpuVramCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCreationTimestamp() int64 { +func (x *ForecastResourceMetrics) GetNodeGpuVramUtilization() float64 { if x != nil { - return x.CreationTimestamp + return x.NodeGpuVramUtilization } return 0 } -func (x *WorkloadItem) GetResourceMetrics() *ResourceMetrics { +func (x *ForecastResourceMetrics) GetNormalizedNodeMemoryCapacity() float64 { if x != nil { - return x.ResourceMetrics + return x.NormalizedNodeMemoryCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCostInfo() *CostInfo { +func (x *ForecastResourceMetrics) GetNormalizedGpuVramCapacity() float64 { if x != nil { - return x.CostInfo + return x.NormalizedGpuVramCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCostDataPoints() []*CostDataPoint { - if x != nil { - return x.CostDataPoints +// ResourceSummary provides aggregated resource counts and pod status counts for a cluster or workload. +type ResourceSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeploymentCount int32 `protobuf:"varint,1,opt,name=deployment_count,json=deploymentCount,proto3" json:"deployment_count,omitempty"` // Number of Deployments. + StatefulSetCount int32 `protobuf:"varint,2,opt,name=stateful_set_count,json=statefulSetCount,proto3" json:"stateful_set_count,omitempty"` // Number of StatefulSets. + DaemonSetCount int32 `protobuf:"varint,3,opt,name=daemon_set_count,json=daemonSetCount,proto3" json:"daemon_set_count,omitempty"` // Number of DaemonSets. + JobCount int32 `protobuf:"varint,4,opt,name=job_count,json=jobCount,proto3" json:"job_count,omitempty"` // Number of Jobs. + CronJobCount int32 `protobuf:"varint,5,opt,name=cron_job_count,json=cronJobCount,proto3" json:"cron_job_count,omitempty"` // Number of CronJobs. + ReplicaSetCount int32 `protobuf:"varint,6,opt,name=replica_set_count,json=replicaSetCount,proto3" json:"replica_set_count,omitempty"` // Number of ReplicaSets. + PodCount int32 `protobuf:"varint,7,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of Pods. + ContainerCount int32 `protobuf:"varint,8,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of Containers. + PendingPods int32 `protobuf:"varint,9,opt,name=pending_pods,json=pendingPods,proto3" json:"pending_pods,omitempty"` // Number of Pods in Pending state. + RunningPods int32 `protobuf:"varint,10,opt,name=running_pods,json=runningPods,proto3" json:"running_pods,omitempty"` // Number of Pods in Running state. + SucceededPods int32 `protobuf:"varint,11,opt,name=succeeded_pods,json=succeededPods,proto3" json:"succeeded_pods,omitempty"` // Number of Pods in Succeeded state. + FailedPods int32 `protobuf:"varint,12,opt,name=failed_pods,json=failedPods,proto3" json:"failed_pods,omitempty"` // Number of Pods in Failed state. + UnknownPods int32 `protobuf:"varint,13,opt,name=unknown_pods,json=unknownPods,proto3" json:"unknown_pods,omitempty"` // Number of Pods in Unknown state. + UnderProvisionedCount int32 `protobuf:"varint,14,opt,name=under_provisioned_count,json=underProvisionedCount,proto3" json:"under_provisioned_count,omitempty"` // Number of resources under-provisioned. + OverProvisionedCount int32 `protobuf:"varint,15,opt,name=over_provisioned_count,json=overProvisionedCount,proto3" json:"over_provisioned_count,omitempty"` // Number of resources over-provisioned. +} + +func (x *ResourceSummary) Reset() { + *x = ResourceSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *WorkloadItem) GetResourceDataPoints() []*ResourceDataPoint { - if x != nil { - return x.ResourceDataPoints +func (x *ResourceSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceSummary) ProtoMessage() {} + +func (x *ResourceSummary) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *WorkloadItem) GetImpactScore() float64 { +// Deprecated: Use ResourceSummary.ProtoReflect.Descriptor instead. +func (*ResourceSummary) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{12} +} + +func (x *ResourceSummary) GetDeploymentCount() int32 { if x != nil { - return x.ImpactScore + return x.DeploymentCount } return 0 } -func (x *WorkloadItem) GetCreatedAt() *timestamppb.Timestamp { +func (x *ResourceSummary) GetStatefulSetCount() int32 { if x != nil { - return x.CreatedAt + return x.StatefulSetCount } - return nil + return 0 } -func (x *WorkloadItem) GetDeletedAt() *timestamppb.Timestamp { +func (x *ResourceSummary) GetDaemonSetCount() int32 { if x != nil { - return x.DeletedAt + return x.DaemonSetCount } - return nil + return 0 } -func (x *WorkloadItem) GetClusterId() string { +func (x *ResourceSummary) GetJobCount() int32 { if x != nil { - return x.ClusterId + return x.JobCount } - return "" + return 0 } -func (x *WorkloadItem) GetId() string { +func (x *ResourceSummary) GetCronJobCount() int32 { if x != nil { - return x.Id + return x.CronJobCount } - return "" + return 0 } -func (x *WorkloadItem) GetIsKarpenterResource() bool { +func (x *ResourceSummary) GetReplicaSetCount() int32 { if x != nil { - return x.IsKarpenterResource + return x.ReplicaSetCount } - return false + return 0 } -func (x *WorkloadItem) GetResourceDetails() *ResourceDetails { +func (x *ResourceSummary) GetPodCount() int32 { if x != nil { - return x.ResourceDetails + return x.PodCount } - return nil + return 0 } -func (x *WorkloadItem) GetPolicyIds() []string { +func (x *ResourceSummary) GetContainerCount() int32 { if x != nil { - return x.PolicyIds + return x.ContainerCount } - return nil + return 0 } -func (x *WorkloadItem) GetReplicasFromStatus() int32 { +func (x *ResourceSummary) GetPendingPods() int32 { if x != nil { - return x.ReplicasFromStatus + return x.PendingPods } return 0 } -func (x *WorkloadItem) GetReplicasFromSpec() int32 { +func (x *ResourceSummary) GetRunningPods() int32 { if x != nil { - return x.ReplicasFromSpec + return x.RunningPods } return 0 } -func (x *WorkloadItem) GetReplicasFromMetrics() int32 { +func (x *ResourceSummary) GetSucceededPods() int32 { if x != nil { - return x.ReplicasFromMetrics + return x.SucceededPods } return 0 } -func (x *WorkloadItem) GetRootOwnerKind() string { +func (x *ResourceSummary) GetFailedPods() int32 { if x != nil { - return x.RootOwnerKind + return x.FailedPods } - return "" + return 0 } -func (x *WorkloadItem) GetRootOwnerUid() string { +func (x *ResourceSummary) GetUnknownPods() int32 { if x != nil { - return x.RootOwnerUid + return x.UnknownPods } - return "" + return 0 } -// ContainerRuntimeInfo containes information about container runtime info -type ContainerRuntimeInfo struct { +func (x *ResourceSummary) GetUnderProvisionedCount() int32 { + if x != nil { + return x.UnderProvisionedCount + } + return 0 +} + +func (x *ResourceSummary) GetOverProvisionedCount() int32 { + if x != nil { + return x.OverProvisionedCount + } + return 0 +} + +// WorkloadItem represents a Kubernetes resource and its hierarchical children. +// LegacyPolicyRef identifies a legacy WorkloadPolicy whose target matches a workload. +type LegacyPolicyRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuntimeName string `protobuf:"bytes,1,opt,name=runtime_name,json=runtimeName,proto3" json:"runtime_name,omitempty"` - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` } -func (x *ContainerRuntimeInfo) Reset() { - *x = ContainerRuntimeInfo{} +func (x *LegacyPolicyRef) Reset() { + *x = LegacyPolicyRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[10] + mi := &file_api_v1_common_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerRuntimeInfo) String() string { +func (x *LegacyPolicyRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerRuntimeInfo) ProtoMessage() {} +func (*LegacyPolicyRef) ProtoMessage() {} -func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[10] +func (x *LegacyPolicyRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2789,56 +3335,61 @@ func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerRuntimeInfo.ProtoReflect.Descriptor instead. -func (*ContainerRuntimeInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{10} +// Deprecated: Use LegacyPolicyRef.ProtoReflect.Descriptor instead. +func (*LegacyPolicyRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{13} } -func (x *ContainerRuntimeInfo) GetRuntimeName() string { +func (x *LegacyPolicyRef) GetPolicyId() string { if x != nil { - return x.RuntimeName + return x.PolicyId } return "" } -func (x *ContainerRuntimeInfo) GetVersion() string { +func (x *LegacyPolicyRef) GetPolicyName() string { if x != nil { - return x.Version + return x.PolicyName } return "" } -// NodeInfo contains information about nodes in a cluster. -type NodeInfo struct { +// OptimizationStatus reports whether a workload is optimized under either the +// legacy (WorkloadPolicy/WorkloadPolicyTarget) or MPA v2 (WorkloadRule) system. +// Only populated on WorkloadItem when at least one of +// GetWorkloadsRequest.include_legacy_optimization_status or +// GetWorkloadsRequest.include_v2_optimization_status is true. +type OptimizationStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` // Total number of nodes. - OnDemandCount int32 `protobuf:"varint,2,opt,name=on_demand_count,json=onDemandCount,proto3" json:"on_demand_count,omitempty"` // Number of on-demand nodes. - ReservedCount int32 `protobuf:"varint,3,opt,name=reserved_count,json=reservedCount,proto3" json:"reserved_count,omitempty"` // Number of reserved nodes. - SpotCount int32 `protobuf:"varint,4,opt,name=spot_count,json=spotCount,proto3" json:"spot_count,omitempty"` // Number of spot nodes. - UnknownCount int32 `protobuf:"varint,5,opt,name=unknown_count,json=unknownCount,proto3" json:"unknown_count,omitempty"` // Number of nodes with unknown type. - PriceSourceCounts map[string]int32 `protobuf:"bytes,6,rep,name=price_source_counts,json=priceSourceCounts,proto3" json:"price_source_counts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Node count by price_source (e.g. {"ri_exact": 2, "sp_api_rate": 1, "on_demand": 5}). + IsOptimized bool `protobuf:"varint,1,opt,name=is_optimized,json=isOptimized,proto3" json:"is_optimized,omitempty"` // is_optimized_legacy || is_optimized_v2 + IsOptimizedLegacy bool `protobuf:"varint,2,opt,name=is_optimized_legacy,json=isOptimizedLegacy,proto3" json:"is_optimized_legacy,omitempty"` + IsOptimizedV2 bool `protobuf:"varint,3,opt,name=is_optimized_v2,json=isOptimizedV2,proto3" json:"is_optimized_v2,omitempty"` + LegacyPolicies []*LegacyPolicyRef `protobuf:"bytes,4,rep,name=legacy_policies,json=legacyPolicies,proto3" json:"legacy_policies,omitempty"` // legacy policies whose targets match this workload + WorkloadRuleId string `protobuf:"bytes,5,opt,name=workload_rule_id,json=workloadRuleId,proto3" json:"workload_rule_id,omitempty"` // v2: empty if no active WorkloadRule + WorkloadRulePolicyName string `protobuf:"bytes,6,opt,name=workload_rule_policy_name,json=workloadRulePolicyName,proto3" json:"workload_rule_policy_name,omitempty"` // v2: display name of the policy behind the active rule, empty if unresolved + Disabled bool `protobuf:"varint,7,opt,name=disabled,proto3" json:"disabled,omitempty"` // v2: whether the active WorkloadRule (workload_rule_id) is currently disabled. Always false when workload_rule_id is empty. } -func (x *NodeInfo) Reset() { - *x = NodeInfo{} +func (x *OptimizationStatus) Reset() { + *x = OptimizationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[11] + mi := &file_api_v1_common_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeInfo) String() string { +func (x *OptimizationStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeInfo) ProtoMessage() {} +func (*OptimizationStatus) ProtoMessage() {} -func (x *NodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[11] +func (x *OptimizationStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2849,82 +3400,113 @@ func (x *NodeInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeInfo.ProtoReflect.Descriptor instead. -func (*NodeInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{11} +// Deprecated: Use OptimizationStatus.ProtoReflect.Descriptor instead. +func (*OptimizationStatus) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{14} } -func (x *NodeInfo) GetNodeCount() int32 { +func (x *OptimizationStatus) GetIsOptimized() bool { if x != nil { - return x.NodeCount + return x.IsOptimized } - return 0 + return false } -func (x *NodeInfo) GetOnDemandCount() int32 { +func (x *OptimizationStatus) GetIsOptimizedLegacy() bool { if x != nil { - return x.OnDemandCount + return x.IsOptimizedLegacy } - return 0 + return false } -func (x *NodeInfo) GetReservedCount() int32 { +func (x *OptimizationStatus) GetIsOptimizedV2() bool { if x != nil { - return x.ReservedCount + return x.IsOptimizedV2 } - return 0 + return false } -func (x *NodeInfo) GetSpotCount() int32 { +func (x *OptimizationStatus) GetLegacyPolicies() []*LegacyPolicyRef { if x != nil { - return x.SpotCount + return x.LegacyPolicies } - return 0 + return nil } -func (x *NodeInfo) GetUnknownCount() int32 { +func (x *OptimizationStatus) GetWorkloadRuleId() string { if x != nil { - return x.UnknownCount + return x.WorkloadRuleId } - return 0 + return "" } -func (x *NodeInfo) GetPriceSourceCounts() map[string]int32 { +func (x *OptimizationStatus) GetWorkloadRulePolicyName() string { if x != nil { - return x.PriceSourceCounts + return x.WorkloadRulePolicyName } - return nil + return "" } -// ResourceInfo provides counts of resources and their scheduling states. -type ResourceInfo struct { +func (x *OptimizationStatus) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type WorkloadItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourcesCount int32 `protobuf:"varint,1,opt,name=resources_count,json=resourcesCount,proto3" json:"resources_count,omitempty"` // Total number of resources. - ScheduledResourceCount int32 `protobuf:"varint,2,opt,name=scheduled_resource_count,json=scheduledResourceCount,proto3" json:"scheduled_resource_count,omitempty"` // Number of scheduled resources. - UnscheduledResourceCount int32 `protobuf:"varint,3,opt,name=unscheduled_resource_count,json=unscheduledResourceCount,proto3" json:"unscheduled_resource_count,omitempty"` // Number of unscheduled resources. - UnknownResourceCount int32 `protobuf:"varint,4,opt,name=unknown_resource_count,json=unknownResourceCount,proto3" json:"unknown_resource_count,omitempty"` // Number of resources in unknown state. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the resource (e.g., Pod, Container, Deployment). + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the resource. + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the resource. + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Namespace of the resource. + OwnerKind string `protobuf:"bytes,5,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. + OwnerUid string `protobuf:"bytes,6,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. + Children []*WorkloadItem `protobuf:"bytes,7,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. + Labels map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. + Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. + CreationTimestamp int64 `protobuf:"varint,10,opt,name=creation_timestamp,json=creationTimestamp,proto3" json:"creation_timestamp,omitempty"` // Creation time as a Unix timestamp. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,11,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the workload item. + CostInfo *CostInfo `protobuf:"bytes,12,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the workload item. + CostDataPoints []*CostDataPoint `protobuf:"bytes,13,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,14,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. + ImpactScore float64 `protobuf:"fixed64,15,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` // Optimization impact score for workload + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // Creation time of the workload item. + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` // Last update time of the workload item. + ClusterId string `protobuf:"bytes,18,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the workload + Id string `protobuf:"bytes,19,opt,name=id,proto3" json:"id,omitempty"` // DevZero unique identifier + // Resource-specific details for different K8s resource types + IsKarpenterResource bool `protobuf:"varint,20,opt,name=is_karpenter_resource,json=isKarpenterResource,proto3" json:"is_karpenter_resource,omitempty"` + ResourceDetails *ResourceDetails `protobuf:"bytes,30,opt,name=resource_details,json=resourceDetails,proto3,oneof" json:"resource_details,omitempty"` + PolicyIds []string `protobuf:"bytes,56,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this workload + ReplicasFromStatus int32 `protobuf:"varint,76,opt,name=replicas_from_status,json=replicasFromStatus,proto3" json:"replicas_from_status,omitempty"` + ReplicasFromSpec int32 `protobuf:"varint,77,opt,name=replicas_from_spec,json=replicasFromSpec,proto3" json:"replicas_from_spec,omitempty"` + ReplicasFromMetrics int32 `protobuf:"varint,78,opt,name=replicas_from_metrics,json=replicasFromMetrics,proto3" json:"replicas_from_metrics,omitempty"` + RootOwnerKind string `protobuf:"bytes,91,opt,name=root_owner_kind,json=rootOwnerKind,proto3" json:"root_owner_kind,omitempty"` // Kind of the root owning resource, if any. + RootOwnerUid string `protobuf:"bytes,92,opt,name=root_owner_uid,json=rootOwnerUid,proto3" json:"root_owner_uid,omitempty"` // UID of the root owning resource, if any. + OptimizationStatus *OptimizationStatus `protobuf:"bytes,93,opt,name=optimization_status,json=optimizationStatus,proto3,oneof" json:"optimization_status,omitempty"` // Populated only when GetWorkloadsRequest.include_legacy_optimization_status and/or GetWorkloadsRequest.include_v2_optimization_status is true } -func (x *ResourceInfo) Reset() { - *x = ResourceInfo{} +func (x *WorkloadItem) Reset() { + *x = WorkloadItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[12] + mi := &file_api_v1_common_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceInfo) String() string { +func (x *WorkloadItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceInfo) ProtoMessage() {} +func (*WorkloadItem) ProtoMessage() {} -func (x *ResourceInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[12] +func (x *WorkloadItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2935,491 +3517,380 @@ func (x *ResourceInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceInfo.ProtoReflect.Descriptor instead. -func (*ResourceInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{12} +// Deprecated: Use WorkloadItem.ProtoReflect.Descriptor instead. +func (*WorkloadItem) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{15} } -func (x *ResourceInfo) GetResourcesCount() int32 { +func (x *WorkloadItem) GetKind() string { if x != nil { - return x.ResourcesCount + return x.Kind } - return 0 + return "" } -func (x *ResourceInfo) GetScheduledResourceCount() int32 { +func (x *WorkloadItem) GetName() string { if x != nil { - return x.ScheduledResourceCount + return x.Name } - return 0 + return "" } -func (x *ResourceInfo) GetUnscheduledResourceCount() int32 { +func (x *WorkloadItem) GetUid() string { if x != nil { - return x.UnscheduledResourceCount + return x.Uid } - return 0 + return "" } -func (x *ResourceInfo) GetUnknownResourceCount() int32 { +func (x *WorkloadItem) GetNamespace() string { if x != nil { - return x.UnknownResourceCount + return x.Namespace } - return 0 + return "" } -// Node represents a Kubernetes node with metadata, metrics, and cost information. -type Node struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the node. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the node. - InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` // Instance type of the node. - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` // Type/category of the node. - Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` // Region where the node is deployed. - Zone string `protobuf:"bytes,6,opt,name=zone,proto3" json:"zone,omitempty"` // Zone where the node is deployed. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,7,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource utilization metrics for the node. - CostInfo *CostInfo `protobuf:"bytes,8,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the node. - NodeCreatedAt int64 `protobuf:"varint,9,opt,name=node_created_at,json=nodeCreatedAt,proto3" json:"node_created_at,omitempty"` // Node creation time as a Unix timestamp. - IsReady bool `protobuf:"varint,10,opt,name=is_ready,json=isReady,proto3" json:"is_ready,omitempty"` // Indicates whether the node is ready. - ContainerRuntime *ContainerRuntimeInfo `protobuf:"bytes,20,opt,name=container_runtime,json=containerRuntime,proto3,oneof" json:"container_runtime,omitempty"` - NodeGroupName string `protobuf:"bytes,30,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` // it is what the variable says it is - ResourceDetails *ResourceDetails `protobuf:"bytes,40,opt,name=resource_details,json=resourceDetails,proto3" json:"resource_details,omitempty"` // if withDetails is true - // metadata if withMetadata is true - OwnerKind string `protobuf:"bytes,41,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. - OwnerUid string `protobuf:"bytes,42,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. - Children []*WorkloadItem `protobuf:"bytes,43,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. - Labels map[string]string `protobuf:"bytes,44,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. - Annotations map[string]string `protobuf:"bytes,45,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. - // Pricing information (legacy float fields - deprecated) - // - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerHour float64 `protobuf:"fixed64,50,opt,name=price_per_hour,json=pricePerHour,proto3" json:"price_per_hour,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerVcpu float64 `protobuf:"fixed64,51,opt,name=price_per_vcpu,json=pricePerVcpu,proto3" json:"price_per_vcpu,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerGib float64 `protobuf:"fixed64,52,opt,name=price_per_gib,json=pricePerGib,proto3" json:"price_per_gib,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerGpu float64 `protobuf:"fixed64,53,opt,name=price_per_gpu,json=pricePerGpu,proto3" json:"price_per_gpu,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - CpuPrice float64 `protobuf:"fixed64,54,opt,name=cpu_price,json=cpuPrice,proto3" json:"cpu_price,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - MemoryPrice float64 `protobuf:"fixed64,55,opt,name=memory_price,json=memoryPrice,proto3" json:"memory_price,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - GpuPrice float64 `protobuf:"fixed64,56,opt,name=gpu_price,json=gpuPrice,proto3" json:"gpu_price,omitempty"` - // Pricing information (using Money type for currency flexibility) - MoneyPricePerHour *money.Money `protobuf:"bytes,57,opt,name=money_price_per_hour,json=moneyPricePerHour,proto3" json:"money_price_per_hour,omitempty"` - MoneyEffPeriodTotalCost *money.Money `protobuf:"bytes,58,opt,name=money_eff_period_total_cost,json=moneyEffPeriodTotalCost,proto3" json:"money_eff_period_total_cost,omitempty"` - MoneyPricePerVcpu *money.Money `protobuf:"bytes,59,opt,name=money_price_per_vcpu,json=moneyPricePerVcpu,proto3" json:"money_price_per_vcpu,omitempty"` - MoneyPricePerGib *money.Money `protobuf:"bytes,80,opt,name=money_price_per_gib,json=moneyPricePerGib,proto3" json:"money_price_per_gib,omitempty"` - MoneyPricePerGpu *money.Money `protobuf:"bytes,81,opt,name=money_price_per_gpu,json=moneyPricePerGpu,proto3" json:"money_price_per_gpu,omitempty"` - MoneyCpuPrice *money.Money `protobuf:"bytes,82,opt,name=money_cpu_price,json=moneyCpuPrice,proto3" json:"money_cpu_price,omitempty"` - MoneyMemoryPrice *money.Money `protobuf:"bytes,83,opt,name=money_memory_price,json=moneyMemoryPrice,proto3" json:"money_memory_price,omitempty"` - MoneyGpuPrice *money.Money `protobuf:"bytes,84,opt,name=money_gpu_price,json=moneyGpuPrice,proto3" json:"money_gpu_price,omitempty"` - // Commitment pricing: original on-demand list price and billing source. - // money_price_per_hour holds the effective (RI/SP-adjusted) price. - // money_on_demand_price_per_hour holds the baseline list price before any discount. - // For on-demand and spot nodes both fields are equal. - MoneyOnDemandPricePerHour *money.Money `protobuf:"bytes,85,opt,name=money_on_demand_price_per_hour,json=moneyOnDemandPricePerHour,proto3" json:"money_on_demand_price_per_hour,omitempty"` - PriceSource string `protobuf:"bytes,86,opt,name=price_source,json=priceSource,proto3" json:"price_source,omitempty"` // "ri_exact", "ri_flexible", "sp_api_rate", "sp_estimated", "mixed", "spot", "on_demand", "unknown" - PricingAccuracy string `protobuf:"bytes,87,opt,name=pricing_accuracy,json=pricingAccuracy,proto3" json:"pricing_accuracy,omitempty"` // "accurate", "estimated", "fallback", "unknown" - // Enhanced node classification - ExtractedNodeType string `protobuf:"bytes,60,opt,name=extracted_node_type,json=extractedNodeType,proto3" json:"extracted_node_type,omitempty"` // "spot", "on-demand", "reserved" - AvailabilityZone string `protobuf:"bytes,61,opt,name=availability_zone,json=availabilityZone,proto3" json:"availability_zone,omitempty"` // Multi-cloud AZ extraction - // Kubernetes metadata - KubernetesUid string `protobuf:"bytes,62,opt,name=kubernetes_uid,json=kubernetesUid,proto3" json:"kubernetes_uid,omitempty"` - ResourceVersion string `protobuf:"bytes,63,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - // Volume and storage information - VolumesInUse []string `protobuf:"bytes,65,rep,name=volumes_in_use,json=volumesInUse,proto3" json:"volumes_in_use,omitempty"` - VolumesAttached []*AttachedVolume `protobuf:"bytes,66,rep,name=volumes_attached,json=volumesAttached,proto3" json:"volumes_attached,omitempty"` - // Timing information - LastSeen *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` - CollectedAt *timestamppb.Timestamp `protobuf:"bytes,71,opt,name=collected_at,json=collectedAt,proto3" json:"collected_at,omitempty"` - DeletionTimestamp *timestamppb.Timestamp `protobuf:"bytes,72,opt,name=deletion_timestamp,json=deletionTimestamp,proto3" json:"deletion_timestamp,omitempty"` +func (x *WorkloadItem) GetOwnerKind() string { + if x != nil { + return x.OwnerKind + } + return "" } -func (x *Node) Reset() { - *x = Node{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *WorkloadItem) GetOwnerUid() string { + if x != nil { + return x.OwnerUid } + return "" } -func (x *Node) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *WorkloadItem) GetChildren() []*WorkloadItem { + if x != nil { + return x.Children + } + return nil } -func (*Node) ProtoMessage() {} - -func (x *Node) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[13] - 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 Node.ProtoReflect.Descriptor instead. -func (*Node) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{13} -} - -func (x *Node) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Node) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Node) GetInstanceType() string { - if x != nil { - return x.InstanceType - } - return "" -} - -func (x *Node) GetType() string { +func (x *WorkloadItem) GetLabels() map[string]string { if x != nil { - return x.Type + return x.Labels } - return "" + return nil } -func (x *Node) GetRegion() string { +func (x *WorkloadItem) GetAnnotations() map[string]string { if x != nil { - return x.Region + return x.Annotations } - return "" + return nil } -func (x *Node) GetZone() string { +func (x *WorkloadItem) GetCreationTimestamp() int64 { if x != nil { - return x.Zone + return x.CreationTimestamp } - return "" + return 0 } -func (x *Node) GetResourceMetrics() *ResourceMetrics { +func (x *WorkloadItem) GetResourceMetrics() *ResourceMetrics { if x != nil { return x.ResourceMetrics } return nil } -func (x *Node) GetCostInfo() *CostInfo { +func (x *WorkloadItem) GetCostInfo() *CostInfo { if x != nil { return x.CostInfo } return nil } -func (x *Node) GetNodeCreatedAt() int64 { +func (x *WorkloadItem) GetCostDataPoints() []*CostDataPoint { if x != nil { - return x.NodeCreatedAt + return x.CostDataPoints } - return 0 + return nil } -func (x *Node) GetIsReady() bool { +func (x *WorkloadItem) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.IsReady + return x.ResourceDataPoints } - return false + return nil } -func (x *Node) GetContainerRuntime() *ContainerRuntimeInfo { +func (x *WorkloadItem) GetImpactScore() float64 { if x != nil { - return x.ContainerRuntime + return x.ImpactScore } - return nil + return 0 } -func (x *Node) GetNodeGroupName() string { +func (x *WorkloadItem) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.NodeGroupName + return x.CreatedAt } - return "" + return nil } -func (x *Node) GetResourceDetails() *ResourceDetails { +func (x *WorkloadItem) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.ResourceDetails + return x.DeletedAt } return nil } -func (x *Node) GetOwnerKind() string { +func (x *WorkloadItem) GetClusterId() string { if x != nil { - return x.OwnerKind + return x.ClusterId } return "" } -func (x *Node) GetOwnerUid() string { +func (x *WorkloadItem) GetId() string { if x != nil { - return x.OwnerUid + return x.Id } return "" } -func (x *Node) GetChildren() []*WorkloadItem { +func (x *WorkloadItem) GetIsKarpenterResource() bool { if x != nil { - return x.Children + return x.IsKarpenterResource } - return nil + return false } -func (x *Node) GetLabels() map[string]string { +func (x *WorkloadItem) GetResourceDetails() *ResourceDetails { if x != nil { - return x.Labels + return x.ResourceDetails } return nil } -func (x *Node) GetAnnotations() map[string]string { +func (x *WorkloadItem) GetPolicyIds() []string { if x != nil { - return x.Annotations + return x.PolicyIds } return nil } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerHour() float64 { +func (x *WorkloadItem) GetReplicasFromStatus() int32 { if x != nil { - return x.PricePerHour + return x.ReplicasFromStatus } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerVcpu() float64 { +func (x *WorkloadItem) GetReplicasFromSpec() int32 { if x != nil { - return x.PricePerVcpu + return x.ReplicasFromSpec } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerGib() float64 { +func (x *WorkloadItem) GetReplicasFromMetrics() int32 { if x != nil { - return x.PricePerGib + return x.ReplicasFromMetrics } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerGpu() float64 { +func (x *WorkloadItem) GetRootOwnerKind() string { if x != nil { - return x.PricePerGpu + return x.RootOwnerKind } - return 0 + return "" } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetCpuPrice() float64 { +func (x *WorkloadItem) GetRootOwnerUid() string { if x != nil { - return x.CpuPrice + return x.RootOwnerUid } - return 0 + return "" } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetMemoryPrice() float64 { +func (x *WorkloadItem) GetOptimizationStatus() *OptimizationStatus { if x != nil { - return x.MemoryPrice + return x.OptimizationStatus } - return 0 + return nil } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetGpuPrice() float64 { - if x != nil { - return x.GpuPrice - } - return 0 -} +// ContainerRuntimeInfo containes information about container runtime info +type ContainerRuntimeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *Node) GetMoneyPricePerHour() *money.Money { - if x != nil { - return x.MoneyPricePerHour - } - return nil + RuntimeName string `protobuf:"bytes,1,opt,name=runtime_name,json=runtimeName,proto3" json:"runtime_name,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` } -func (x *Node) GetMoneyEffPeriodTotalCost() *money.Money { - if x != nil { - return x.MoneyEffPeriodTotalCost +func (x *ContainerRuntimeInfo) Reset() { + *x = ContainerRuntimeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *Node) GetMoneyPricePerVcpu() *money.Money { - if x != nil { - return x.MoneyPricePerVcpu - } - return nil +func (x *ContainerRuntimeInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Node) GetMoneyPricePerGib() *money.Money { - if x != nil { - return x.MoneyPricePerGib - } - return nil -} +func (*ContainerRuntimeInfo) ProtoMessage() {} -func (x *Node) GetMoneyPricePerGpu() *money.Money { - if x != nil { - return x.MoneyPricePerGpu +func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Node) GetMoneyCpuPrice() *money.Money { - if x != nil { - return x.MoneyCpuPrice - } - return nil +// Deprecated: Use ContainerRuntimeInfo.ProtoReflect.Descriptor instead. +func (*ContainerRuntimeInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{16} } -func (x *Node) GetMoneyMemoryPrice() *money.Money { +func (x *ContainerRuntimeInfo) GetRuntimeName() string { if x != nil { - return x.MoneyMemoryPrice + return x.RuntimeName } - return nil + return "" } -func (x *Node) GetMoneyGpuPrice() *money.Money { +func (x *ContainerRuntimeInfo) GetVersion() string { if x != nil { - return x.MoneyGpuPrice + return x.Version } - return nil + return "" } -func (x *Node) GetMoneyOnDemandPricePerHour() *money.Money { - if x != nil { - return x.MoneyOnDemandPricePerHour - } - return nil +// NodeInfo contains information about nodes in a cluster. +type NodeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` // Total number of nodes. + OnDemandCount int32 `protobuf:"varint,2,opt,name=on_demand_count,json=onDemandCount,proto3" json:"on_demand_count,omitempty"` // Number of on-demand nodes. + ReservedCount int32 `protobuf:"varint,3,opt,name=reserved_count,json=reservedCount,proto3" json:"reserved_count,omitempty"` // Number of reserved nodes. + SpotCount int32 `protobuf:"varint,4,opt,name=spot_count,json=spotCount,proto3" json:"spot_count,omitempty"` // Number of spot nodes. + UnknownCount int32 `protobuf:"varint,5,opt,name=unknown_count,json=unknownCount,proto3" json:"unknown_count,omitempty"` // Number of nodes with unknown type. + PriceSourceCounts map[string]int32 `protobuf:"bytes,6,rep,name=price_source_counts,json=priceSourceCounts,proto3" json:"price_source_counts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Node count by price_source (e.g. {"ri_exact": 2, "sp_api_rate": 1, "on_demand": 5}). } -func (x *Node) GetPriceSource() string { - if x != nil { - return x.PriceSource +func (x *NodeInfo) Reset() { + *x = NodeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *Node) GetPricingAccuracy() string { - if x != nil { - return x.PricingAccuracy - } - return "" +func (x *NodeInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Node) GetExtractedNodeType() string { - if x != nil { - return x.ExtractedNodeType - } - return "" -} +func (*NodeInfo) ProtoMessage() {} -func (x *Node) GetAvailabilityZone() string { - if x != nil { - return x.AvailabilityZone +func (x *NodeInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *Node) GetKubernetesUid() string { - if x != nil { - return x.KubernetesUid - } - return "" +// Deprecated: Use NodeInfo.ProtoReflect.Descriptor instead. +func (*NodeInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{17} } -func (x *Node) GetResourceVersion() string { +func (x *NodeInfo) GetNodeCount() int32 { if x != nil { - return x.ResourceVersion + return x.NodeCount } - return "" + return 0 } -func (x *Node) GetVolumesInUse() []string { +func (x *NodeInfo) GetOnDemandCount() int32 { if x != nil { - return x.VolumesInUse + return x.OnDemandCount } - return nil + return 0 } -func (x *Node) GetVolumesAttached() []*AttachedVolume { +func (x *NodeInfo) GetReservedCount() int32 { if x != nil { - return x.VolumesAttached + return x.ReservedCount } - return nil + return 0 } -func (x *Node) GetLastSeen() *timestamppb.Timestamp { +func (x *NodeInfo) GetSpotCount() int32 { if x != nil { - return x.LastSeen + return x.SpotCount } - return nil + return 0 } -func (x *Node) GetCollectedAt() *timestamppb.Timestamp { +func (x *NodeInfo) GetUnknownCount() int32 { if x != nil { - return x.CollectedAt + return x.UnknownCount } - return nil + return 0 } -func (x *Node) GetDeletionTimestamp() *timestamppb.Timestamp { +func (x *NodeInfo) GetPriceSourceCounts() map[string]int32 { if x != nil { - return x.DeletionTimestamp + return x.PriceSourceCounts } return nil } -type AttachedVolume struct { +// ResourceInfo provides counts of resources and their scheduling states. +type ResourceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DevicePath string `protobuf:"bytes,2,opt,name=device_path,json=devicePath,proto3" json:"device_path,omitempty"` + ResourcesCount int32 `protobuf:"varint,1,opt,name=resources_count,json=resourcesCount,proto3" json:"resources_count,omitempty"` // Total number of resources. + ScheduledResourceCount int32 `protobuf:"varint,2,opt,name=scheduled_resource_count,json=scheduledResourceCount,proto3" json:"scheduled_resource_count,omitempty"` // Number of scheduled resources. + UnscheduledResourceCount int32 `protobuf:"varint,3,opt,name=unscheduled_resource_count,json=unscheduledResourceCount,proto3" json:"unscheduled_resource_count,omitempty"` // Number of unscheduled resources. + UnknownResourceCount int32 `protobuf:"varint,4,opt,name=unknown_resource_count,json=unknownResourceCount,proto3" json:"unknown_resource_count,omitempty"` // Number of resources in unknown state. } -func (x *AttachedVolume) Reset() { - *x = AttachedVolume{} +func (x *ResourceInfo) Reset() { + *x = ResourceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[14] + mi := &file_api_v1_common_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AttachedVolume) String() string { +func (x *ResourceInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AttachedVolume) ProtoMessage() {} +func (*ResourceInfo) ProtoMessage() {} -func (x *AttachedVolume) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[14] +func (x *ResourceInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3430,58 +3901,128 @@ func (x *AttachedVolume) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AttachedVolume.ProtoReflect.Descriptor instead. -func (*AttachedVolume) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{14} +// Deprecated: Use ResourceInfo.ProtoReflect.Descriptor instead. +func (*ResourceInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{18} } -func (x *AttachedVolume) GetName() string { +func (x *ResourceInfo) GetResourcesCount() int32 { if x != nil { - return x.Name + return x.ResourcesCount } - return "" + return 0 } -func (x *AttachedVolume) GetDevicePath() string { +func (x *ResourceInfo) GetScheduledResourceCount() int32 { if x != nil { - return x.DevicePath + return x.ScheduledResourceCount } - return "" + return 0 } -// NodeGroup represents a group of Kubernetes nodes with aggregated metrics. -type NodeGroup struct { +func (x *ResourceInfo) GetUnscheduledResourceCount() int32 { + if x != nil { + return x.UnscheduledResourceCount + } + return 0 +} + +func (x *ResourceInfo) GetUnknownResourceCount() int32 { + if x != nil { + return x.UnknownResourceCount + } + return 0 +} + +// Node represents a Kubernetes node with metadata, metrics, and cost information. +type Node struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. - Nodes []*Node `protobuf:"bytes,2,rep,name=nodes,proto3" json:"nodes,omitempty"` // Nodes in the group. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the node group. - CostInfo *CostInfo `protobuf:"bytes,4,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the node group. - NodeInfo *NodeInfo `protobuf:"bytes,5,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Node count breakdown for the node group. - ResourceInfo *ResourceInfo `protobuf:"bytes,6,opt,name=resource_info,json=resourceInfo,proto3" json:"resource_info,omitempty"` // Resource scheduling information for the node group. - CostDataPoints []*CostDataPoint `protobuf:"bytes,11,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node group. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,12,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node group. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the node. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the node. + InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` // Instance type of the node. + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` // Type/category of the node. + Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` // Region where the node is deployed. + Zone string `protobuf:"bytes,6,opt,name=zone,proto3" json:"zone,omitempty"` // Zone where the node is deployed. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,7,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource utilization metrics for the node. + CostInfo *CostInfo `protobuf:"bytes,8,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the node. + NodeCreatedAt int64 `protobuf:"varint,9,opt,name=node_created_at,json=nodeCreatedAt,proto3" json:"node_created_at,omitempty"` // Node creation time as a Unix timestamp. + IsReady bool `protobuf:"varint,10,opt,name=is_ready,json=isReady,proto3" json:"is_ready,omitempty"` // Indicates whether the node is ready. + ContainerRuntime *ContainerRuntimeInfo `protobuf:"bytes,20,opt,name=container_runtime,json=containerRuntime,proto3,oneof" json:"container_runtime,omitempty"` + NodeGroupName string `protobuf:"bytes,30,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` // it is what the variable says it is + ResourceDetails *ResourceDetails `protobuf:"bytes,40,opt,name=resource_details,json=resourceDetails,proto3" json:"resource_details,omitempty"` // if withDetails is true + // metadata if withMetadata is true + OwnerKind string `protobuf:"bytes,41,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. + OwnerUid string `protobuf:"bytes,42,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. + Children []*WorkloadItem `protobuf:"bytes,43,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. + Labels map[string]string `protobuf:"bytes,44,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. + Annotations map[string]string `protobuf:"bytes,45,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. + // Pricing information (legacy float fields - deprecated) + // + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerHour float64 `protobuf:"fixed64,50,opt,name=price_per_hour,json=pricePerHour,proto3" json:"price_per_hour,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerVcpu float64 `protobuf:"fixed64,51,opt,name=price_per_vcpu,json=pricePerVcpu,proto3" json:"price_per_vcpu,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerGib float64 `protobuf:"fixed64,52,opt,name=price_per_gib,json=pricePerGib,proto3" json:"price_per_gib,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerGpu float64 `protobuf:"fixed64,53,opt,name=price_per_gpu,json=pricePerGpu,proto3" json:"price_per_gpu,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + CpuPrice float64 `protobuf:"fixed64,54,opt,name=cpu_price,json=cpuPrice,proto3" json:"cpu_price,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + MemoryPrice float64 `protobuf:"fixed64,55,opt,name=memory_price,json=memoryPrice,proto3" json:"memory_price,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + GpuPrice float64 `protobuf:"fixed64,56,opt,name=gpu_price,json=gpuPrice,proto3" json:"gpu_price,omitempty"` + // Pricing information (using Money type for currency flexibility) + MoneyPricePerHour *money.Money `protobuf:"bytes,57,opt,name=money_price_per_hour,json=moneyPricePerHour,proto3" json:"money_price_per_hour,omitempty"` + MoneyEffPeriodTotalCost *money.Money `protobuf:"bytes,58,opt,name=money_eff_period_total_cost,json=moneyEffPeriodTotalCost,proto3" json:"money_eff_period_total_cost,omitempty"` + MoneyPricePerVcpu *money.Money `protobuf:"bytes,59,opt,name=money_price_per_vcpu,json=moneyPricePerVcpu,proto3" json:"money_price_per_vcpu,omitempty"` + MoneyPricePerGib *money.Money `protobuf:"bytes,80,opt,name=money_price_per_gib,json=moneyPricePerGib,proto3" json:"money_price_per_gib,omitempty"` + MoneyPricePerGpu *money.Money `protobuf:"bytes,81,opt,name=money_price_per_gpu,json=moneyPricePerGpu,proto3" json:"money_price_per_gpu,omitempty"` + MoneyCpuPrice *money.Money `protobuf:"bytes,82,opt,name=money_cpu_price,json=moneyCpuPrice,proto3" json:"money_cpu_price,omitempty"` + MoneyMemoryPrice *money.Money `protobuf:"bytes,83,opt,name=money_memory_price,json=moneyMemoryPrice,proto3" json:"money_memory_price,omitempty"` + MoneyGpuPrice *money.Money `protobuf:"bytes,84,opt,name=money_gpu_price,json=moneyGpuPrice,proto3" json:"money_gpu_price,omitempty"` + // Commitment pricing: original on-demand list price and billing source. + // money_price_per_hour holds the effective (RI/SP-adjusted) price. + // money_on_demand_price_per_hour holds the baseline list price before any discount. + // For on-demand and spot nodes both fields are equal. + MoneyOnDemandPricePerHour *money.Money `protobuf:"bytes,85,opt,name=money_on_demand_price_per_hour,json=moneyOnDemandPricePerHour,proto3" json:"money_on_demand_price_per_hour,omitempty"` + PriceSource string `protobuf:"bytes,86,opt,name=price_source,json=priceSource,proto3" json:"price_source,omitempty"` // "ri_exact", "ri_flexible", "sp_api_rate", "sp_estimated", "mixed", "spot", "on_demand", "unknown" + PricingAccuracy string `protobuf:"bytes,87,opt,name=pricing_accuracy,json=pricingAccuracy,proto3" json:"pricing_accuracy,omitempty"` // "accurate", "estimated", "fallback", "unknown" + // Enhanced node classification + ExtractedNodeType string `protobuf:"bytes,60,opt,name=extracted_node_type,json=extractedNodeType,proto3" json:"extracted_node_type,omitempty"` // "spot", "on-demand", "reserved" + AvailabilityZone string `protobuf:"bytes,61,opt,name=availability_zone,json=availabilityZone,proto3" json:"availability_zone,omitempty"` // Multi-cloud AZ extraction + // Kubernetes metadata + KubernetesUid string `protobuf:"bytes,62,opt,name=kubernetes_uid,json=kubernetesUid,proto3" json:"kubernetes_uid,omitempty"` + ResourceVersion string `protobuf:"bytes,63,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + // Volume and storage information + VolumesInUse []string `protobuf:"bytes,65,rep,name=volumes_in_use,json=volumesInUse,proto3" json:"volumes_in_use,omitempty"` + VolumesAttached []*AttachedVolume `protobuf:"bytes,66,rep,name=volumes_attached,json=volumesAttached,proto3" json:"volumes_attached,omitempty"` + // Timing information + LastSeen *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,71,opt,name=collected_at,json=collectedAt,proto3" json:"collected_at,omitempty"` + DeletionTimestamp *timestamppb.Timestamp `protobuf:"bytes,72,opt,name=deletion_timestamp,json=deletionTimestamp,proto3" json:"deletion_timestamp,omitempty"` } -func (x *NodeGroup) Reset() { - *x = NodeGroup{} +func (x *Node) Reset() { + *x = Node{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[15] + mi := &file_api_v1_common_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroup) String() string { +func (x *Node) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroup) ProtoMessage() {} +func (*Node) ProtoMessage() {} -func (x *NodeGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[15] +func (x *Node) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3492,508 +4033,359 @@ func (x *NodeGroup) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroup.ProtoReflect.Descriptor instead. -func (*NodeGroup) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{15} +// Deprecated: Use Node.ProtoReflect.Descriptor instead. +func (*Node) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{19} } -func (x *NodeGroup) GetName() string { +func (x *Node) GetId() string { if x != nil { - return x.Name + return x.Id } return "" } -func (x *NodeGroup) GetNodes() []*Node { +func (x *Node) GetName() string { if x != nil { - return x.Nodes + return x.Name } - return nil + return "" } -func (x *NodeGroup) GetResourceMetrics() *ResourceMetrics { +func (x *Node) GetInstanceType() string { if x != nil { - return x.ResourceMetrics + return x.InstanceType } - return nil + return "" } -func (x *NodeGroup) GetCostInfo() *CostInfo { +func (x *Node) GetType() string { if x != nil { - return x.CostInfo + return x.Type } - return nil + return "" } -func (x *NodeGroup) GetNodeInfo() *NodeInfo { +func (x *Node) GetRegion() string { if x != nil { - return x.NodeInfo + return x.Region } - return nil + return "" } -func (x *NodeGroup) GetResourceInfo() *ResourceInfo { +func (x *Node) GetZone() string { if x != nil { - return x.ResourceInfo + return x.Zone } - return nil + return "" } -func (x *NodeGroup) GetCostDataPoints() []*CostDataPoint { +func (x *Node) GetResourceMetrics() *ResourceMetrics { if x != nil { - return x.CostDataPoints + return x.ResourceMetrics } return nil } -func (x *NodeGroup) GetResourceDataPoints() []*ResourceDataPoint { +func (x *Node) GetCostInfo() *CostInfo { if x != nil { - return x.ResourceDataPoints + return x.CostInfo } return nil } -// CostDataPoint represents cost information at a specific time. -type CostDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the data point. -} - -func (x *CostDataPoint) Reset() { - *x = CostDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CostDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CostDataPoint) ProtoMessage() {} - -func (x *CostDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[16] - 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 CostDataPoint.ProtoReflect.Descriptor instead. -func (*CostDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{16} -} - -func (x *CostDataPoint) GetTimestamp() int64 { +func (x *Node) GetNodeCreatedAt() int64 { if x != nil { - return x.Timestamp + return x.NodeCreatedAt } return 0 } -func (x *CostDataPoint) GetCostInfo() *CostInfo { +func (x *Node) GetIsReady() bool { if x != nil { - return x.CostInfo - } - return nil -} - -// ResourceDataPoint represents resource utilization at a specific time. -type ResourceDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the data point. -} - -func (x *ResourceDataPoint) Reset() { - *x = ResourceDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + return x.IsReady } + return false } -func (x *ResourceDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResourceDataPoint) ProtoMessage() {} - -func (x *ResourceDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetContainerRuntime() *ContainerRuntimeInfo { + if x != nil { + return x.ContainerRuntime } - return mi.MessageOf(x) -} - -// Deprecated: Use ResourceDataPoint.ProtoReflect.Descriptor instead. -func (*ResourceDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{17} + return nil } -func (x *ResourceDataPoint) GetTimestamp() int64 { +func (x *Node) GetNodeGroupName() string { if x != nil { - return x.Timestamp + return x.NodeGroupName } - return 0 + return "" } -func (x *ResourceDataPoint) GetResourceMetrics() *ResourceMetrics { +func (x *Node) GetResourceDetails() *ResourceDetails { if x != nil { - return x.ResourceMetrics + return x.ResourceDetails } return nil } -// ContainerTimeSeries contains time-series resource metrics for a single container. -type ContainerTimeSeries struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,2,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` -} - -func (x *ContainerTimeSeries) Reset() { - *x = ContainerTimeSeries{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContainerTimeSeries) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContainerTimeSeries) ProtoMessage() {} - -func (x *ContainerTimeSeries) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetOwnerKind() string { + if x != nil { + return x.OwnerKind } - return mi.MessageOf(x) -} - -// Deprecated: Use ContainerTimeSeries.ProtoReflect.Descriptor instead. -func (*ContainerTimeSeries) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{18} + return "" } -func (x *ContainerTimeSeries) GetContainerName() string { +func (x *Node) GetOwnerUid() string { if x != nil { - return x.ContainerName + return x.OwnerUid } return "" } -func (x *ContainerTimeSeries) GetResourceDataPoints() []*ResourceDataPoint { +func (x *Node) GetChildren() []*WorkloadItem { if x != nil { - return x.ResourceDataPoints + return x.Children } return nil } -type SavingsData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CpuSavingsMillicores float64 `protobuf:"fixed64,1,opt,name=cpu_savings_millicores,json=cpuSavingsMillicores,proto3" json:"cpu_savings_millicores,omitempty"` - CpuHighWaterMark float64 `protobuf:"fixed64,2,opt,name=cpu_high_water_mark,json=cpuHighWaterMark,proto3" json:"cpu_high_water_mark,omitempty"` - ActualCpuRequest float64 `protobuf:"fixed64,3,opt,name=actual_cpu_request,json=actualCpuRequest,proto3" json:"actual_cpu_request,omitempty"` - CumulativeCpuSavingsMillicores float64 `protobuf:"fixed64,4,opt,name=cumulative_cpu_savings_millicores,json=cumulativeCpuSavingsMillicores,proto3" json:"cumulative_cpu_savings_millicores,omitempty"` - CpuCostWithoutAutoscaler float64 `protobuf:"fixed64,5,opt,name=cpu_cost_without_autoscaler,json=cpuCostWithoutAutoscaler,proto3" json:"cpu_cost_without_autoscaler,omitempty"` // hypothetical cost w/ chart-level request - ActualCpuCost float64 `protobuf:"fixed64,6,opt,name=actual_cpu_cost,json=actualCpuCost,proto3" json:"actual_cpu_cost,omitempty"` // what you paid - CpuCostSavings float64 `protobuf:"fixed64,7,opt,name=cpu_cost_savings,json=cpuCostSavings,proto3" json:"cpu_cost_savings,omitempty"` // autoscaler impact (5 - 6) - CpuUsageCost float64 `protobuf:"fixed64,8,opt,name=cpu_usage_cost,json=cpuUsageCost,proto3" json:"cpu_usage_cost,omitempty"` // based on actual usage - CpuCostWaste float64 `protobuf:"fixed64,9,opt,name=cpu_cost_waste,json=cpuCostWaste,proto3" json:"cpu_cost_waste,omitempty"` // 6 - 8 -} - -func (x *SavingsData) Reset() { - *x = SavingsData{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetLabels() map[string]string { + if x != nil { + return x.Labels } + return nil } -func (x *SavingsData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SavingsData) ProtoMessage() {} - -func (x *SavingsData) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations } - return mi.MessageOf(x) + return nil } -// Deprecated: Use SavingsData.ProtoReflect.Descriptor instead. -func (*SavingsData) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{19} +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerHour() float64 { + if x != nil { + return x.PricePerHour + } + return 0 } -func (x *SavingsData) GetCpuSavingsMillicores() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerVcpu() float64 { if x != nil { - return x.CpuSavingsMillicores + return x.PricePerVcpu } return 0 } -func (x *SavingsData) GetCpuHighWaterMark() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerGib() float64 { if x != nil { - return x.CpuHighWaterMark + return x.PricePerGib } return 0 } -func (x *SavingsData) GetActualCpuRequest() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerGpu() float64 { if x != nil { - return x.ActualCpuRequest + return x.PricePerGpu } return 0 } -func (x *SavingsData) GetCumulativeCpuSavingsMillicores() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetCpuPrice() float64 { if x != nil { - return x.CumulativeCpuSavingsMillicores + return x.CpuPrice } return 0 } -func (x *SavingsData) GetCpuCostWithoutAutoscaler() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetMemoryPrice() float64 { if x != nil { - return x.CpuCostWithoutAutoscaler + return x.MemoryPrice } return 0 } -func (x *SavingsData) GetActualCpuCost() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetGpuPrice() float64 { if x != nil { - return x.ActualCpuCost + return x.GpuPrice } return 0 } -func (x *SavingsData) GetCpuCostSavings() float64 { +func (x *Node) GetMoneyPricePerHour() *money.Money { if x != nil { - return x.CpuCostSavings + return x.MoneyPricePerHour } - return 0 + return nil } -func (x *SavingsData) GetCpuUsageCost() float64 { +func (x *Node) GetMoneyEffPeriodTotalCost() *money.Money { if x != nil { - return x.CpuUsageCost + return x.MoneyEffPeriodTotalCost } - return 0 + return nil } -func (x *SavingsData) GetCpuCostWaste() float64 { +func (x *Node) GetMoneyPricePerVcpu() *money.Money { if x != nil { - return x.CpuCostWaste + return x.MoneyPricePerVcpu } - return 0 + return nil } -type SavingsDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - SavingsData *SavingsData `protobuf:"bytes,2,opt,name=savings_data,json=savingsData,proto3" json:"savings_data,omitempty"` -} - -func (x *SavingsDataPoint) Reset() { - *x = SavingsDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetMoneyPricePerGib() *money.Money { + if x != nil { + return x.MoneyPricePerGib } + return nil } -func (x *SavingsDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Node) GetMoneyPricePerGpu() *money.Money { + if x != nil { + return x.MoneyPricePerGpu + } + return nil } -func (*SavingsDataPoint) ProtoMessage() {} - -func (x *SavingsDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetMoneyCpuPrice() *money.Money { + if x != nil { + return x.MoneyCpuPrice } - return mi.MessageOf(x) + return nil } -// Deprecated: Use SavingsDataPoint.ProtoReflect.Descriptor instead. -func (*SavingsDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{20} +func (x *Node) GetMoneyMemoryPrice() *money.Money { + if x != nil { + return x.MoneyMemoryPrice + } + return nil } -func (x *SavingsDataPoint) GetTimestamp() int64 { +func (x *Node) GetMoneyGpuPrice() *money.Money { if x != nil { - return x.Timestamp + return x.MoneyGpuPrice } - return 0 + return nil } -func (x *SavingsDataPoint) GetSavingsData() *SavingsData { +func (x *Node) GetMoneyOnDemandPricePerHour() *money.Money { if x != nil { - return x.SavingsData + return x.MoneyOnDemandPricePerHour } return nil } -type SavingsTimeSeries struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Node) GetPriceSource() string { + if x != nil { + return x.PriceSource + } + return "" +} - SavingsDatapoints []*SavingsDataPoint `protobuf:"bytes,1,rep,name=savings_datapoints,json=savingsDatapoints,proto3" json:"savings_datapoints,omitempty"` - TotalCpuSavingsMillicores float64 `protobuf:"fixed64,2,opt,name=total_cpu_savings_millicores,json=totalCpuSavingsMillicores,proto3" json:"total_cpu_savings_millicores,omitempty"` - TotalCpuCostSavings float64 `protobuf:"fixed64,3,opt,name=total_cpu_cost_savings,json=totalCpuCostSavings,proto3" json:"total_cpu_cost_savings,omitempty"` - TotalCpuCostWaste float64 `protobuf:"fixed64,4,opt,name=total_cpu_cost_waste,json=totalCpuCostWaste,proto3" json:"total_cpu_cost_waste,omitempty"` +func (x *Node) GetPricingAccuracy() string { + if x != nil { + return x.PricingAccuracy + } + return "" } -func (x *SavingsTimeSeries) Reset() { - *x = SavingsTimeSeries{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetExtractedNodeType() string { + if x != nil { + return x.ExtractedNodeType } + return "" } -func (x *SavingsTimeSeries) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Node) GetAvailabilityZone() string { + if x != nil { + return x.AvailabilityZone + } + return "" } -func (*SavingsTimeSeries) ProtoMessage() {} +func (x *Node) GetKubernetesUid() string { + if x != nil { + return x.KubernetesUid + } + return "" +} -func (x *SavingsTimeSeries) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetResourceVersion() string { + if x != nil { + return x.ResourceVersion } - return mi.MessageOf(x) + return "" } -// Deprecated: Use SavingsTimeSeries.ProtoReflect.Descriptor instead. -func (*SavingsTimeSeries) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{21} +func (x *Node) GetVolumesInUse() []string { + if x != nil { + return x.VolumesInUse + } + return nil } -func (x *SavingsTimeSeries) GetSavingsDatapoints() []*SavingsDataPoint { +func (x *Node) GetVolumesAttached() []*AttachedVolume { if x != nil { - return x.SavingsDatapoints + return x.VolumesAttached } return nil } -func (x *SavingsTimeSeries) GetTotalCpuSavingsMillicores() float64 { +func (x *Node) GetLastSeen() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuSavingsMillicores + return x.LastSeen } - return 0 + return nil } -func (x *SavingsTimeSeries) GetTotalCpuCostSavings() float64 { +func (x *Node) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuCostSavings + return x.CollectedAt } - return 0 + return nil } -func (x *SavingsTimeSeries) GetTotalCpuCostWaste() float64 { +func (x *Node) GetDeletionTimestamp() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuCostWaste + return x.DeletionTimestamp } - return 0 + return nil } -// LabelSelectorRequirement is a selector that contains values, a key, and an operator that -// relates the key and values. -type LabelSelectorRequirement struct { +type AttachedVolume struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // key is the label key that the selector applies to. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // operator represents a key's relationship to a set of values. - // Valid operators are In, NotIn, Exists and DoesNotExist. - Operator LabelSelectorOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=api.v1.LabelSelectorOperator" json:"operator,omitempty"` - // values is an array of string values. If the operator is In or NotIn, - // the values array must be non-empty. If the operator is Exists or DoesNotExist, - // the values array must be empty. This array is replaced during a strategic - // merge patch. - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DevicePath string `protobuf:"bytes,2,opt,name=device_path,json=devicePath,proto3" json:"device_path,omitempty"` } -func (x *LabelSelectorRequirement) Reset() { - *x = LabelSelectorRequirement{} +func (x *AttachedVolume) Reset() { + *x = AttachedVolume{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[22] + mi := &file_api_v1_common_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSelectorRequirement) String() string { +func (x *AttachedVolume) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSelectorRequirement) ProtoMessage() {} +func (*AttachedVolume) ProtoMessage() {} -func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[22] +func (x *AttachedVolume) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4004,58 +4396,58 @@ func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSelectorRequirement.ProtoReflect.Descriptor instead. -func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{22} +// Deprecated: Use AttachedVolume.ProtoReflect.Descriptor instead. +func (*AttachedVolume) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{20} } -func (x *LabelSelectorRequirement) GetKey() string { +func (x *AttachedVolume) GetName() string { if x != nil { - return x.Key + return x.Name } return "" } -func (x *LabelSelectorRequirement) GetOperator() LabelSelectorOperator { - if x != nil { - return x.Operator - } - return LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED -} - -func (x *LabelSelectorRequirement) GetValues() []string { +func (x *AttachedVolume) GetDevicePath() string { if x != nil { - return x.Values + return x.DevicePath } - return nil + return "" } -type Label struct { +// NodeGroup represents a group of Kubernetes nodes with aggregated metrics. +type NodeGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. + Nodes []*Node `protobuf:"bytes,2,rep,name=nodes,proto3" json:"nodes,omitempty"` // Nodes in the group. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the node group. + CostInfo *CostInfo `protobuf:"bytes,4,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the node group. + NodeInfo *NodeInfo `protobuf:"bytes,5,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Node count breakdown for the node group. + ResourceInfo *ResourceInfo `protobuf:"bytes,6,opt,name=resource_info,json=resourceInfo,proto3" json:"resource_info,omitempty"` // Resource scheduling information for the node group. + CostDataPoints []*CostDataPoint `protobuf:"bytes,11,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node group. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,12,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node group. } -func (x *Label) Reset() { - *x = Label{} +func (x *NodeGroup) Reset() { + *x = NodeGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[23] + mi := &file_api_v1_common_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Label) String() string { +func (x *NodeGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Label) ProtoMessage() {} +func (*NodeGroup) ProtoMessage() {} -func (x *Label) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[23] +func (x *NodeGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,62 +4458,94 @@ func (x *Label) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Label.ProtoReflect.Descriptor instead. -func (*Label) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{23} +// Deprecated: Use NodeGroup.ProtoReflect.Descriptor instead. +func (*NodeGroup) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{21} } -func (x *Label) GetKey() string { +func (x *NodeGroup) GetName() string { if x != nil { - return x.Key + return x.Name } return "" } -func (x *Label) GetValue() string { +func (x *NodeGroup) GetNodes() []*Node { if x != nil { - return x.Value + return x.Nodes } - return "" + return nil } -// LabelSelector is a label query over a set of resources. The result of matchLabels and -// matchExpressions are ANDed. An empty label selector matches all objects. A null -// label selector matches no objects. -type LabelSelector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodeGroup) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} - // Department-style labels for backwards compatibility - // - // Deprecated: Marked as deprecated in api/v1/common.proto. - Labels []*Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` // Deprecated: Label is still used for departments but we will soon migrate to match_label and match_expressions - // matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - // map is equivalent to an element of matchExpressions, whose key field is "key", the - // operator is "In", and the values array contains only "value". The requirements are ANDed. - MatchLabels map[string]string `protobuf:"bytes,2,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // matchExpressions is a list of label selector requirements. The requirements are ANDed. - MatchExpressions []*LabelSelectorRequirement `protobuf:"bytes,3,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` +func (x *NodeGroup) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil } -func (x *LabelSelector) Reset() { - *x = LabelSelector{} +func (x *NodeGroup) GetNodeInfo() *NodeInfo { + if x != nil { + return x.NodeInfo + } + return nil +} + +func (x *NodeGroup) GetResourceInfo() *ResourceInfo { + if x != nil { + return x.ResourceInfo + } + return nil +} + +func (x *NodeGroup) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *NodeGroup) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// CostDataPoint represents cost information at a specific time. +type CostDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the data point. +} + +func (x *CostDataPoint) Reset() { + *x = CostDataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[24] + mi := &file_api_v1_common_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSelector) String() string { +func (x *CostDataPoint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSelector) ProtoMessage() {} +func (*CostDataPoint) ProtoMessage() {} -func (x *LabelSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[24] +func (x *CostDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4132,60 +4556,108 @@ func (x *LabelSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSelector.ProtoReflect.Descriptor instead. -func (*LabelSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{24} +// Deprecated: Use CostDataPoint.ProtoReflect.Descriptor instead. +func (*CostDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{22} } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *LabelSelector) GetLabels() []*Label { +func (x *CostDataPoint) GetTimestamp() int64 { if x != nil { - return x.Labels + return x.Timestamp } - return nil + return 0 } -func (x *LabelSelector) GetMatchLabels() map[string]string { +func (x *CostDataPoint) GetCostInfo() *CostInfo { if x != nil { - return x.MatchLabels + return x.CostInfo } return nil } -func (x *LabelSelector) GetMatchExpressions() []*LabelSelectorRequirement { +// ResourceDataPoint represents resource utilization at a specific time. +type ResourceDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the data point. +} + +func (x *ResourceDataPoint) Reset() { + *x = ResourceDataPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceDataPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDataPoint) ProtoMessage() {} + +func (x *ResourceDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[23] + 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 ResourceDataPoint.ProtoReflect.Descriptor instead. +func (*ResourceDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{23} +} + +func (x *ResourceDataPoint) GetTimestamp() int64 { if x != nil { - return x.MatchExpressions + return x.Timestamp + } + return 0 +} + +func (x *ResourceDataPoint) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics } return nil } -// RegexPattern represents a regex pattern with optional flags -type RegexPattern struct { +// ContainerTimeSeries contains time-series resource metrics for a single container. +type ContainerTimeSeries struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` - Flags string `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"` // case-insensitive, etc. (optional) + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,2,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` } -func (x *RegexPattern) Reset() { - *x = RegexPattern{} +func (x *ContainerTimeSeries) Reset() { + *x = ContainerTimeSeries{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[25] + mi := &file_api_v1_common_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RegexPattern) String() string { +func (x *ContainerTimeSeries) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RegexPattern) ProtoMessage() {} +func (*ContainerTimeSeries) ProtoMessage() {} -func (x *RegexPattern) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[25] +func (x *ContainerTimeSeries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4196,249 +4668,58 @@ func (x *RegexPattern) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RegexPattern.ProtoReflect.Descriptor instead. -func (*RegexPattern) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{25} +// Deprecated: Use ContainerTimeSeries.ProtoReflect.Descriptor instead. +func (*ContainerTimeSeries) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{24} } -func (x *RegexPattern) GetPattern() string { +func (x *ContainerTimeSeries) GetContainerName() string { if x != nil { - return x.Pattern + return x.ContainerName } return "" } -func (x *RegexPattern) GetFlags() string { +func (x *ContainerTimeSeries) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.Flags + return x.ResourceDataPoints } - return "" + return nil } -// ResourceDetails contains resource-specific information flattened for easy frontend access -type ResourceDetails struct { +type SavingsData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Types that are assignable to Details: - // - // *ResourceDetails_PodDetails - // *ResourceDetails_DeploymentDetails - // *ResourceDetails_StatefulSetDetails - // *ResourceDetails_DaemonSetDetails - // *ResourceDetails_ReplicaSetDetails - // *ResourceDetails_JobDetails - // *ResourceDetails_CronJobDetails - // *ResourceDetails_ServiceDetails - // *ResourceDetails_IngressDetails - // *ResourceDetails_PvcDetails - // *ResourceDetails_PvDetails - // *ResourceDetails_ScDetails - // *ResourceDetails_NsDetails - // *ResourceDetails_NodeDetails - // *ResourceDetails_HpaDetails - // *ResourceDetails_VpaDetails - // *ResourceDetails_LimitRangeDetails - // *ResourceDetails_ServiceAccountDetails - // *ResourceDetails_RoleDetails - // *ResourceDetails_RoleBindingDetails - // *ResourceDetails_KedaScaledObjectDetails - // *ResourceDetails_KarpenterResourceDetails - // *ResourceDetails_PodDisruptionBudgetDetails - // *ResourceDetails_ResourceQuotaDetails - // *ResourceDetails_VolcanoJobDetails - // *ResourceDetails_SparkApplicationDetails - // *ResourceDetails_ScheduledSparkApplicationDetails - Details isResourceDetails_Details `protobuf_oneof:"details"` - // Common fields that can be flattened at this level for easier access - // These are populated based on the resource type - Phase string `protobuf:"bytes,10,opt,name=phase,proto3" json:"phase,omitempty"` // Pod phase: "Running", "Pending", "Succeeded", "Failed", "Unknown" - PodIp string `protobuf:"bytes,11,opt,name=pod_ip,json=podIp,proto3" json:"pod_ip,omitempty"` // Pod IP from status.podIP - HostIp string `protobuf:"bytes,12,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` // Host IP from status.hostIP - NodeName string `protobuf:"bytes,13,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Node name where pod is scheduled - Ready bool `protobuf:"varint,14,opt,name=ready,proto3" json:"ready,omitempty"` // Pod ready status from conditions - QosClass string `protobuf:"bytes,15,opt,name=qos_class,json=qosClass,proto3" json:"qos_class,omitempty"` // Pod QoS class: "Guaranteed", "Burstable", "BestEffort" - ContainerCount int32 `protobuf:"varint,16,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of containers in the pod - RestartCount int32 `protobuf:"varint,17,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Sum of all container restart counts - // Resource requests/limits from Pod spec (static declarations) - CpuRequestsMillicores int64 `protobuf:"varint,20,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // Sum of all container CPU requests in millicores - MemoryRequestsBytes int64 `protobuf:"varint,21,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Sum of all container memory requests in bytes - CpuLimitsMillicores int64 `protobuf:"varint,22,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // Sum of all container CPU limits in millicores - MemoryLimitsBytes int64 `protobuf:"varint,23,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Sum of all container memory limits in bytes - StatusReason string `protobuf:"bytes,30,opt,name=status_reason,json=statusReason,proto3" json:"status_reason,omitempty"` // Reason for current status (e.g., "ImagePullBackOff", "Completed") - ControlledBy string `protobuf:"bytes,31,opt,name=controlled_by,json=controlledBy,proto3" json:"controlled_by,omitempty"` // Friendly owner name (e.g., "deployment/my-app", "daemonset/logs") - Age string `protobuf:"bytes,32,opt,name=age,proto3" json:"age,omitempty"` // Human-readable age since creation (e.g., "2h", "5m", "10d") - // Deployment-specific fields (flattened for easy access) - ReplicasDesired int32 `protobuf:"varint,40,opt,name=replicas_desired,json=replicasDesired,proto3" json:"replicas_desired,omitempty"` // Desired replicas from spec.replicas - ReplicasReady int32 `protobuf:"varint,41,opt,name=replicas_ready,json=replicasReady,proto3" json:"replicas_ready,omitempty"` // Ready replicas from status.readyReplicas - ReplicasAvailable int32 `protobuf:"varint,42,opt,name=replicas_available,json=replicasAvailable,proto3" json:"replicas_available,omitempty"` // Available replicas from status.availableReplicas - ReplicasUpdated int32 `protobuf:"varint,43,opt,name=replicas_updated,json=replicasUpdated,proto3" json:"replicas_updated,omitempty"` // Updated replicas from status.updatedReplicas - StrategyType string `protobuf:"bytes,44,opt,name=strategy_type,json=strategyType,proto3" json:"strategy_type,omitempty"` // Deployment strategy: "RollingUpdate", "Recreate" - Available bool `protobuf:"varint,45,opt,name=available,proto3" json:"available,omitempty"` // Deployment Available condition status - Progressing bool `protobuf:"varint,46,opt,name=progressing,proto3" json:"progressing,omitempty"` // Deployment Progressing condition status - DeploymentStatus string `protobuf:"bytes,47,opt,name=deployment_status,json=deploymentStatus,proto3" json:"deployment_status,omitempty"` // Overall status: "Available", "Progressing", "Failed" - Images []string `protobuf:"bytes,48,rep,name=images,proto3" json:"images,omitempty"` // Unique container images used - // StatefulSet-specific fields (reuses deployment replica fields 40-43) - ServiceName string `protobuf:"bytes,60,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Headless service name for StatefulSet - PodManagementPolicy string `protobuf:"bytes,61,opt,name=pod_management_policy,json=podManagementPolicy,proto3" json:"pod_management_policy,omitempty"` // "OrderedReady" or "Parallel" - UpdateStrategyType string `protobuf:"bytes,62,opt,name=update_strategy_type,json=updateStrategyType,proto3" json:"update_strategy_type,omitempty"` // "RollingUpdate" (StatefulSet strategy) - VolumeClaimTemplateCount int32 `protobuf:"varint,63,opt,name=volume_claim_template_count,json=volumeClaimTemplateCount,proto3" json:"volume_claim_template_count,omitempty"` // Number of persistent volume claim templates - PvcRetentionPolicy string `protobuf:"bytes,64,opt,name=pvc_retention_policy,json=pvcRetentionPolicy,proto3" json:"pvc_retention_policy,omitempty"` // "Retain" or "Delete" for PVC retention - CurrentRevision string `protobuf:"bytes,65,opt,name=current_revision,json=currentRevision,proto3" json:"current_revision,omitempty"` // Current StatefulSet revision - UpdateRevision string `protobuf:"bytes,66,opt,name=update_revision,json=updateRevision,proto3" json:"update_revision,omitempty"` // Update StatefulSet revision - // DaemonSet-specific fields (nodes instead of replicas) - NodesDesired int32 `protobuf:"varint,70,opt,name=nodes_desired,json=nodesDesired,proto3" json:"nodes_desired,omitempty"` // Desired nodes to schedule on (desiredNumberScheduled) - NodesReady int32 `protobuf:"varint,71,opt,name=nodes_ready,json=nodesReady,proto3" json:"nodes_ready,omitempty"` // Ready nodes (numberReady) - NodesAvailable int32 `protobuf:"varint,72,opt,name=nodes_available,json=nodesAvailable,proto3" json:"nodes_available,omitempty"` // Available nodes (numberAvailable) - NodesCurrent int32 `protobuf:"varint,73,opt,name=nodes_current,json=nodesCurrent,proto3" json:"nodes_current,omitempty"` // Currently scheduled nodes (currentNumberScheduled) - NodesUpdated int32 `protobuf:"varint,74,opt,name=nodes_updated,json=nodesUpdated,proto3" json:"nodes_updated,omitempty"` // Updated nodes (updatedNumberScheduled) - NodesMisscheduled int32 `protobuf:"varint,75,opt,name=nodes_misscheduled,json=nodesMisscheduled,proto3" json:"nodes_misscheduled,omitempty"` // Misscheduled nodes (numberMisscheduled) - MaxUnavailable string `protobuf:"bytes,76,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // RollingUpdate maxUnavailable setting - PriorityClass string `protobuf:"bytes,77,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name - // Job-specific fields - JobCompletionsDesired int32 `protobuf:"varint,80,opt,name=job_completions_desired,json=jobCompletionsDesired,proto3" json:"job_completions_desired,omitempty"` // Desired number of completions from spec.completions - JobCompletionsSucceeded int32 `protobuf:"varint,81,opt,name=job_completions_succeeded,json=jobCompletionsSucceeded,proto3" json:"job_completions_succeeded,omitempty"` // Number of succeeded pods from status.succeeded - JobParallelism int32 `protobuf:"varint,82,opt,name=job_parallelism,json=jobParallelism,proto3" json:"job_parallelism,omitempty"` // Maximum number of pods that can run in parallel - JobBackoffLimit int32 `protobuf:"varint,83,opt,name=job_backoff_limit,json=jobBackoffLimit,proto3" json:"job_backoff_limit,omitempty"` // Number of retries before marking job as failed - JobCompletionMode string `protobuf:"bytes,84,opt,name=job_completion_mode,json=jobCompletionMode,proto3" json:"job_completion_mode,omitempty"` // "NonIndexed" or "Indexed" - JobSuspended bool `protobuf:"varint,85,opt,name=job_suspended,json=jobSuspended,proto3" json:"job_suspended,omitempty"` // Whether the job is suspended - JobDuration string `protobuf:"bytes,86,opt,name=job_duration,json=jobDuration,proto3" json:"job_duration,omitempty"` // Duration from start to completion (or current time) - JobStatus string `protobuf:"bytes,87,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` // Overall job status: "Complete", "Failed", "Running", "Suspended" - JobActivePods int32 `protobuf:"varint,88,opt,name=job_active_pods,json=jobActivePods,proto3" json:"job_active_pods,omitempty"` // Number of actively running pods - JobFailedPods int32 `protobuf:"varint,89,opt,name=job_failed_pods,json=jobFailedPods,proto3" json:"job_failed_pods,omitempty"` // Number of failed pods - // CronJob-specific fields - CronSchedule string `protobuf:"bytes,90,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"` // Cron schedule expression (e.g., "0 */6 * * *") - CronSuspended bool `protobuf:"varint,91,opt,name=cron_suspended,json=cronSuspended,proto3" json:"cron_suspended,omitempty"` // Whether the cron job is suspended - CronActiveJobs int32 `protobuf:"varint,92,opt,name=cron_active_jobs,json=cronActiveJobs,proto3" json:"cron_active_jobs,omitempty"` // Number of currently active jobs - CronLastScheduleTime string `protobuf:"bytes,93,opt,name=cron_last_schedule_time,json=cronLastScheduleTime,proto3" json:"cron_last_schedule_time,omitempty"` // Last time the job was scheduled (RFC3339 format) - CronNextScheduleTime string `protobuf:"bytes,94,opt,name=cron_next_schedule_time,json=cronNextScheduleTime,proto3" json:"cron_next_schedule_time,omitempty"` // Next scheduled time (calculated, RFC3339 format) - CronConcurrencyPolicy string `protobuf:"bytes,95,opt,name=cron_concurrency_policy,json=cronConcurrencyPolicy,proto3" json:"cron_concurrency_policy,omitempty"` // "Allow", "Forbid", "Replace" - CronSuccessfulJobsLimit int32 `protobuf:"varint,96,opt,name=cron_successful_jobs_limit,json=cronSuccessfulJobsLimit,proto3" json:"cron_successful_jobs_limit,omitempty"` // Number of successful job history to retain - CronFailedJobsLimit int32 `protobuf:"varint,97,opt,name=cron_failed_jobs_limit,json=cronFailedJobsLimit,proto3" json:"cron_failed_jobs_limit,omitempty"` // Number of failed job history to retain - CronStartingDeadlineSeconds int32 `protobuf:"varint,98,opt,name=cron_starting_deadline_seconds,json=cronStartingDeadlineSeconds,proto3" json:"cron_starting_deadline_seconds,omitempty"` // Optional deadline in seconds for starting the job - // Service-specific fields - ServiceType string `protobuf:"bytes,100,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"` // Service type: "ClusterIP", "NodePort", "LoadBalancer", "ExternalName" - ServiceClusterIp string `protobuf:"bytes,101,opt,name=service_cluster_ip,json=serviceClusterIp,proto3" json:"service_cluster_ip,omitempty"` // Cluster IP address - ServiceExternalIps []string `protobuf:"bytes,102,rep,name=service_external_ips,json=serviceExternalIps,proto3" json:"service_external_ips,omitempty"` // External IP addresses (from spec or loadbalancer status) - ServicePorts []*ServicePort `protobuf:"bytes,103,rep,name=service_ports,json=servicePorts,proto3" json:"service_ports,omitempty"` // Service ports information - ServiceSelector map[string]string `protobuf:"bytes,104,rep,name=service_selector,json=serviceSelector,proto3" json:"service_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector labels - ServiceSessionAffinity string `protobuf:"bytes,105,opt,name=service_session_affinity,json=serviceSessionAffinity,proto3" json:"service_session_affinity,omitempty"` // Session affinity: "None" or "ClientIP" - ServiceExternalTrafficPolicy string `protobuf:"bytes,106,opt,name=service_external_traffic_policy,json=serviceExternalTrafficPolicy,proto3" json:"service_external_traffic_policy,omitempty"` // "Cluster" or "Local" - ServiceInternalTrafficPolicy string `protobuf:"bytes,107,opt,name=service_internal_traffic_policy,json=serviceInternalTrafficPolicy,proto3" json:"service_internal_traffic_policy,omitempty"` // "Cluster" or "Local" - ServiceLoadBalancerSourceRanges []string `protobuf:"bytes,108,rep,name=service_load_balancer_source_ranges,json=serviceLoadBalancerSourceRanges,proto3" json:"service_load_balancer_source_ranges,omitempty"` // LoadBalancer source ranges - ServiceLoadBalancerClass string `protobuf:"bytes,109,opt,name=service_load_balancer_class,json=serviceLoadBalancerClass,proto3" json:"service_load_balancer_class,omitempty"` // LoadBalancer class - ServiceIpFamilies []string `protobuf:"bytes,110,rep,name=service_ip_families,json=serviceIpFamilies,proto3" json:"service_ip_families,omitempty"` // IP families: ["IPv4"], ["IPv6"], or ["IPv4", "IPv6"] - ServiceIpFamilyPolicy string `protobuf:"bytes,111,opt,name=service_ip_family_policy,json=serviceIpFamilyPolicy,proto3" json:"service_ip_family_policy,omitempty"` // "SingleStack", "PreferDualStack", "RequireDualStack" - // Ingress-specific fields - IngressClassName string `protobuf:"bytes,120,opt,name=ingress_class_name,json=ingressClassName,proto3" json:"ingress_class_name,omitempty"` // Ingress class name (e.g., "nginx", "traefik") - IngressHosts []string `protobuf:"bytes,121,rep,name=ingress_hosts,json=ingressHosts,proto3" json:"ingress_hosts,omitempty"` // List of hosts served by this ingress - IngressPaths []string `protobuf:"bytes,122,rep,name=ingress_paths,json=ingressPaths,proto3" json:"ingress_paths,omitempty"` // List of paths served by this ingress - IngressBackends []string `protobuf:"bytes,123,rep,name=ingress_backends,json=ingressBackends,proto3" json:"ingress_backends,omitempty"` // List of backend services - IngressTlsHosts []string `protobuf:"bytes,124,rep,name=ingress_tls_hosts,json=ingressTlsHosts,proto3" json:"ingress_tls_hosts,omitempty"` // Hosts covered by TLS - IngressTlsSecrets []string `protobuf:"bytes,125,rep,name=ingress_tls_secrets,json=ingressTlsSecrets,proto3" json:"ingress_tls_secrets,omitempty"` // TLS secret names - IngressLoadBalancerIps []string `protobuf:"bytes,126,rep,name=ingress_load_balancer_ips,json=ingressLoadBalancerIps,proto3" json:"ingress_load_balancer_ips,omitempty"` // Load balancer IPs/hostnames from status - IngressRulesCount int32 `protobuf:"varint,127,opt,name=ingress_rules_count,json=ingressRulesCount,proto3" json:"ingress_rules_count,omitempty"` // Number of ingress rules - IngressTlsCount int32 `protobuf:"varint,128,opt,name=ingress_tls_count,json=ingressTlsCount,proto3" json:"ingress_tls_count,omitempty"` // Number of TLS configurations - IngressHasDefaultBackend bool `protobuf:"varint,129,opt,name=ingress_has_default_backend,json=ingressHasDefaultBackend,proto3" json:"ingress_has_default_backend,omitempty"` // Whether ingress has a default backend - // PersistentVolumeClaim-specific fields - PvcStorageClassName string `protobuf:"bytes,130,opt,name=pvc_storage_class_name,json=pvcStorageClassName,proto3" json:"pvc_storage_class_name,omitempty"` // Storage class name (e.g., "gp2", "fast-ssd") - PvcRequestedCapacity string `protobuf:"bytes,131,opt,name=pvc_requested_capacity,json=pvcRequestedCapacity,proto3" json:"pvc_requested_capacity,omitempty"` // Requested storage capacity (e.g., "50Gi") - PvcActualCapacity string `protobuf:"bytes,132,opt,name=pvc_actual_capacity,json=pvcActualCapacity,proto3" json:"pvc_actual_capacity,omitempty"` // Actual allocated capacity from status (e.g., "100Gi") - PvcAccessModes []string `protobuf:"bytes,133,rep,name=pvc_access_modes,json=pvcAccessModes,proto3" json:"pvc_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] - PvcVolumeMode string `protobuf:"bytes,134,opt,name=pvc_volume_mode,json=pvcVolumeMode,proto3" json:"pvc_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" - PvcVolumeName string `protobuf:"bytes,135,opt,name=pvc_volume_name,json=pvcVolumeName,proto3" json:"pvc_volume_name,omitempty"` // Bound persistent volume name - PvcStatus string `protobuf:"bytes,136,opt,name=pvc_status,json=pvcStatus,proto3" json:"pvc_status,omitempty"` // PVC status: "Pending", "Bound", "Lost" - PvcIsBound bool `protobuf:"varint,137,opt,name=pvc_is_bound,json=pvcIsBound,proto3" json:"pvc_is_bound,omitempty"` // Whether PVC is bound to a PV - PvcSelectorMatchLabels string `protobuf:"bytes,138,opt,name=pvc_selector_match_labels,json=pvcSelectorMatchLabels,proto3" json:"pvc_selector_match_labels,omitempty"` // Selector labels for PV binding (JSON string) - PvcAllowedTopologies []string `protobuf:"bytes,139,rep,name=pvc_allowed_topologies,json=pvcAllowedTopologies,proto3" json:"pvc_allowed_topologies,omitempty"` // Allowed node topologies - // PersistentVolume-specific fields - PvStorageClassName string `protobuf:"bytes,150,opt,name=pv_storage_class_name,json=pvStorageClassName,proto3" json:"pv_storage_class_name,omitempty"` // Storage class name (e.g., "standard-rwo", "fast-ssd") - PvCapacity string `protobuf:"bytes,151,opt,name=pv_capacity,json=pvCapacity,proto3" json:"pv_capacity,omitempty"` // Storage capacity (e.g., "5Gi") - PvAccessModes []string `protobuf:"bytes,152,rep,name=pv_access_modes,json=pvAccessModes,proto3" json:"pv_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] - PvReclaimPolicy string `protobuf:"bytes,153,opt,name=pv_reclaim_policy,json=pvReclaimPolicy,proto3" json:"pv_reclaim_policy,omitempty"` // Reclaim policy: "Retain", "Delete", "Recycle" - PvClaimRefName string `protobuf:"bytes,154,opt,name=pv_claim_ref_name,json=pvClaimRefName,proto3" json:"pv_claim_ref_name,omitempty"` // Referenced PVC name - PvClaimRefNamespace string `protobuf:"bytes,155,opt,name=pv_claim_ref_namespace,json=pvClaimRefNamespace,proto3" json:"pv_claim_ref_namespace,omitempty"` // Referenced PVC namespace - PvStatus string `protobuf:"bytes,156,opt,name=pv_status,json=pvStatus,proto3" json:"pv_status,omitempty"` // PV status: "Available", "Bound", "Released", "Failed" - PvIsBound bool `protobuf:"varint,157,opt,name=pv_is_bound,json=pvIsBound,proto3" json:"pv_is_bound,omitempty"` // Whether PV is bound to a PVC - PvVolumeMode string `protobuf:"bytes,158,opt,name=pv_volume_mode,json=pvVolumeMode,proto3" json:"pv_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" - PvCsiDriver string `protobuf:"bytes,159,opt,name=pv_csi_driver,json=pvCsiDriver,proto3" json:"pv_csi_driver,omitempty"` // CSI driver name (if using CSI) - PvVolumeSourceType string `protobuf:"bytes,160,opt,name=pv_volume_source_type,json=pvVolumeSourceType,proto3" json:"pv_volume_source_type,omitempty"` // Volume source type: "CSI", "HostPath", "NFS", "AWS EBS", etc. - PvNodeAffinityZones []string `protobuf:"bytes,161,rep,name=pv_node_affinity_zones,json=pvNodeAffinityZones,proto3" json:"pv_node_affinity_zones,omitempty"` // Node affinity zones/regions - // StorageClass-specific fields - ScProvisioner string `protobuf:"bytes,170,opt,name=sc_provisioner,json=scProvisioner,proto3" json:"sc_provisioner,omitempty"` // Storage provisioner (e.g., "kubernetes.io/aws-ebs", "pd.csi.storage.gke.io") - ScReclaimPolicy string `protobuf:"bytes,171,opt,name=sc_reclaim_policy,json=scReclaimPolicy,proto3" json:"sc_reclaim_policy,omitempty"` // Default reclaim policy: "Retain", "Delete" - ScVolumeBindingMode string `protobuf:"bytes,172,opt,name=sc_volume_binding_mode,json=scVolumeBindingMode,proto3" json:"sc_volume_binding_mode,omitempty"` // Volume binding mode: "Immediate", "WaitForFirstConsumer" - ScAllowVolumeExpansion bool `protobuf:"varint,173,opt,name=sc_allow_volume_expansion,json=scAllowVolumeExpansion,proto3" json:"sc_allow_volume_expansion,omitempty"` // Whether volume expansion is allowed - ScParameters map[string]string `protobuf:"bytes,174,rep,name=sc_parameters,json=scParameters,proto3" json:"sc_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters (type, encrypted, etc.) - ScAllowedTopologies []string `protobuf:"bytes,175,rep,name=sc_allowed_topologies,json=scAllowedTopologies,proto3" json:"sc_allowed_topologies,omitempty"` // Allowed topologies for volumes - ScMountOptions []string `protobuf:"bytes,176,rep,name=sc_mount_options,json=scMountOptions,proto3" json:"sc_mount_options,omitempty"` // Default mount options - // Namespace fields (name|status|age + additional) - NsStatus string `protobuf:"bytes,177,opt,name=ns_status,json=nsStatus,proto3" json:"ns_status,omitempty"` // Namespace status/phase: "Active", "Terminating" - NsFinalizers []string `protobuf:"bytes,178,rep,name=ns_finalizers,json=nsFinalizers,proto3" json:"ns_finalizers,omitempty"` // Finalizers preventing deletion - // Node fields (name|cpu|memory|ready|taints|roles|internal IP|external IP|version|age + additional) - NodeCpuCapacity string `protobuf:"bytes,179,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // CPU capacity (e.g., "16", "15890m") - NodeMemoryCapacity string `protobuf:"bytes,180,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Memory capacity (e.g., "64422188Ki") - NodeReady bool `protobuf:"varint,181,opt,name=node_ready,json=nodeReady,proto3" json:"node_ready,omitempty"` // Node ready status - NodeTaints []*NodeTaint `protobuf:"bytes,182,rep,name=node_taints,json=nodeTaints,proto3" json:"node_taints,omitempty"` // Node taints affecting scheduling - NodeRoles []string `protobuf:"bytes,183,rep,name=node_roles,json=nodeRoles,proto3" json:"node_roles,omitempty"` // Node roles (master, worker, etc.) - NodeInternalIp string `protobuf:"bytes,184,opt,name=node_internal_ip,json=nodeInternalIp,proto3" json:"node_internal_ip,omitempty"` // Internal IP address - NodeExternalIp string `protobuf:"bytes,185,opt,name=node_external_ip,json=nodeExternalIp,proto3" json:"node_external_ip,omitempty"` // External IP address (if any) - NodeVersion string `protobuf:"bytes,186,opt,name=node_version,json=nodeVersion,proto3" json:"node_version,omitempty"` // Kubelet version - NodeInstanceType string `protobuf:"bytes,187,opt,name=node_instance_type,json=nodeInstanceType,proto3" json:"node_instance_type,omitempty"` // Cloud instance type (e.g., "m5.xlarge") - NodeOs string `protobuf:"bytes,188,opt,name=node_os,json=nodeOs,proto3" json:"node_os,omitempty"` // Operating system - NodeContainerRuntime string `protobuf:"bytes,189,opt,name=node_container_runtime,json=nodeContainerRuntime,proto3" json:"node_container_runtime,omitempty"` // Container runtime version - NodeImageCount int32 `protobuf:"varint,190,opt,name=node_image_count,json=nodeImageCount,proto3" json:"node_image_count,omitempty"` // Number of container images - // HorizontalPodAutoscaler-specific fields - HpaMinReplicas int32 `protobuf:"varint,200,opt,name=hpa_min_replicas,json=hpaMinReplicas,proto3" json:"hpa_min_replicas,omitempty"` // Minimum replicas from spec.minReplicas - HpaMaxReplicas int32 `protobuf:"varint,201,opt,name=hpa_max_replicas,json=hpaMaxReplicas,proto3" json:"hpa_max_replicas,omitempty"` // Maximum replicas from spec.maxReplicas - HpaCurrentReplicas int32 `protobuf:"varint,202,opt,name=hpa_current_replicas,json=hpaCurrentReplicas,proto3" json:"hpa_current_replicas,omitempty"` // Current replicas from status.currentReplicas - HpaDesiredReplicas int32 `protobuf:"varint,203,opt,name=hpa_desired_replicas,json=hpaDesiredReplicas,proto3" json:"hpa_desired_replicas,omitempty"` // Desired replicas from status.desiredReplicas - HpaMetricsCount int32 `protobuf:"varint,204,opt,name=hpa_metrics_count,json=hpaMetricsCount,proto3" json:"hpa_metrics_count,omitempty"` // Number of metrics configured - HpaStatus string `protobuf:"bytes,205,opt,name=hpa_status,json=hpaStatus,proto3" json:"hpa_status,omitempty"` // HPA status: "Active", "Inactive", "Unknown" - HpaScaleUpStabilization int32 `protobuf:"varint,206,opt,name=hpa_scale_up_stabilization,json=hpaScaleUpStabilization,proto3" json:"hpa_scale_up_stabilization,omitempty"` // Scale up stabilization window seconds - HpaScaleDownStabilization int32 `protobuf:"varint,207,opt,name=hpa_scale_down_stabilization,json=hpaScaleDownStabilization,proto3" json:"hpa_scale_down_stabilization,omitempty"` // Scale down stabilization window seconds - // VerticalPodAutoscaler-specific fields - VpaUpdateMode string `protobuf:"bytes,210,opt,name=vpa_update_mode,json=vpaUpdateMode,proto3" json:"vpa_update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" - VpaPoliciesCount int32 `protobuf:"varint,211,opt,name=vpa_policies_count,json=vpaPoliciesCount,proto3" json:"vpa_policies_count,omitempty"` // Number of container policies configured - VpaRecommendationsCount int32 `protobuf:"varint,212,opt,name=vpa_recommendations_count,json=vpaRecommendationsCount,proto3" json:"vpa_recommendations_count,omitempty"` // Number of container recommendations available - VpaCpuTarget string `protobuf:"bytes,213,opt,name=vpa_cpu_target,json=vpaCpuTarget,proto3" json:"vpa_cpu_target,omitempty"` // CPU target recommendation (e.g., "100m") - VpaMemoryTarget string `protobuf:"bytes,214,opt,name=vpa_memory_target,json=vpaMemoryTarget,proto3" json:"vpa_memory_target,omitempty"` // Memory target recommendation (e.g., "128Mi") - VpaStatus string `protobuf:"bytes,215,opt,name=vpa_status,json=vpaStatus,proto3" json:"vpa_status,omitempty"` // VPA status: "Active", "No Recommendations" - // LimitRange-specific fields - LimitRangeItemsCount int32 `protobuf:"varint,220,opt,name=limit_range_items_count,json=limitRangeItemsCount,proto3" json:"limit_range_items_count,omitempty"` // Number of limit items configured - LimitRangeTypes []string `protobuf:"bytes,221,rep,name=limit_range_types,json=limitRangeTypes,proto3" json:"limit_range_types,omitempty"` // Types of limits: ["Container", "Pod", "PersistentVolumeClaim"] - LimitRangeHasDefaults bool `protobuf:"varint,222,opt,name=limit_range_has_defaults,json=limitRangeHasDefaults,proto3" json:"limit_range_has_defaults,omitempty"` // Whether default limits/requests are set - LimitRangeMaxCpu string `protobuf:"bytes,223,opt,name=limit_range_max_cpu,json=limitRangeMaxCpu,proto3" json:"limit_range_max_cpu,omitempty"` // Maximum CPU limit (e.g., "2") - LimitRangeMaxMemory string `protobuf:"bytes,224,opt,name=limit_range_max_memory,json=limitRangeMaxMemory,proto3" json:"limit_range_max_memory,omitempty"` // Maximum memory limit (e.g., "2Gi") - LimitRangeMinCpu string `protobuf:"bytes,225,opt,name=limit_range_min_cpu,json=limitRangeMinCpu,proto3" json:"limit_range_min_cpu,omitempty"` // Minimum CPU limit (e.g., "100m") - LimitRangeMinMemory string `protobuf:"bytes,226,opt,name=limit_range_min_memory,json=limitRangeMinMemory,proto3" json:"limit_range_min_memory,omitempty"` // Minimum memory limit (e.g., "64Mi") - LimitRangeDefaultCpuLimit string `protobuf:"bytes,227,opt,name=limit_range_default_cpu_limit,json=limitRangeDefaultCpuLimit,proto3" json:"limit_range_default_cpu_limit,omitempty"` // Default CPU limit (e.g., "500m") - LimitRangeDefaultMemoryLimit string `protobuf:"bytes,228,opt,name=limit_range_default_memory_limit,json=limitRangeDefaultMemoryLimit,proto3" json:"limit_range_default_memory_limit,omitempty"` // Default memory limit (e.g., "512Mi") - LimitRangeDefaultCpuRequest string `protobuf:"bytes,229,opt,name=limit_range_default_cpu_request,json=limitRangeDefaultCpuRequest,proto3" json:"limit_range_default_cpu_request,omitempty"` // Default CPU request (e.g., "200m") - LimitRangeDefaultMemoryRequest string `protobuf:"bytes,230,opt,name=limit_range_default_memory_request,json=limitRangeDefaultMemoryRequest,proto3" json:"limit_range_default_memory_request,omitempty"` // Default memory request (e.g., "256Mi") - LimitRangeStatus string `protobuf:"bytes,231,opt,name=limit_range_status,json=limitRangeStatus,proto3" json:"limit_range_status,omitempty"` // LimitRange status (always "Active") - ResourceVersion string `protobuf:"bytes,240,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Service account resource version - ApiVersion string `protobuf:"bytes,241,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + CpuSavingsMillicores float64 `protobuf:"fixed64,1,opt,name=cpu_savings_millicores,json=cpuSavingsMillicores,proto3" json:"cpu_savings_millicores,omitempty"` + CpuHighWaterMark float64 `protobuf:"fixed64,2,opt,name=cpu_high_water_mark,json=cpuHighWaterMark,proto3" json:"cpu_high_water_mark,omitempty"` + ActualCpuRequest float64 `protobuf:"fixed64,3,opt,name=actual_cpu_request,json=actualCpuRequest,proto3" json:"actual_cpu_request,omitempty"` + CumulativeCpuSavingsMillicores float64 `protobuf:"fixed64,4,opt,name=cumulative_cpu_savings_millicores,json=cumulativeCpuSavingsMillicores,proto3" json:"cumulative_cpu_savings_millicores,omitempty"` + CpuCostWithoutAutoscaler float64 `protobuf:"fixed64,5,opt,name=cpu_cost_without_autoscaler,json=cpuCostWithoutAutoscaler,proto3" json:"cpu_cost_without_autoscaler,omitempty"` // hypothetical cost w/ chart-level request + ActualCpuCost float64 `protobuf:"fixed64,6,opt,name=actual_cpu_cost,json=actualCpuCost,proto3" json:"actual_cpu_cost,omitempty"` // what you paid + CpuCostSavings float64 `protobuf:"fixed64,7,opt,name=cpu_cost_savings,json=cpuCostSavings,proto3" json:"cpu_cost_savings,omitempty"` // autoscaler impact (5 - 6) + CpuUsageCost float64 `protobuf:"fixed64,8,opt,name=cpu_usage_cost,json=cpuUsageCost,proto3" json:"cpu_usage_cost,omitempty"` // based on actual usage + CpuCostWaste float64 `protobuf:"fixed64,9,opt,name=cpu_cost_waste,json=cpuCostWaste,proto3" json:"cpu_cost_waste,omitempty"` // 6 - 8 } -func (x *ResourceDetails) Reset() { - *x = ResourceDetails{} +func (x *SavingsData) Reset() { + *x = SavingsData{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[26] + mi := &file_api_v1_common_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceDetails) String() string { +func (x *SavingsData) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceDetails) ProtoMessage() {} +func (*SavingsData) ProtoMessage() {} -func (x *ResourceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[26] +func (x *SavingsData) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4449,1483 +4730,2592 @@ func (x *ResourceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceDetails.ProtoReflect.Descriptor instead. -func (*ResourceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{26} +// Deprecated: Use SavingsData.ProtoReflect.Descriptor instead. +func (*SavingsData) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{25} } -func (m *ResourceDetails) GetDetails() isResourceDetails_Details { - if m != nil { - return m.Details +func (x *SavingsData) GetCpuSavingsMillicores() float64 { + if x != nil { + return x.CpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetPodDetails() *PodDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PodDetails); ok { - return x.PodDetails +func (x *SavingsData) GetCpuHighWaterMark() float64 { + if x != nil { + return x.CpuHighWaterMark } - return nil + return 0 } -func (x *ResourceDetails) GetDeploymentDetails() *DeploymentDetails { - if x, ok := x.GetDetails().(*ResourceDetails_DeploymentDetails); ok { - return x.DeploymentDetails +func (x *SavingsData) GetActualCpuRequest() float64 { + if x != nil { + return x.ActualCpuRequest } - return nil + return 0 } -func (x *ResourceDetails) GetStatefulSetDetails() *StatefulSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_StatefulSetDetails); ok { - return x.StatefulSetDetails +func (x *SavingsData) GetCumulativeCpuSavingsMillicores() float64 { + if x != nil { + return x.CumulativeCpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetDaemonSetDetails() *DaemonSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_DaemonSetDetails); ok { - return x.DaemonSetDetails +func (x *SavingsData) GetCpuCostWithoutAutoscaler() float64 { + if x != nil { + return x.CpuCostWithoutAutoscaler } - return nil + return 0 } -func (x *ResourceDetails) GetReplicaSetDetails() *ReplicaSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ReplicaSetDetails); ok { - return x.ReplicaSetDetails +func (x *SavingsData) GetActualCpuCost() float64 { + if x != nil { + return x.ActualCpuCost } - return nil + return 0 } -func (x *ResourceDetails) GetJobDetails() *JobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_JobDetails); ok { - return x.JobDetails +func (x *SavingsData) GetCpuCostSavings() float64 { + if x != nil { + return x.CpuCostSavings } - return nil + return 0 } -func (x *ResourceDetails) GetCronJobDetails() *CronJobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_CronJobDetails); ok { - return x.CronJobDetails +func (x *SavingsData) GetCpuUsageCost() float64 { + if x != nil { + return x.CpuUsageCost } - return nil + return 0 } -func (x *ResourceDetails) GetServiceDetails() *ServiceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ServiceDetails); ok { - return x.ServiceDetails +func (x *SavingsData) GetCpuCostWaste() float64 { + if x != nil { + return x.CpuCostWaste } - return nil + return 0 } -func (x *ResourceDetails) GetIngressDetails() *IngressDetails { - if x, ok := x.GetDetails().(*ResourceDetails_IngressDetails); ok { - return x.IngressDetails - } - return nil -} +type SavingsDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetPvcDetails() *PersistentVolumeClaimDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PvcDetails); ok { - return x.PvcDetails - } - return nil + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + SavingsData *SavingsData `protobuf:"bytes,2,opt,name=savings_data,json=savingsData,proto3" json:"savings_data,omitempty"` } -func (x *ResourceDetails) GetPvDetails() *PersistentVolumeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PvDetails); ok { - return x.PvDetails +func (x *SavingsDataPoint) Reset() { + *x = SavingsDataPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetScDetails() *StorageClassDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ScDetails); ok { - return x.ScDetails - } - return nil +func (x *SavingsDataPoint) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetNsDetails() *NamespaceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_NsDetails); ok { - return x.NsDetails +func (*SavingsDataPoint) ProtoMessage() {} + +func (x *SavingsDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ResourceDetails) GetNodeDetails() *NodeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_NodeDetails); ok { - return x.NodeDetails - } - return nil +// Deprecated: Use SavingsDataPoint.ProtoReflect.Descriptor instead. +func (*SavingsDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{26} } -func (x *ResourceDetails) GetHpaDetails() *HPADetails { - if x, ok := x.GetDetails().(*ResourceDetails_HpaDetails); ok { - return x.HpaDetails +func (x *SavingsDataPoint) GetTimestamp() int64 { + if x != nil { + return x.Timestamp } - return nil + return 0 } -func (x *ResourceDetails) GetVpaDetails() *VPADetails { - if x, ok := x.GetDetails().(*ResourceDetails_VpaDetails); ok { - return x.VpaDetails +func (x *SavingsDataPoint) GetSavingsData() *SavingsData { + if x != nil { + return x.SavingsData } return nil } -func (x *ResourceDetails) GetLimitRangeDetails() *LimitRangeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_LimitRangeDetails); ok { - return x.LimitRangeDetails - } - return nil +type SavingsTimeSeries struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SavingsDatapoints []*SavingsDataPoint `protobuf:"bytes,1,rep,name=savings_datapoints,json=savingsDatapoints,proto3" json:"savings_datapoints,omitempty"` + TotalCpuSavingsMillicores float64 `protobuf:"fixed64,2,opt,name=total_cpu_savings_millicores,json=totalCpuSavingsMillicores,proto3" json:"total_cpu_savings_millicores,omitempty"` + TotalCpuCostSavings float64 `protobuf:"fixed64,3,opt,name=total_cpu_cost_savings,json=totalCpuCostSavings,proto3" json:"total_cpu_cost_savings,omitempty"` + TotalCpuCostWaste float64 `protobuf:"fixed64,4,opt,name=total_cpu_cost_waste,json=totalCpuCostWaste,proto3" json:"total_cpu_cost_waste,omitempty"` } -func (x *ResourceDetails) GetServiceAccountDetails() *ServiceAccountDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ServiceAccountDetails); ok { - return x.ServiceAccountDetails +func (x *SavingsTimeSeries) Reset() { + *x = SavingsTimeSeries{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetRoleDetails() *RoleDetails { - if x, ok := x.GetDetails().(*ResourceDetails_RoleDetails); ok { - return x.RoleDetails - } - return nil +func (x *SavingsTimeSeries) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetRoleBindingDetails() *RoleBindingDetails { - if x, ok := x.GetDetails().(*ResourceDetails_RoleBindingDetails); ok { - return x.RoleBindingDetails +func (*SavingsTimeSeries) ProtoMessage() {} + +func (x *SavingsTimeSeries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ResourceDetails) GetKedaScaledObjectDetails() *KedaScaledObjectDetails { - if x, ok := x.GetDetails().(*ResourceDetails_KedaScaledObjectDetails); ok { - return x.KedaScaledObjectDetails - } - return nil +// Deprecated: Use SavingsTimeSeries.ProtoReflect.Descriptor instead. +func (*SavingsTimeSeries) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{27} } -func (x *ResourceDetails) GetKarpenterResourceDetails() *KarpenterResourceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_KarpenterResourceDetails); ok { - return x.KarpenterResourceDetails +func (x *SavingsTimeSeries) GetSavingsDatapoints() []*SavingsDataPoint { + if x != nil { + return x.SavingsDatapoints } return nil } -func (x *ResourceDetails) GetPodDisruptionBudgetDetails() *PodDisruptionBudgetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PodDisruptionBudgetDetails); ok { - return x.PodDisruptionBudgetDetails +func (x *SavingsTimeSeries) GetTotalCpuSavingsMillicores() float64 { + if x != nil { + return x.TotalCpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetResourceQuotaDetails() *ResourceQuotaDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ResourceQuotaDetails); ok { - return x.ResourceQuotaDetails +func (x *SavingsTimeSeries) GetTotalCpuCostSavings() float64 { + if x != nil { + return x.TotalCpuCostSavings } - return nil + return 0 } -func (x *ResourceDetails) GetVolcanoJobDetails() *VolcanoJobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_VolcanoJobDetails); ok { - return x.VolcanoJobDetails +func (x *SavingsTimeSeries) GetTotalCpuCostWaste() float64 { + if x != nil { + return x.TotalCpuCostWaste } - return nil + return 0 } -func (x *ResourceDetails) GetSparkApplicationDetails() *SparkApplicationDetails { - if x, ok := x.GetDetails().(*ResourceDetails_SparkApplicationDetails); ok { - return x.SparkApplicationDetails - } - return nil +// LabelSelectorRequirement is a selector that contains values, a key, and an operator that +// relates the key and values. +type LabelSelectorRequirement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // key is the label key that the selector applies to. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // operator represents a key's relationship to a set of values. + // Valid operators are In, NotIn, Exists and DoesNotExist, but the DevZero + // department and workload filter paths honor only In and NotIn (see the + // LabelSelectorOperator caveats above, PC-1452). + Operator LabelSelectorOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=api.v1.LabelSelectorOperator" json:"operator,omitempty"` + // values is an array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. This array is replaced during a strategic + // merge patch. + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` } -func (x *ResourceDetails) GetScheduledSparkApplicationDetails() *ScheduledSparkApplicationDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ScheduledSparkApplicationDetails); ok { - return x.ScheduledSparkApplicationDetails +func (x *LabelSelectorRequirement) Reset() { + *x = LabelSelectorRequirement{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetPhase() string { - if x != nil { - return x.Phase - } - return "" +func (x *LabelSelectorRequirement) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetPodIp() string { - if x != nil { - return x.PodIp +func (*LabelSelectorRequirement) ProtoMessage() {} + +func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetHostIp() string { - if x != nil { - return x.HostIp - } - return "" +// Deprecated: Use LabelSelectorRequirement.ProtoReflect.Descriptor instead. +func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{28} } -func (x *ResourceDetails) GetNodeName() string { +func (x *LabelSelectorRequirement) GetKey() string { if x != nil { - return x.NodeName + return x.Key } return "" } -func (x *ResourceDetails) GetReady() bool { +func (x *LabelSelectorRequirement) GetOperator() LabelSelectorOperator { if x != nil { - return x.Ready + return x.Operator } - return false + return LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED } -func (x *ResourceDetails) GetQosClass() string { +func (x *LabelSelectorRequirement) GetValues() []string { if x != nil { - return x.QosClass + return x.Values } - return "" + return nil } -func (x *ResourceDetails) GetContainerCount() int32 { - if x != nil { - return x.ContainerCount - } - return 0 -} +type Label struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetRestartCount() int32 { - if x != nil { - return x.RestartCount - } - return 0 + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (x *ResourceDetails) GetCpuRequestsMillicores() int64 { - if x != nil { - return x.CpuRequestsMillicores +func (x *Label) Reset() { + *x = Label{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetMemoryRequestsBytes() int64 { - if x != nil { - return x.MemoryRequestsBytes - } - return 0 +func (x *Label) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetCpuLimitsMillicores() int64 { - if x != nil { - return x.CpuLimitsMillicores +func (*Label) ProtoMessage() {} + +func (x *Label) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *ResourceDetails) GetMemoryLimitsBytes() int64 { - if x != nil { - return x.MemoryLimitsBytes - } - return 0 +// Deprecated: Use Label.ProtoReflect.Descriptor instead. +func (*Label) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{29} } -func (x *ResourceDetails) GetStatusReason() string { +func (x *Label) GetKey() string { if x != nil { - return x.StatusReason + return x.Key } return "" } -func (x *ResourceDetails) GetControlledBy() string { - if x != nil { - return x.ControlledBy - } - return "" -} - -func (x *ResourceDetails) GetAge() string { +func (x *Label) GetValue() string { if x != nil { - return x.Age + return x.Value } return "" } -func (x *ResourceDetails) GetReplicasDesired() int32 { - if x != nil { - return x.ReplicasDesired - } - return 0 -} - -func (x *ResourceDetails) GetReplicasReady() int32 { - if x != nil { - return x.ReplicasReady - } - return 0 -} +// LabelSelector is a label query over a set of resources. The result of matchLabels and +// matchExpressions are ANDed. An empty label selector matches all objects. A null +// label selector matches no objects. +type LabelSelector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetReplicasAvailable() int32 { - if x != nil { - return x.ReplicasAvailable - } - return 0 + // Department-style labels for backwards compatibility + // + // Deprecated: Marked as deprecated in api/v1/common.proto. + Labels []*Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` // Deprecated: Label is still used for departments but we will soon migrate to match_label and match_expressions + // matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + // map is equivalent to an element of matchExpressions, whose key field is "key", the + // operator is "In", and the values array contains only "value". The requirements are ANDed. + MatchLabels map[string]string `protobuf:"bytes,2,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // matchExpressions is a list of label selector requirements. The requirements are ANDed. + MatchExpressions []*LabelSelectorRequirement `protobuf:"bytes,3,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` } -func (x *ResourceDetails) GetReplicasUpdated() int32 { - if x != nil { - return x.ReplicasUpdated +func (x *LabelSelector) Reset() { + *x = LabelSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetStrategyType() string { - if x != nil { - return x.StrategyType - } - return "" +func (x *LabelSelector) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetAvailable() bool { - if x != nil { - return x.Available - } - return false -} +func (*LabelSelector) ProtoMessage() {} -func (x *ResourceDetails) GetProgressing() bool { - if x != nil { - return x.Progressing +func (x *LabelSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *ResourceDetails) GetDeploymentStatus() string { - if x != nil { - return x.DeploymentStatus - } - return "" +// Deprecated: Use LabelSelector.ProtoReflect.Descriptor instead. +func (*LabelSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{30} } -func (x *ResourceDetails) GetImages() []string { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *LabelSelector) GetLabels() []*Label { if x != nil { - return x.Images + return x.Labels } return nil } -func (x *ResourceDetails) GetServiceName() string { - if x != nil { - return x.ServiceName - } - return "" -} - -func (x *ResourceDetails) GetPodManagementPolicy() string { - if x != nil { - return x.PodManagementPolicy - } - return "" -} - -func (x *ResourceDetails) GetUpdateStrategyType() string { - if x != nil { - return x.UpdateStrategyType - } - return "" -} - -func (x *ResourceDetails) GetVolumeClaimTemplateCount() int32 { - if x != nil { - return x.VolumeClaimTemplateCount - } - return 0 -} - -func (x *ResourceDetails) GetPvcRetentionPolicy() string { - if x != nil { - return x.PvcRetentionPolicy - } - return "" -} - -func (x *ResourceDetails) GetCurrentRevision() string { +func (x *LabelSelector) GetMatchLabels() map[string]string { if x != nil { - return x.CurrentRevision + return x.MatchLabels } - return "" + return nil } -func (x *ResourceDetails) GetUpdateRevision() string { +func (x *LabelSelector) GetMatchExpressions() []*LabelSelectorRequirement { if x != nil { - return x.UpdateRevision + return x.MatchExpressions } - return "" + return nil } -func (x *ResourceDetails) GetNodesDesired() int32 { - if x != nil { - return x.NodesDesired - } - return 0 -} +// RegexPattern represents a regex pattern with optional flags +type RegexPattern struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetNodesReady() int32 { - if x != nil { - return x.NodesReady - } - return 0 + Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` + Flags string `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"` // case-insensitive, etc. (optional) } -func (x *ResourceDetails) GetNodesAvailable() int32 { - if x != nil { - return x.NodesAvailable +func (x *RegexPattern) Reset() { + *x = RegexPattern{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetNodesCurrent() int32 { - if x != nil { - return x.NodesCurrent - } - return 0 +func (x *RegexPattern) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetNodesUpdated() int32 { - if x != nil { - return x.NodesUpdated - } - return 0 -} +func (*RegexPattern) ProtoMessage() {} -func (x *ResourceDetails) GetNodesMisscheduled() int32 { - if x != nil { - return x.NodesMisscheduled +func (x *RegexPattern) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *ResourceDetails) GetMaxUnavailable() string { - if x != nil { - return x.MaxUnavailable - } - return "" +// Deprecated: Use RegexPattern.ProtoReflect.Descriptor instead. +func (*RegexPattern) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{31} } -func (x *ResourceDetails) GetPriorityClass() string { +func (x *RegexPattern) GetPattern() string { if x != nil { - return x.PriorityClass + return x.Pattern } return "" } -func (x *ResourceDetails) GetJobCompletionsDesired() int32 { - if x != nil { - return x.JobCompletionsDesired - } - return 0 -} - -func (x *ResourceDetails) GetJobCompletionsSucceeded() int32 { - if x != nil { - return x.JobCompletionsSucceeded - } - return 0 -} - -func (x *ResourceDetails) GetJobParallelism() int32 { - if x != nil { - return x.JobParallelism - } - return 0 -} - -func (x *ResourceDetails) GetJobBackoffLimit() int32 { - if x != nil { - return x.JobBackoffLimit - } - return 0 -} - -func (x *ResourceDetails) GetJobCompletionMode() string { +func (x *RegexPattern) GetFlags() string { if x != nil { - return x.JobCompletionMode + return x.Flags } return "" } -func (x *ResourceDetails) GetJobSuspended() bool { - if x != nil { - return x.JobSuspended - } - return false -} +// ResourceDetails contains resource-specific information flattened for easy frontend access +type ResourceDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetJobDuration() string { - if x != nil { - return x.JobDuration + // Types that are assignable to Details: + // + // *ResourceDetails_PodDetails + // *ResourceDetails_DeploymentDetails + // *ResourceDetails_StatefulSetDetails + // *ResourceDetails_DaemonSetDetails + // *ResourceDetails_ReplicaSetDetails + // *ResourceDetails_JobDetails + // *ResourceDetails_CronJobDetails + // *ResourceDetails_ServiceDetails + // *ResourceDetails_IngressDetails + // *ResourceDetails_PvcDetails + // *ResourceDetails_PvDetails + // *ResourceDetails_ScDetails + // *ResourceDetails_NsDetails + // *ResourceDetails_NodeDetails + // *ResourceDetails_HpaDetails + // *ResourceDetails_VpaDetails + // *ResourceDetails_LimitRangeDetails + // *ResourceDetails_ServiceAccountDetails + // *ResourceDetails_RoleDetails + // *ResourceDetails_RoleBindingDetails + // *ResourceDetails_KedaScaledObjectDetails + // *ResourceDetails_KarpenterResourceDetails + // *ResourceDetails_PodDisruptionBudgetDetails + // *ResourceDetails_ResourceQuotaDetails + // *ResourceDetails_VolcanoJobDetails + // *ResourceDetails_SparkApplicationDetails + // *ResourceDetails_ScheduledSparkApplicationDetails + // *ResourceDetails_KyvernoPolicyDetails + // *ResourceDetails_KyvernoPolicyReportDetails + // *ResourceDetails_GatekeeperConstraintTemplateDetails + // *ResourceDetails_GatekeeperConstraintDetails + Details isResourceDetails_Details `protobuf_oneof:"details"` + // Common fields that can be flattened at this level for easier access + // These are populated based on the resource type + Phase string `protobuf:"bytes,10,opt,name=phase,proto3" json:"phase,omitempty"` // Pod phase: "Running", "Pending", "Succeeded", "Failed", "Unknown" + PodIp string `protobuf:"bytes,11,opt,name=pod_ip,json=podIp,proto3" json:"pod_ip,omitempty"` // Pod IP from status.podIP + HostIp string `protobuf:"bytes,12,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` // Host IP from status.hostIP + NodeName string `protobuf:"bytes,13,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Node name where pod is scheduled + Ready bool `protobuf:"varint,14,opt,name=ready,proto3" json:"ready,omitempty"` // Pod ready status from conditions + QosClass string `protobuf:"bytes,15,opt,name=qos_class,json=qosClass,proto3" json:"qos_class,omitempty"` // Pod QoS class: "Guaranteed", "Burstable", "BestEffort" + ContainerCount int32 `protobuf:"varint,16,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of containers in the pod + RestartCount int32 `protobuf:"varint,17,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Sum of all container restart counts + // Resource requests/limits from Pod spec (static declarations) + CpuRequestsMillicores int64 `protobuf:"varint,20,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // Sum of all container CPU requests in millicores + MemoryRequestsBytes int64 `protobuf:"varint,21,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Sum of all container memory requests in bytes + CpuLimitsMillicores int64 `protobuf:"varint,22,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // Sum of all container CPU limits in millicores + MemoryLimitsBytes int64 `protobuf:"varint,23,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Sum of all container memory limits in bytes + StatusReason string `protobuf:"bytes,30,opt,name=status_reason,json=statusReason,proto3" json:"status_reason,omitempty"` // Reason for current status (e.g., "ImagePullBackOff", "Completed") + ControlledBy string `protobuf:"bytes,31,opt,name=controlled_by,json=controlledBy,proto3" json:"controlled_by,omitempty"` // Friendly owner name (e.g., "deployment/my-app", "daemonset/logs") + Age string `protobuf:"bytes,32,opt,name=age,proto3" json:"age,omitempty"` // Human-readable age since creation (e.g., "2h", "5m", "10d") + // Deployment-specific fields (flattened for easy access) + ReplicasDesired int32 `protobuf:"varint,40,opt,name=replicas_desired,json=replicasDesired,proto3" json:"replicas_desired,omitempty"` // Desired replicas from spec.replicas + ReplicasReady int32 `protobuf:"varint,41,opt,name=replicas_ready,json=replicasReady,proto3" json:"replicas_ready,omitempty"` // Ready replicas from status.readyReplicas + ReplicasAvailable int32 `protobuf:"varint,42,opt,name=replicas_available,json=replicasAvailable,proto3" json:"replicas_available,omitempty"` // Available replicas from status.availableReplicas + ReplicasUpdated int32 `protobuf:"varint,43,opt,name=replicas_updated,json=replicasUpdated,proto3" json:"replicas_updated,omitempty"` // Updated replicas from status.updatedReplicas + StrategyType string `protobuf:"bytes,44,opt,name=strategy_type,json=strategyType,proto3" json:"strategy_type,omitempty"` // Deployment strategy: "RollingUpdate", "Recreate" + Available bool `protobuf:"varint,45,opt,name=available,proto3" json:"available,omitempty"` // Deployment Available condition status + Progressing bool `protobuf:"varint,46,opt,name=progressing,proto3" json:"progressing,omitempty"` // Deployment Progressing condition status + DeploymentStatus string `protobuf:"bytes,47,opt,name=deployment_status,json=deploymentStatus,proto3" json:"deployment_status,omitempty"` // Overall status: "Available", "Progressing", "Failed" + Images []string `protobuf:"bytes,48,rep,name=images,proto3" json:"images,omitempty"` // Unique container images used + // StatefulSet-specific fields (reuses deployment replica fields 40-43) + ServiceName string `protobuf:"bytes,60,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Headless service name for StatefulSet + PodManagementPolicy string `protobuf:"bytes,61,opt,name=pod_management_policy,json=podManagementPolicy,proto3" json:"pod_management_policy,omitempty"` // "OrderedReady" or "Parallel" + UpdateStrategyType string `protobuf:"bytes,62,opt,name=update_strategy_type,json=updateStrategyType,proto3" json:"update_strategy_type,omitempty"` // "RollingUpdate" (StatefulSet strategy) + VolumeClaimTemplateCount int32 `protobuf:"varint,63,opt,name=volume_claim_template_count,json=volumeClaimTemplateCount,proto3" json:"volume_claim_template_count,omitempty"` // Number of persistent volume claim templates + PvcRetentionPolicy string `protobuf:"bytes,64,opt,name=pvc_retention_policy,json=pvcRetentionPolicy,proto3" json:"pvc_retention_policy,omitempty"` // "Retain" or "Delete" for PVC retention + CurrentRevision string `protobuf:"bytes,65,opt,name=current_revision,json=currentRevision,proto3" json:"current_revision,omitempty"` // Current StatefulSet revision + UpdateRevision string `protobuf:"bytes,66,opt,name=update_revision,json=updateRevision,proto3" json:"update_revision,omitempty"` // Update StatefulSet revision + // DaemonSet-specific fields (nodes instead of replicas) + NodesDesired int32 `protobuf:"varint,70,opt,name=nodes_desired,json=nodesDesired,proto3" json:"nodes_desired,omitempty"` // Desired nodes to schedule on (desiredNumberScheduled) + NodesReady int32 `protobuf:"varint,71,opt,name=nodes_ready,json=nodesReady,proto3" json:"nodes_ready,omitempty"` // Ready nodes (numberReady) + NodesAvailable int32 `protobuf:"varint,72,opt,name=nodes_available,json=nodesAvailable,proto3" json:"nodes_available,omitempty"` // Available nodes (numberAvailable) + NodesCurrent int32 `protobuf:"varint,73,opt,name=nodes_current,json=nodesCurrent,proto3" json:"nodes_current,omitempty"` // Currently scheduled nodes (currentNumberScheduled) + NodesUpdated int32 `protobuf:"varint,74,opt,name=nodes_updated,json=nodesUpdated,proto3" json:"nodes_updated,omitempty"` // Updated nodes (updatedNumberScheduled) + NodesMisscheduled int32 `protobuf:"varint,75,opt,name=nodes_misscheduled,json=nodesMisscheduled,proto3" json:"nodes_misscheduled,omitempty"` // Misscheduled nodes (numberMisscheduled) + MaxUnavailable string `protobuf:"bytes,76,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // RollingUpdate maxUnavailable setting + PriorityClass string `protobuf:"bytes,77,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name + // Job-specific fields + JobCompletionsDesired int32 `protobuf:"varint,80,opt,name=job_completions_desired,json=jobCompletionsDesired,proto3" json:"job_completions_desired,omitempty"` // Desired number of completions from spec.completions + JobCompletionsSucceeded int32 `protobuf:"varint,81,opt,name=job_completions_succeeded,json=jobCompletionsSucceeded,proto3" json:"job_completions_succeeded,omitempty"` // Number of succeeded pods from status.succeeded + JobParallelism int32 `protobuf:"varint,82,opt,name=job_parallelism,json=jobParallelism,proto3" json:"job_parallelism,omitempty"` // Maximum number of pods that can run in parallel + JobBackoffLimit int32 `protobuf:"varint,83,opt,name=job_backoff_limit,json=jobBackoffLimit,proto3" json:"job_backoff_limit,omitempty"` // Number of retries before marking job as failed + JobCompletionMode string `protobuf:"bytes,84,opt,name=job_completion_mode,json=jobCompletionMode,proto3" json:"job_completion_mode,omitempty"` // "NonIndexed" or "Indexed" + JobSuspended bool `protobuf:"varint,85,opt,name=job_suspended,json=jobSuspended,proto3" json:"job_suspended,omitempty"` // Whether the job is suspended + JobDuration string `protobuf:"bytes,86,opt,name=job_duration,json=jobDuration,proto3" json:"job_duration,omitempty"` // Duration from start to completion (or current time) + JobStatus string `protobuf:"bytes,87,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` // Overall job status: "Complete", "Failed", "Running", "Suspended" + JobActivePods int32 `protobuf:"varint,88,opt,name=job_active_pods,json=jobActivePods,proto3" json:"job_active_pods,omitempty"` // Number of actively running pods + JobFailedPods int32 `protobuf:"varint,89,opt,name=job_failed_pods,json=jobFailedPods,proto3" json:"job_failed_pods,omitempty"` // Number of failed pods + // CronJob-specific fields + CronSchedule string `protobuf:"bytes,90,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"` // Cron schedule expression (e.g., "0 */6 * * *") + CronSuspended bool `protobuf:"varint,91,opt,name=cron_suspended,json=cronSuspended,proto3" json:"cron_suspended,omitempty"` // Whether the cron job is suspended + CronActiveJobs int32 `protobuf:"varint,92,opt,name=cron_active_jobs,json=cronActiveJobs,proto3" json:"cron_active_jobs,omitempty"` // Number of currently active jobs + CronLastScheduleTime string `protobuf:"bytes,93,opt,name=cron_last_schedule_time,json=cronLastScheduleTime,proto3" json:"cron_last_schedule_time,omitempty"` // Last time the job was scheduled (RFC3339 format) + CronNextScheduleTime string `protobuf:"bytes,94,opt,name=cron_next_schedule_time,json=cronNextScheduleTime,proto3" json:"cron_next_schedule_time,omitempty"` // Next scheduled time (calculated, RFC3339 format) + CronConcurrencyPolicy string `protobuf:"bytes,95,opt,name=cron_concurrency_policy,json=cronConcurrencyPolicy,proto3" json:"cron_concurrency_policy,omitempty"` // "Allow", "Forbid", "Replace" + CronSuccessfulJobsLimit int32 `protobuf:"varint,96,opt,name=cron_successful_jobs_limit,json=cronSuccessfulJobsLimit,proto3" json:"cron_successful_jobs_limit,omitempty"` // Number of successful job history to retain + CronFailedJobsLimit int32 `protobuf:"varint,97,opt,name=cron_failed_jobs_limit,json=cronFailedJobsLimit,proto3" json:"cron_failed_jobs_limit,omitempty"` // Number of failed job history to retain + CronStartingDeadlineSeconds int32 `protobuf:"varint,98,opt,name=cron_starting_deadline_seconds,json=cronStartingDeadlineSeconds,proto3" json:"cron_starting_deadline_seconds,omitempty"` // Optional deadline in seconds for starting the job + // Service-specific fields + ServiceType string `protobuf:"bytes,100,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"` // Service type: "ClusterIP", "NodePort", "LoadBalancer", "ExternalName" + ServiceClusterIp string `protobuf:"bytes,101,opt,name=service_cluster_ip,json=serviceClusterIp,proto3" json:"service_cluster_ip,omitempty"` // Cluster IP address + ServiceExternalIps []string `protobuf:"bytes,102,rep,name=service_external_ips,json=serviceExternalIps,proto3" json:"service_external_ips,omitempty"` // External IP addresses (from spec or loadbalancer status) + ServicePorts []*ServicePort `protobuf:"bytes,103,rep,name=service_ports,json=servicePorts,proto3" json:"service_ports,omitempty"` // Service ports information + ServiceSelector map[string]string `protobuf:"bytes,104,rep,name=service_selector,json=serviceSelector,proto3" json:"service_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector labels + ServiceSessionAffinity string `protobuf:"bytes,105,opt,name=service_session_affinity,json=serviceSessionAffinity,proto3" json:"service_session_affinity,omitempty"` // Session affinity: "None" or "ClientIP" + ServiceExternalTrafficPolicy string `protobuf:"bytes,106,opt,name=service_external_traffic_policy,json=serviceExternalTrafficPolicy,proto3" json:"service_external_traffic_policy,omitempty"` // "Cluster" or "Local" + ServiceInternalTrafficPolicy string `protobuf:"bytes,107,opt,name=service_internal_traffic_policy,json=serviceInternalTrafficPolicy,proto3" json:"service_internal_traffic_policy,omitempty"` // "Cluster" or "Local" + ServiceLoadBalancerSourceRanges []string `protobuf:"bytes,108,rep,name=service_load_balancer_source_ranges,json=serviceLoadBalancerSourceRanges,proto3" json:"service_load_balancer_source_ranges,omitempty"` // LoadBalancer source ranges + ServiceLoadBalancerClass string `protobuf:"bytes,109,opt,name=service_load_balancer_class,json=serviceLoadBalancerClass,proto3" json:"service_load_balancer_class,omitempty"` // LoadBalancer class + ServiceIpFamilies []string `protobuf:"bytes,110,rep,name=service_ip_families,json=serviceIpFamilies,proto3" json:"service_ip_families,omitempty"` // IP families: ["IPv4"], ["IPv6"], or ["IPv4", "IPv6"] + ServiceIpFamilyPolicy string `protobuf:"bytes,111,opt,name=service_ip_family_policy,json=serviceIpFamilyPolicy,proto3" json:"service_ip_family_policy,omitempty"` // "SingleStack", "PreferDualStack", "RequireDualStack" + // Ingress-specific fields + IngressClassName string `protobuf:"bytes,120,opt,name=ingress_class_name,json=ingressClassName,proto3" json:"ingress_class_name,omitempty"` // Ingress class name (e.g., "nginx", "traefik") + IngressHosts []string `protobuf:"bytes,121,rep,name=ingress_hosts,json=ingressHosts,proto3" json:"ingress_hosts,omitempty"` // List of hosts served by this ingress + IngressPaths []string `protobuf:"bytes,122,rep,name=ingress_paths,json=ingressPaths,proto3" json:"ingress_paths,omitempty"` // List of paths served by this ingress + IngressBackends []string `protobuf:"bytes,123,rep,name=ingress_backends,json=ingressBackends,proto3" json:"ingress_backends,omitempty"` // List of backend services + IngressTlsHosts []string `protobuf:"bytes,124,rep,name=ingress_tls_hosts,json=ingressTlsHosts,proto3" json:"ingress_tls_hosts,omitempty"` // Hosts covered by TLS + IngressTlsSecrets []string `protobuf:"bytes,125,rep,name=ingress_tls_secrets,json=ingressTlsSecrets,proto3" json:"ingress_tls_secrets,omitempty"` // TLS secret names + IngressLoadBalancerIps []string `protobuf:"bytes,126,rep,name=ingress_load_balancer_ips,json=ingressLoadBalancerIps,proto3" json:"ingress_load_balancer_ips,omitempty"` // Load balancer IPs/hostnames from status + IngressRulesCount int32 `protobuf:"varint,127,opt,name=ingress_rules_count,json=ingressRulesCount,proto3" json:"ingress_rules_count,omitempty"` // Number of ingress rules + IngressTlsCount int32 `protobuf:"varint,128,opt,name=ingress_tls_count,json=ingressTlsCount,proto3" json:"ingress_tls_count,omitempty"` // Number of TLS configurations + IngressHasDefaultBackend bool `protobuf:"varint,129,opt,name=ingress_has_default_backend,json=ingressHasDefaultBackend,proto3" json:"ingress_has_default_backend,omitempty"` // Whether ingress has a default backend + // PersistentVolumeClaim-specific fields + PvcStorageClassName string `protobuf:"bytes,130,opt,name=pvc_storage_class_name,json=pvcStorageClassName,proto3" json:"pvc_storage_class_name,omitempty"` // Storage class name (e.g., "gp2", "fast-ssd") + PvcRequestedCapacity string `protobuf:"bytes,131,opt,name=pvc_requested_capacity,json=pvcRequestedCapacity,proto3" json:"pvc_requested_capacity,omitempty"` // Requested storage capacity (e.g., "50Gi") + PvcActualCapacity string `protobuf:"bytes,132,opt,name=pvc_actual_capacity,json=pvcActualCapacity,proto3" json:"pvc_actual_capacity,omitempty"` // Actual allocated capacity from status (e.g., "100Gi") + PvcAccessModes []string `protobuf:"bytes,133,rep,name=pvc_access_modes,json=pvcAccessModes,proto3" json:"pvc_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] + PvcVolumeMode string `protobuf:"bytes,134,opt,name=pvc_volume_mode,json=pvcVolumeMode,proto3" json:"pvc_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" + PvcVolumeName string `protobuf:"bytes,135,opt,name=pvc_volume_name,json=pvcVolumeName,proto3" json:"pvc_volume_name,omitempty"` // Bound persistent volume name + PvcStatus string `protobuf:"bytes,136,opt,name=pvc_status,json=pvcStatus,proto3" json:"pvc_status,omitempty"` // PVC status: "Pending", "Bound", "Lost" + PvcIsBound bool `protobuf:"varint,137,opt,name=pvc_is_bound,json=pvcIsBound,proto3" json:"pvc_is_bound,omitempty"` // Whether PVC is bound to a PV + PvcSelectorMatchLabels string `protobuf:"bytes,138,opt,name=pvc_selector_match_labels,json=pvcSelectorMatchLabels,proto3" json:"pvc_selector_match_labels,omitempty"` // Selector labels for PV binding (JSON string) + PvcAllowedTopologies []string `protobuf:"bytes,139,rep,name=pvc_allowed_topologies,json=pvcAllowedTopologies,proto3" json:"pvc_allowed_topologies,omitempty"` // Allowed node topologies + // PersistentVolume-specific fields + PvStorageClassName string `protobuf:"bytes,150,opt,name=pv_storage_class_name,json=pvStorageClassName,proto3" json:"pv_storage_class_name,omitempty"` // Storage class name (e.g., "standard-rwo", "fast-ssd") + PvCapacity string `protobuf:"bytes,151,opt,name=pv_capacity,json=pvCapacity,proto3" json:"pv_capacity,omitempty"` // Storage capacity (e.g., "5Gi") + PvAccessModes []string `protobuf:"bytes,152,rep,name=pv_access_modes,json=pvAccessModes,proto3" json:"pv_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] + PvReclaimPolicy string `protobuf:"bytes,153,opt,name=pv_reclaim_policy,json=pvReclaimPolicy,proto3" json:"pv_reclaim_policy,omitempty"` // Reclaim policy: "Retain", "Delete", "Recycle" + PvClaimRefName string `protobuf:"bytes,154,opt,name=pv_claim_ref_name,json=pvClaimRefName,proto3" json:"pv_claim_ref_name,omitempty"` // Referenced PVC name + PvClaimRefNamespace string `protobuf:"bytes,155,opt,name=pv_claim_ref_namespace,json=pvClaimRefNamespace,proto3" json:"pv_claim_ref_namespace,omitempty"` // Referenced PVC namespace + PvStatus string `protobuf:"bytes,156,opt,name=pv_status,json=pvStatus,proto3" json:"pv_status,omitempty"` // PV status: "Available", "Bound", "Released", "Failed" + PvIsBound bool `protobuf:"varint,157,opt,name=pv_is_bound,json=pvIsBound,proto3" json:"pv_is_bound,omitempty"` // Whether PV is bound to a PVC + PvVolumeMode string `protobuf:"bytes,158,opt,name=pv_volume_mode,json=pvVolumeMode,proto3" json:"pv_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" + PvCsiDriver string `protobuf:"bytes,159,opt,name=pv_csi_driver,json=pvCsiDriver,proto3" json:"pv_csi_driver,omitempty"` // CSI driver name (if using CSI) + PvVolumeSourceType string `protobuf:"bytes,160,opt,name=pv_volume_source_type,json=pvVolumeSourceType,proto3" json:"pv_volume_source_type,omitempty"` // Volume source type: "CSI", "HostPath", "NFS", "AWS EBS", etc. + PvNodeAffinityZones []string `protobuf:"bytes,161,rep,name=pv_node_affinity_zones,json=pvNodeAffinityZones,proto3" json:"pv_node_affinity_zones,omitempty"` // Node affinity zones/regions + // StorageClass-specific fields + ScProvisioner string `protobuf:"bytes,170,opt,name=sc_provisioner,json=scProvisioner,proto3" json:"sc_provisioner,omitempty"` // Storage provisioner (e.g., "kubernetes.io/aws-ebs", "pd.csi.storage.gke.io") + ScReclaimPolicy string `protobuf:"bytes,171,opt,name=sc_reclaim_policy,json=scReclaimPolicy,proto3" json:"sc_reclaim_policy,omitempty"` // Default reclaim policy: "Retain", "Delete" + ScVolumeBindingMode string `protobuf:"bytes,172,opt,name=sc_volume_binding_mode,json=scVolumeBindingMode,proto3" json:"sc_volume_binding_mode,omitempty"` // Volume binding mode: "Immediate", "WaitForFirstConsumer" + ScAllowVolumeExpansion bool `protobuf:"varint,173,opt,name=sc_allow_volume_expansion,json=scAllowVolumeExpansion,proto3" json:"sc_allow_volume_expansion,omitempty"` // Whether volume expansion is allowed + ScParameters map[string]string `protobuf:"bytes,174,rep,name=sc_parameters,json=scParameters,proto3" json:"sc_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters (type, encrypted, etc.) + ScAllowedTopologies []string `protobuf:"bytes,175,rep,name=sc_allowed_topologies,json=scAllowedTopologies,proto3" json:"sc_allowed_topologies,omitempty"` // Allowed topologies for volumes + ScMountOptions []string `protobuf:"bytes,176,rep,name=sc_mount_options,json=scMountOptions,proto3" json:"sc_mount_options,omitempty"` // Default mount options + // Namespace fields (name|status|age + additional) + NsStatus string `protobuf:"bytes,177,opt,name=ns_status,json=nsStatus,proto3" json:"ns_status,omitempty"` // Namespace status/phase: "Active", "Terminating" + NsFinalizers []string `protobuf:"bytes,178,rep,name=ns_finalizers,json=nsFinalizers,proto3" json:"ns_finalizers,omitempty"` // Finalizers preventing deletion + // Node fields (name|cpu|memory|ready|taints|roles|internal IP|external IP|version|age + additional) + NodeCpuCapacity string `protobuf:"bytes,179,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // CPU capacity (e.g., "16", "15890m") + NodeMemoryCapacity string `protobuf:"bytes,180,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Memory capacity (e.g., "64422188Ki") + NodeReady bool `protobuf:"varint,181,opt,name=node_ready,json=nodeReady,proto3" json:"node_ready,omitempty"` // Node ready status + NodeTaints []*NodeTaint `protobuf:"bytes,182,rep,name=node_taints,json=nodeTaints,proto3" json:"node_taints,omitempty"` // Node taints affecting scheduling + NodeRoles []string `protobuf:"bytes,183,rep,name=node_roles,json=nodeRoles,proto3" json:"node_roles,omitempty"` // Node roles (master, worker, etc.) + NodeInternalIp string `protobuf:"bytes,184,opt,name=node_internal_ip,json=nodeInternalIp,proto3" json:"node_internal_ip,omitempty"` // Internal IP address + NodeExternalIp string `protobuf:"bytes,185,opt,name=node_external_ip,json=nodeExternalIp,proto3" json:"node_external_ip,omitempty"` // External IP address (if any) + NodeVersion string `protobuf:"bytes,186,opt,name=node_version,json=nodeVersion,proto3" json:"node_version,omitempty"` // Kubelet version + NodeInstanceType string `protobuf:"bytes,187,opt,name=node_instance_type,json=nodeInstanceType,proto3" json:"node_instance_type,omitempty"` // Cloud instance type (e.g., "m5.xlarge") + NodeOs string `protobuf:"bytes,188,opt,name=node_os,json=nodeOs,proto3" json:"node_os,omitempty"` // Operating system + NodeContainerRuntime string `protobuf:"bytes,189,opt,name=node_container_runtime,json=nodeContainerRuntime,proto3" json:"node_container_runtime,omitempty"` // Container runtime version + NodeImageCount int32 `protobuf:"varint,190,opt,name=node_image_count,json=nodeImageCount,proto3" json:"node_image_count,omitempty"` // Number of container images + // HorizontalPodAutoscaler-specific fields + HpaMinReplicas int32 `protobuf:"varint,200,opt,name=hpa_min_replicas,json=hpaMinReplicas,proto3" json:"hpa_min_replicas,omitempty"` // Minimum replicas from spec.minReplicas + HpaMaxReplicas int32 `protobuf:"varint,201,opt,name=hpa_max_replicas,json=hpaMaxReplicas,proto3" json:"hpa_max_replicas,omitempty"` // Maximum replicas from spec.maxReplicas + HpaCurrentReplicas int32 `protobuf:"varint,202,opt,name=hpa_current_replicas,json=hpaCurrentReplicas,proto3" json:"hpa_current_replicas,omitempty"` // Current replicas from status.currentReplicas + HpaDesiredReplicas int32 `protobuf:"varint,203,opt,name=hpa_desired_replicas,json=hpaDesiredReplicas,proto3" json:"hpa_desired_replicas,omitempty"` // Desired replicas from status.desiredReplicas + HpaMetricsCount int32 `protobuf:"varint,204,opt,name=hpa_metrics_count,json=hpaMetricsCount,proto3" json:"hpa_metrics_count,omitempty"` // Number of metrics configured + HpaStatus string `protobuf:"bytes,205,opt,name=hpa_status,json=hpaStatus,proto3" json:"hpa_status,omitempty"` // HPA status: "Active", "Inactive", "Unknown" + HpaScaleUpStabilization int32 `protobuf:"varint,206,opt,name=hpa_scale_up_stabilization,json=hpaScaleUpStabilization,proto3" json:"hpa_scale_up_stabilization,omitempty"` // Scale up stabilization window seconds + HpaScaleDownStabilization int32 `protobuf:"varint,207,opt,name=hpa_scale_down_stabilization,json=hpaScaleDownStabilization,proto3" json:"hpa_scale_down_stabilization,omitempty"` // Scale down stabilization window seconds + // VerticalPodAutoscaler-specific fields + VpaUpdateMode string `protobuf:"bytes,210,opt,name=vpa_update_mode,json=vpaUpdateMode,proto3" json:"vpa_update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" + VpaPoliciesCount int32 `protobuf:"varint,211,opt,name=vpa_policies_count,json=vpaPoliciesCount,proto3" json:"vpa_policies_count,omitempty"` // Number of container policies configured + VpaRecommendationsCount int32 `protobuf:"varint,212,opt,name=vpa_recommendations_count,json=vpaRecommendationsCount,proto3" json:"vpa_recommendations_count,omitempty"` // Number of container recommendations available + VpaCpuTarget string `protobuf:"bytes,213,opt,name=vpa_cpu_target,json=vpaCpuTarget,proto3" json:"vpa_cpu_target,omitempty"` // CPU target recommendation (e.g., "100m") + VpaMemoryTarget string `protobuf:"bytes,214,opt,name=vpa_memory_target,json=vpaMemoryTarget,proto3" json:"vpa_memory_target,omitempty"` // Memory target recommendation (e.g., "128Mi") + VpaStatus string `protobuf:"bytes,215,opt,name=vpa_status,json=vpaStatus,proto3" json:"vpa_status,omitempty"` // VPA status: "Active", "No Recommendations" + // LimitRange-specific fields + LimitRangeItemsCount int32 `protobuf:"varint,220,opt,name=limit_range_items_count,json=limitRangeItemsCount,proto3" json:"limit_range_items_count,omitempty"` // Number of limit items configured + LimitRangeTypes []string `protobuf:"bytes,221,rep,name=limit_range_types,json=limitRangeTypes,proto3" json:"limit_range_types,omitempty"` // Types of limits: ["Container", "Pod", "PersistentVolumeClaim"] + LimitRangeHasDefaults bool `protobuf:"varint,222,opt,name=limit_range_has_defaults,json=limitRangeHasDefaults,proto3" json:"limit_range_has_defaults,omitempty"` // Whether default limits/requests are set + LimitRangeMaxCpu string `protobuf:"bytes,223,opt,name=limit_range_max_cpu,json=limitRangeMaxCpu,proto3" json:"limit_range_max_cpu,omitempty"` // Maximum CPU limit (e.g., "2") + LimitRangeMaxMemory string `protobuf:"bytes,224,opt,name=limit_range_max_memory,json=limitRangeMaxMemory,proto3" json:"limit_range_max_memory,omitempty"` // Maximum memory limit (e.g., "2Gi") + LimitRangeMinCpu string `protobuf:"bytes,225,opt,name=limit_range_min_cpu,json=limitRangeMinCpu,proto3" json:"limit_range_min_cpu,omitempty"` // Minimum CPU limit (e.g., "100m") + LimitRangeMinMemory string `protobuf:"bytes,226,opt,name=limit_range_min_memory,json=limitRangeMinMemory,proto3" json:"limit_range_min_memory,omitempty"` // Minimum memory limit (e.g., "64Mi") + LimitRangeDefaultCpuLimit string `protobuf:"bytes,227,opt,name=limit_range_default_cpu_limit,json=limitRangeDefaultCpuLimit,proto3" json:"limit_range_default_cpu_limit,omitempty"` // Default CPU limit (e.g., "500m") + LimitRangeDefaultMemoryLimit string `protobuf:"bytes,228,opt,name=limit_range_default_memory_limit,json=limitRangeDefaultMemoryLimit,proto3" json:"limit_range_default_memory_limit,omitempty"` // Default memory limit (e.g., "512Mi") + LimitRangeDefaultCpuRequest string `protobuf:"bytes,229,opt,name=limit_range_default_cpu_request,json=limitRangeDefaultCpuRequest,proto3" json:"limit_range_default_cpu_request,omitempty"` // Default CPU request (e.g., "200m") + LimitRangeDefaultMemoryRequest string `protobuf:"bytes,230,opt,name=limit_range_default_memory_request,json=limitRangeDefaultMemoryRequest,proto3" json:"limit_range_default_memory_request,omitempty"` // Default memory request (e.g., "256Mi") + LimitRangeStatus string `protobuf:"bytes,231,opt,name=limit_range_status,json=limitRangeStatus,proto3" json:"limit_range_status,omitempty"` // LimitRange status (always "Active") + ResourceVersion string `protobuf:"bytes,240,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Service account resource version + ApiVersion string `protobuf:"bytes,241,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version +} + +func (x *ResourceDetails) Reset() { + *x = ResourceDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDetails) ProtoMessage() {} + +func (x *ResourceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[32] + 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 ResourceDetails.ProtoReflect.Descriptor instead. +func (*ResourceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{32} +} + +func (m *ResourceDetails) GetDetails() isResourceDetails_Details { + if m != nil { + return m.Details + } + return nil +} + +func (x *ResourceDetails) GetPodDetails() *PodDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PodDetails); ok { + return x.PodDetails + } + return nil +} + +func (x *ResourceDetails) GetDeploymentDetails() *DeploymentDetails { + if x, ok := x.GetDetails().(*ResourceDetails_DeploymentDetails); ok { + return x.DeploymentDetails + } + return nil +} + +func (x *ResourceDetails) GetStatefulSetDetails() *StatefulSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_StatefulSetDetails); ok { + return x.StatefulSetDetails + } + return nil +} + +func (x *ResourceDetails) GetDaemonSetDetails() *DaemonSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_DaemonSetDetails); ok { + return x.DaemonSetDetails + } + return nil +} + +func (x *ResourceDetails) GetReplicaSetDetails() *ReplicaSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ReplicaSetDetails); ok { + return x.ReplicaSetDetails + } + return nil +} + +func (x *ResourceDetails) GetJobDetails() *JobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_JobDetails); ok { + return x.JobDetails + } + return nil +} + +func (x *ResourceDetails) GetCronJobDetails() *CronJobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_CronJobDetails); ok { + return x.CronJobDetails + } + return nil +} + +func (x *ResourceDetails) GetServiceDetails() *ServiceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ServiceDetails); ok { + return x.ServiceDetails + } + return nil +} + +func (x *ResourceDetails) GetIngressDetails() *IngressDetails { + if x, ok := x.GetDetails().(*ResourceDetails_IngressDetails); ok { + return x.IngressDetails + } + return nil +} + +func (x *ResourceDetails) GetPvcDetails() *PersistentVolumeClaimDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PvcDetails); ok { + return x.PvcDetails + } + return nil +} + +func (x *ResourceDetails) GetPvDetails() *PersistentVolumeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PvDetails); ok { + return x.PvDetails + } + return nil +} + +func (x *ResourceDetails) GetScDetails() *StorageClassDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ScDetails); ok { + return x.ScDetails + } + return nil +} + +func (x *ResourceDetails) GetNsDetails() *NamespaceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_NsDetails); ok { + return x.NsDetails + } + return nil +} + +func (x *ResourceDetails) GetNodeDetails() *NodeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_NodeDetails); ok { + return x.NodeDetails + } + return nil +} + +func (x *ResourceDetails) GetHpaDetails() *HPADetails { + if x, ok := x.GetDetails().(*ResourceDetails_HpaDetails); ok { + return x.HpaDetails + } + return nil +} + +func (x *ResourceDetails) GetVpaDetails() *VPADetails { + if x, ok := x.GetDetails().(*ResourceDetails_VpaDetails); ok { + return x.VpaDetails + } + return nil +} + +func (x *ResourceDetails) GetLimitRangeDetails() *LimitRangeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_LimitRangeDetails); ok { + return x.LimitRangeDetails + } + return nil +} + +func (x *ResourceDetails) GetServiceAccountDetails() *ServiceAccountDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ServiceAccountDetails); ok { + return x.ServiceAccountDetails + } + return nil +} + +func (x *ResourceDetails) GetRoleDetails() *RoleDetails { + if x, ok := x.GetDetails().(*ResourceDetails_RoleDetails); ok { + return x.RoleDetails + } + return nil +} + +func (x *ResourceDetails) GetRoleBindingDetails() *RoleBindingDetails { + if x, ok := x.GetDetails().(*ResourceDetails_RoleBindingDetails); ok { + return x.RoleBindingDetails + } + return nil +} + +func (x *ResourceDetails) GetKedaScaledObjectDetails() *KedaScaledObjectDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KedaScaledObjectDetails); ok { + return x.KedaScaledObjectDetails + } + return nil +} + +func (x *ResourceDetails) GetKarpenterResourceDetails() *KarpenterResourceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KarpenterResourceDetails); ok { + return x.KarpenterResourceDetails + } + return nil +} + +func (x *ResourceDetails) GetPodDisruptionBudgetDetails() *PodDisruptionBudgetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PodDisruptionBudgetDetails); ok { + return x.PodDisruptionBudgetDetails + } + return nil +} + +func (x *ResourceDetails) GetResourceQuotaDetails() *ResourceQuotaDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ResourceQuotaDetails); ok { + return x.ResourceQuotaDetails + } + return nil +} + +func (x *ResourceDetails) GetVolcanoJobDetails() *VolcanoJobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_VolcanoJobDetails); ok { + return x.VolcanoJobDetails + } + return nil +} + +func (x *ResourceDetails) GetSparkApplicationDetails() *SparkApplicationDetails { + if x, ok := x.GetDetails().(*ResourceDetails_SparkApplicationDetails); ok { + return x.SparkApplicationDetails + } + return nil +} + +func (x *ResourceDetails) GetScheduledSparkApplicationDetails() *ScheduledSparkApplicationDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ScheduledSparkApplicationDetails); ok { + return x.ScheduledSparkApplicationDetails + } + return nil +} + +func (x *ResourceDetails) GetKyvernoPolicyDetails() *KyvernoPolicyDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KyvernoPolicyDetails); ok { + return x.KyvernoPolicyDetails + } + return nil +} + +func (x *ResourceDetails) GetKyvernoPolicyReportDetails() *KyvernoPolicyReportDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KyvernoPolicyReportDetails); ok { + return x.KyvernoPolicyReportDetails + } + return nil +} + +func (x *ResourceDetails) GetGatekeeperConstraintTemplateDetails() *GatekeeperConstraintTemplateDetails { + if x, ok := x.GetDetails().(*ResourceDetails_GatekeeperConstraintTemplateDetails); ok { + return x.GatekeeperConstraintTemplateDetails + } + return nil +} + +func (x *ResourceDetails) GetGatekeeperConstraintDetails() *GatekeeperConstraintDetails { + if x, ok := x.GetDetails().(*ResourceDetails_GatekeeperConstraintDetails); ok { + return x.GatekeeperConstraintDetails + } + return nil +} + +func (x *ResourceDetails) GetPhase() string { + if x != nil { + return x.Phase + } + return "" +} + +func (x *ResourceDetails) GetPodIp() string { + if x != nil { + return x.PodIp + } + return "" +} + +func (x *ResourceDetails) GetHostIp() string { + if x != nil { + return x.HostIp + } + return "" +} + +func (x *ResourceDetails) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *ResourceDetails) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *ResourceDetails) GetQosClass() string { + if x != nil { + return x.QosClass + } + return "" +} + +func (x *ResourceDetails) GetContainerCount() int32 { + if x != nil { + return x.ContainerCount + } + return 0 +} + +func (x *ResourceDetails) GetRestartCount() int32 { + if x != nil { + return x.RestartCount + } + return 0 +} + +func (x *ResourceDetails) GetCpuRequestsMillicores() int64 { + if x != nil { + return x.CpuRequestsMillicores + } + return 0 +} + +func (x *ResourceDetails) GetMemoryRequestsBytes() int64 { + if x != nil { + return x.MemoryRequestsBytes + } + return 0 +} + +func (x *ResourceDetails) GetCpuLimitsMillicores() int64 { + if x != nil { + return x.CpuLimitsMillicores + } + return 0 +} + +func (x *ResourceDetails) GetMemoryLimitsBytes() int64 { + if x != nil { + return x.MemoryLimitsBytes + } + return 0 +} + +func (x *ResourceDetails) GetStatusReason() string { + if x != nil { + return x.StatusReason + } + return "" +} + +func (x *ResourceDetails) GetControlledBy() string { + if x != nil { + return x.ControlledBy + } + return "" +} + +func (x *ResourceDetails) GetAge() string { + if x != nil { + return x.Age + } + return "" +} + +func (x *ResourceDetails) GetReplicasDesired() int32 { + if x != nil { + return x.ReplicasDesired + } + return 0 +} + +func (x *ResourceDetails) GetReplicasReady() int32 { + if x != nil { + return x.ReplicasReady + } + return 0 +} + +func (x *ResourceDetails) GetReplicasAvailable() int32 { + if x != nil { + return x.ReplicasAvailable + } + return 0 +} + +func (x *ResourceDetails) GetReplicasUpdated() int32 { + if x != nil { + return x.ReplicasUpdated + } + return 0 +} + +func (x *ResourceDetails) GetStrategyType() string { + if x != nil { + return x.StrategyType + } + return "" +} + +func (x *ResourceDetails) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *ResourceDetails) GetProgressing() bool { + if x != nil { + return x.Progressing + } + return false +} + +func (x *ResourceDetails) GetDeploymentStatus() string { + if x != nil { + return x.DeploymentStatus + } + return "" +} + +func (x *ResourceDetails) GetImages() []string { + if x != nil { + return x.Images + } + return nil +} + +func (x *ResourceDetails) GetServiceName() string { + if x != nil { + return x.ServiceName + } + return "" +} + +func (x *ResourceDetails) GetPodManagementPolicy() string { + if x != nil { + return x.PodManagementPolicy + } + return "" +} + +func (x *ResourceDetails) GetUpdateStrategyType() string { + if x != nil { + return x.UpdateStrategyType + } + return "" +} + +func (x *ResourceDetails) GetVolumeClaimTemplateCount() int32 { + if x != nil { + return x.VolumeClaimTemplateCount + } + return 0 +} + +func (x *ResourceDetails) GetPvcRetentionPolicy() string { + if x != nil { + return x.PvcRetentionPolicy + } + return "" +} + +func (x *ResourceDetails) GetCurrentRevision() string { + if x != nil { + return x.CurrentRevision + } + return "" +} + +func (x *ResourceDetails) GetUpdateRevision() string { + if x != nil { + return x.UpdateRevision + } + return "" +} + +func (x *ResourceDetails) GetNodesDesired() int32 { + if x != nil { + return x.NodesDesired + } + return 0 +} + +func (x *ResourceDetails) GetNodesReady() int32 { + if x != nil { + return x.NodesReady + } + return 0 +} + +func (x *ResourceDetails) GetNodesAvailable() int32 { + if x != nil { + return x.NodesAvailable + } + return 0 +} + +func (x *ResourceDetails) GetNodesCurrent() int32 { + if x != nil { + return x.NodesCurrent + } + return 0 +} + +func (x *ResourceDetails) GetNodesUpdated() int32 { + if x != nil { + return x.NodesUpdated + } + return 0 +} + +func (x *ResourceDetails) GetNodesMisscheduled() int32 { + if x != nil { + return x.NodesMisscheduled + } + return 0 +} + +func (x *ResourceDetails) GetMaxUnavailable() string { + if x != nil { + return x.MaxUnavailable + } + return "" +} + +func (x *ResourceDetails) GetPriorityClass() string { + if x != nil { + return x.PriorityClass + } + return "" +} + +func (x *ResourceDetails) GetJobCompletionsDesired() int32 { + if x != nil { + return x.JobCompletionsDesired + } + return 0 +} + +func (x *ResourceDetails) GetJobCompletionsSucceeded() int32 { + if x != nil { + return x.JobCompletionsSucceeded + } + return 0 +} + +func (x *ResourceDetails) GetJobParallelism() int32 { + if x != nil { + return x.JobParallelism + } + return 0 +} + +func (x *ResourceDetails) GetJobBackoffLimit() int32 { + if x != nil { + return x.JobBackoffLimit + } + return 0 +} + +func (x *ResourceDetails) GetJobCompletionMode() string { + if x != nil { + return x.JobCompletionMode + } + return "" +} + +func (x *ResourceDetails) GetJobSuspended() bool { + if x != nil { + return x.JobSuspended + } + return false +} + +func (x *ResourceDetails) GetJobDuration() string { + if x != nil { + return x.JobDuration + } + return "" +} + +func (x *ResourceDetails) GetJobStatus() string { + if x != nil { + return x.JobStatus + } + return "" +} + +func (x *ResourceDetails) GetJobActivePods() int32 { + if x != nil { + return x.JobActivePods + } + return 0 +} + +func (x *ResourceDetails) GetJobFailedPods() int32 { + if x != nil { + return x.JobFailedPods + } + return 0 +} + +func (x *ResourceDetails) GetCronSchedule() string { + if x != nil { + return x.CronSchedule + } + return "" +} + +func (x *ResourceDetails) GetCronSuspended() bool { + if x != nil { + return x.CronSuspended + } + return false +} + +func (x *ResourceDetails) GetCronActiveJobs() int32 { + if x != nil { + return x.CronActiveJobs + } + return 0 +} + +func (x *ResourceDetails) GetCronLastScheduleTime() string { + if x != nil { + return x.CronLastScheduleTime + } + return "" +} + +func (x *ResourceDetails) GetCronNextScheduleTime() string { + if x != nil { + return x.CronNextScheduleTime + } + return "" +} + +func (x *ResourceDetails) GetCronConcurrencyPolicy() string { + if x != nil { + return x.CronConcurrencyPolicy + } + return "" +} + +func (x *ResourceDetails) GetCronSuccessfulJobsLimit() int32 { + if x != nil { + return x.CronSuccessfulJobsLimit + } + return 0 +} + +func (x *ResourceDetails) GetCronFailedJobsLimit() int32 { + if x != nil { + return x.CronFailedJobsLimit + } + return 0 +} + +func (x *ResourceDetails) GetCronStartingDeadlineSeconds() int32 { + if x != nil { + return x.CronStartingDeadlineSeconds + } + return 0 +} + +func (x *ResourceDetails) GetServiceType() string { + if x != nil { + return x.ServiceType + } + return "" +} + +func (x *ResourceDetails) GetServiceClusterIp() string { + if x != nil { + return x.ServiceClusterIp + } + return "" +} + +func (x *ResourceDetails) GetServiceExternalIps() []string { + if x != nil { + return x.ServiceExternalIps + } + return nil +} + +func (x *ResourceDetails) GetServicePorts() []*ServicePort { + if x != nil { + return x.ServicePorts + } + return nil +} + +func (x *ResourceDetails) GetServiceSelector() map[string]string { + if x != nil { + return x.ServiceSelector + } + return nil +} + +func (x *ResourceDetails) GetServiceSessionAffinity() string { + if x != nil { + return x.ServiceSessionAffinity + } + return "" +} + +func (x *ResourceDetails) GetServiceExternalTrafficPolicy() string { + if x != nil { + return x.ServiceExternalTrafficPolicy + } + return "" +} + +func (x *ResourceDetails) GetServiceInternalTrafficPolicy() string { + if x != nil { + return x.ServiceInternalTrafficPolicy + } + return "" +} + +func (x *ResourceDetails) GetServiceLoadBalancerSourceRanges() []string { + if x != nil { + return x.ServiceLoadBalancerSourceRanges + } + return nil +} + +func (x *ResourceDetails) GetServiceLoadBalancerClass() string { + if x != nil { + return x.ServiceLoadBalancerClass + } + return "" +} + +func (x *ResourceDetails) GetServiceIpFamilies() []string { + if x != nil { + return x.ServiceIpFamilies + } + return nil +} + +func (x *ResourceDetails) GetServiceIpFamilyPolicy() string { + if x != nil { + return x.ServiceIpFamilyPolicy + } + return "" +} + +func (x *ResourceDetails) GetIngressClassName() string { + if x != nil { + return x.IngressClassName + } + return "" +} + +func (x *ResourceDetails) GetIngressHosts() []string { + if x != nil { + return x.IngressHosts + } + return nil +} + +func (x *ResourceDetails) GetIngressPaths() []string { + if x != nil { + return x.IngressPaths + } + return nil +} + +func (x *ResourceDetails) GetIngressBackends() []string { + if x != nil { + return x.IngressBackends + } + return nil +} + +func (x *ResourceDetails) GetIngressTlsHosts() []string { + if x != nil { + return x.IngressTlsHosts + } + return nil +} + +func (x *ResourceDetails) GetIngressTlsSecrets() []string { + if x != nil { + return x.IngressTlsSecrets + } + return nil +} + +func (x *ResourceDetails) GetIngressLoadBalancerIps() []string { + if x != nil { + return x.IngressLoadBalancerIps + } + return nil +} + +func (x *ResourceDetails) GetIngressRulesCount() int32 { + if x != nil { + return x.IngressRulesCount + } + return 0 +} + +func (x *ResourceDetails) GetIngressTlsCount() int32 { + if x != nil { + return x.IngressTlsCount + } + return 0 +} + +func (x *ResourceDetails) GetIngressHasDefaultBackend() bool { + if x != nil { + return x.IngressHasDefaultBackend + } + return false +} + +func (x *ResourceDetails) GetPvcStorageClassName() string { + if x != nil { + return x.PvcStorageClassName + } + return "" +} + +func (x *ResourceDetails) GetPvcRequestedCapacity() string { + if x != nil { + return x.PvcRequestedCapacity } return "" } -func (x *ResourceDetails) GetJobStatus() string { +func (x *ResourceDetails) GetPvcActualCapacity() string { if x != nil { - return x.JobStatus + return x.PvcActualCapacity } return "" } -func (x *ResourceDetails) GetJobActivePods() int32 { +func (x *ResourceDetails) GetPvcAccessModes() []string { if x != nil { - return x.JobActivePods + return x.PvcAccessModes } - return 0 + return nil } -func (x *ResourceDetails) GetJobFailedPods() int32 { +func (x *ResourceDetails) GetPvcVolumeMode() string { if x != nil { - return x.JobFailedPods + return x.PvcVolumeMode } - return 0 + return "" } -func (x *ResourceDetails) GetCronSchedule() string { +func (x *ResourceDetails) GetPvcVolumeName() string { if x != nil { - return x.CronSchedule + return x.PvcVolumeName } return "" } -func (x *ResourceDetails) GetCronSuspended() bool { +func (x *ResourceDetails) GetPvcStatus() string { if x != nil { - return x.CronSuspended + return x.PvcStatus } - return false + return "" } -func (x *ResourceDetails) GetCronActiveJobs() int32 { +func (x *ResourceDetails) GetPvcIsBound() bool { if x != nil { - return x.CronActiveJobs + return x.PvcIsBound } - return 0 + return false } -func (x *ResourceDetails) GetCronLastScheduleTime() string { +func (x *ResourceDetails) GetPvcSelectorMatchLabels() string { if x != nil { - return x.CronLastScheduleTime + return x.PvcSelectorMatchLabels } return "" } -func (x *ResourceDetails) GetCronNextScheduleTime() string { +func (x *ResourceDetails) GetPvcAllowedTopologies() []string { if x != nil { - return x.CronNextScheduleTime + return x.PvcAllowedTopologies + } + return nil +} + +func (x *ResourceDetails) GetPvStorageClassName() string { + if x != nil { + return x.PvStorageClassName } return "" } -func (x *ResourceDetails) GetCronConcurrencyPolicy() string { +func (x *ResourceDetails) GetPvCapacity() string { if x != nil { - return x.CronConcurrencyPolicy + return x.PvCapacity } return "" } -func (x *ResourceDetails) GetCronSuccessfulJobsLimit() int32 { +func (x *ResourceDetails) GetPvAccessModes() []string { if x != nil { - return x.CronSuccessfulJobsLimit + return x.PvAccessModes } - return 0 + return nil } -func (x *ResourceDetails) GetCronFailedJobsLimit() int32 { +func (x *ResourceDetails) GetPvReclaimPolicy() string { if x != nil { - return x.CronFailedJobsLimit + return x.PvReclaimPolicy } - return 0 + return "" } -func (x *ResourceDetails) GetCronStartingDeadlineSeconds() int32 { +func (x *ResourceDetails) GetPvClaimRefName() string { if x != nil { - return x.CronStartingDeadlineSeconds + return x.PvClaimRefName } - return 0 + return "" } -func (x *ResourceDetails) GetServiceType() string { +func (x *ResourceDetails) GetPvClaimRefNamespace() string { if x != nil { - return x.ServiceType + return x.PvClaimRefNamespace } return "" } -func (x *ResourceDetails) GetServiceClusterIp() string { +func (x *ResourceDetails) GetPvStatus() string { if x != nil { - return x.ServiceClusterIp + return x.PvStatus } return "" } -func (x *ResourceDetails) GetServiceExternalIps() []string { +func (x *ResourceDetails) GetPvIsBound() bool { if x != nil { - return x.ServiceExternalIps + return x.PvIsBound } - return nil + return false } -func (x *ResourceDetails) GetServicePorts() []*ServicePort { +func (x *ResourceDetails) GetPvVolumeMode() string { if x != nil { - return x.ServicePorts + return x.PvVolumeMode } - return nil + return "" } -func (x *ResourceDetails) GetServiceSelector() map[string]string { +func (x *ResourceDetails) GetPvCsiDriver() string { if x != nil { - return x.ServiceSelector + return x.PvCsiDriver + } + return "" +} + +func (x *ResourceDetails) GetPvVolumeSourceType() string { + if x != nil { + return x.PvVolumeSourceType + } + return "" +} + +func (x *ResourceDetails) GetPvNodeAffinityZones() []string { + if x != nil { + return x.PvNodeAffinityZones } return nil } -func (x *ResourceDetails) GetServiceSessionAffinity() string { +func (x *ResourceDetails) GetScProvisioner() string { if x != nil { - return x.ServiceSessionAffinity + return x.ScProvisioner } return "" } -func (x *ResourceDetails) GetServiceExternalTrafficPolicy() string { +func (x *ResourceDetails) GetScReclaimPolicy() string { if x != nil { - return x.ServiceExternalTrafficPolicy + return x.ScReclaimPolicy } return "" } -func (x *ResourceDetails) GetServiceInternalTrafficPolicy() string { +func (x *ResourceDetails) GetScVolumeBindingMode() string { if x != nil { - return x.ServiceInternalTrafficPolicy + return x.ScVolumeBindingMode } return "" } -func (x *ResourceDetails) GetServiceLoadBalancerSourceRanges() []string { +func (x *ResourceDetails) GetScAllowVolumeExpansion() bool { if x != nil { - return x.ServiceLoadBalancerSourceRanges + return x.ScAllowVolumeExpansion + } + return false +} + +func (x *ResourceDetails) GetScParameters() map[string]string { + if x != nil { + return x.ScParameters } return nil } -func (x *ResourceDetails) GetServiceLoadBalancerClass() string { +func (x *ResourceDetails) GetScAllowedTopologies() []string { if x != nil { - return x.ServiceLoadBalancerClass + return x.ScAllowedTopologies + } + return nil +} + +func (x *ResourceDetails) GetScMountOptions() []string { + if x != nil { + return x.ScMountOptions + } + return nil +} + +func (x *ResourceDetails) GetNsStatus() string { + if x != nil { + return x.NsStatus } return "" } -func (x *ResourceDetails) GetServiceIpFamilies() []string { +func (x *ResourceDetails) GetNsFinalizers() []string { if x != nil { - return x.ServiceIpFamilies + return x.NsFinalizers } return nil } -func (x *ResourceDetails) GetServiceIpFamilyPolicy() string { +func (x *ResourceDetails) GetNodeCpuCapacity() string { if x != nil { - return x.ServiceIpFamilyPolicy + return x.NodeCpuCapacity } return "" } -func (x *ResourceDetails) GetIngressClassName() string { +func (x *ResourceDetails) GetNodeMemoryCapacity() string { if x != nil { - return x.IngressClassName + return x.NodeMemoryCapacity } return "" } -func (x *ResourceDetails) GetIngressHosts() []string { +func (x *ResourceDetails) GetNodeReady() bool { if x != nil { - return x.IngressHosts + return x.NodeReady } - return nil + return false } -func (x *ResourceDetails) GetIngressPaths() []string { +func (x *ResourceDetails) GetNodeTaints() []*NodeTaint { if x != nil { - return x.IngressPaths + return x.NodeTaints } return nil } -func (x *ResourceDetails) GetIngressBackends() []string { +func (x *ResourceDetails) GetNodeRoles() []string { if x != nil { - return x.IngressBackends + return x.NodeRoles } return nil } -func (x *ResourceDetails) GetIngressTlsHosts() []string { +func (x *ResourceDetails) GetNodeInternalIp() string { if x != nil { - return x.IngressTlsHosts + return x.NodeInternalIp } - return nil + return "" } -func (x *ResourceDetails) GetIngressTlsSecrets() []string { +func (x *ResourceDetails) GetNodeExternalIp() string { if x != nil { - return x.IngressTlsSecrets + return x.NodeExternalIp } - return nil + return "" } -func (x *ResourceDetails) GetIngressLoadBalancerIps() []string { +func (x *ResourceDetails) GetNodeVersion() string { if x != nil { - return x.IngressLoadBalancerIps + return x.NodeVersion } - return nil + return "" } -func (x *ResourceDetails) GetIngressRulesCount() int32 { +func (x *ResourceDetails) GetNodeInstanceType() string { if x != nil { - return x.IngressRulesCount + return x.NodeInstanceType + } + return "" +} + +func (x *ResourceDetails) GetNodeOs() string { + if x != nil { + return x.NodeOs + } + return "" +} + +func (x *ResourceDetails) GetNodeContainerRuntime() string { + if x != nil { + return x.NodeContainerRuntime + } + return "" +} + +func (x *ResourceDetails) GetNodeImageCount() int32 { + if x != nil { + return x.NodeImageCount } return 0 } -func (x *ResourceDetails) GetIngressTlsCount() int32 { +func (x *ResourceDetails) GetHpaMinReplicas() int32 { if x != nil { - return x.IngressTlsCount + return x.HpaMinReplicas } return 0 } -func (x *ResourceDetails) GetIngressHasDefaultBackend() bool { +func (x *ResourceDetails) GetHpaMaxReplicas() int32 { if x != nil { - return x.IngressHasDefaultBackend + return x.HpaMaxReplicas } - return false + return 0 } -func (x *ResourceDetails) GetPvcStorageClassName() string { +func (x *ResourceDetails) GetHpaCurrentReplicas() int32 { if x != nil { - return x.PvcStorageClassName + return x.HpaCurrentReplicas } - return "" + return 0 } -func (x *ResourceDetails) GetPvcRequestedCapacity() string { +func (x *ResourceDetails) GetHpaDesiredReplicas() int32 { if x != nil { - return x.PvcRequestedCapacity + return x.HpaDesiredReplicas } - return "" + return 0 } -func (x *ResourceDetails) GetPvcActualCapacity() string { +func (x *ResourceDetails) GetHpaMetricsCount() int32 { if x != nil { - return x.PvcActualCapacity + return x.HpaMetricsCount + } + return 0 +} + +func (x *ResourceDetails) GetHpaStatus() string { + if x != nil { + return x.HpaStatus } return "" } -func (x *ResourceDetails) GetPvcAccessModes() []string { +func (x *ResourceDetails) GetHpaScaleUpStabilization() int32 { if x != nil { - return x.PvcAccessModes + return x.HpaScaleUpStabilization } - return nil + return 0 } -func (x *ResourceDetails) GetPvcVolumeMode() string { +func (x *ResourceDetails) GetHpaScaleDownStabilization() int32 { if x != nil { - return x.PvcVolumeMode + return x.HpaScaleDownStabilization } - return "" + return 0 } -func (x *ResourceDetails) GetPvcVolumeName() string { +func (x *ResourceDetails) GetVpaUpdateMode() string { if x != nil { - return x.PvcVolumeName + return x.VpaUpdateMode } return "" } -func (x *ResourceDetails) GetPvcStatus() string { +func (x *ResourceDetails) GetVpaPoliciesCount() int32 { if x != nil { - return x.PvcStatus + return x.VpaPoliciesCount } - return "" + return 0 } -func (x *ResourceDetails) GetPvcIsBound() bool { +func (x *ResourceDetails) GetVpaRecommendationsCount() int32 { if x != nil { - return x.PvcIsBound + return x.VpaRecommendationsCount } - return false + return 0 } -func (x *ResourceDetails) GetPvcSelectorMatchLabels() string { +func (x *ResourceDetails) GetVpaCpuTarget() string { if x != nil { - return x.PvcSelectorMatchLabels + return x.VpaCpuTarget } return "" } -func (x *ResourceDetails) GetPvcAllowedTopologies() []string { +func (x *ResourceDetails) GetVpaMemoryTarget() string { if x != nil { - return x.PvcAllowedTopologies + return x.VpaMemoryTarget } - return nil + return "" } -func (x *ResourceDetails) GetPvStorageClassName() string { +func (x *ResourceDetails) GetVpaStatus() string { if x != nil { - return x.PvStorageClassName + return x.VpaStatus } return "" } -func (x *ResourceDetails) GetPvCapacity() string { +func (x *ResourceDetails) GetLimitRangeItemsCount() int32 { if x != nil { - return x.PvCapacity + return x.LimitRangeItemsCount } - return "" + return 0 } -func (x *ResourceDetails) GetPvAccessModes() []string { +func (x *ResourceDetails) GetLimitRangeTypes() []string { if x != nil { - return x.PvAccessModes + return x.LimitRangeTypes } return nil } -func (x *ResourceDetails) GetPvReclaimPolicy() string { +func (x *ResourceDetails) GetLimitRangeHasDefaults() bool { if x != nil { - return x.PvReclaimPolicy + return x.LimitRangeHasDefaults } - return "" + return false } -func (x *ResourceDetails) GetPvClaimRefName() string { +func (x *ResourceDetails) GetLimitRangeMaxCpu() string { if x != nil { - return x.PvClaimRefName + return x.LimitRangeMaxCpu } return "" } -func (x *ResourceDetails) GetPvClaimRefNamespace() string { +func (x *ResourceDetails) GetLimitRangeMaxMemory() string { if x != nil { - return x.PvClaimRefNamespace + return x.LimitRangeMaxMemory } return "" } -func (x *ResourceDetails) GetPvStatus() string { +func (x *ResourceDetails) GetLimitRangeMinCpu() string { if x != nil { - return x.PvStatus + return x.LimitRangeMinCpu } return "" } -func (x *ResourceDetails) GetPvIsBound() bool { +func (x *ResourceDetails) GetLimitRangeMinMemory() string { if x != nil { - return x.PvIsBound + return x.LimitRangeMinMemory } - return false + return "" } -func (x *ResourceDetails) GetPvVolumeMode() string { +func (x *ResourceDetails) GetLimitRangeDefaultCpuLimit() string { if x != nil { - return x.PvVolumeMode + return x.LimitRangeDefaultCpuLimit } return "" } -func (x *ResourceDetails) GetPvCsiDriver() string { +func (x *ResourceDetails) GetLimitRangeDefaultMemoryLimit() string { if x != nil { - return x.PvCsiDriver + return x.LimitRangeDefaultMemoryLimit } return "" } -func (x *ResourceDetails) GetPvVolumeSourceType() string { +func (x *ResourceDetails) GetLimitRangeDefaultCpuRequest() string { if x != nil { - return x.PvVolumeSourceType + return x.LimitRangeDefaultCpuRequest } return "" } -func (x *ResourceDetails) GetPvNodeAffinityZones() []string { +func (x *ResourceDetails) GetLimitRangeDefaultMemoryRequest() string { if x != nil { - return x.PvNodeAffinityZones + return x.LimitRangeDefaultMemoryRequest } - return nil + return "" } -func (x *ResourceDetails) GetScProvisioner() string { +func (x *ResourceDetails) GetLimitRangeStatus() string { if x != nil { - return x.ScProvisioner + return x.LimitRangeStatus } return "" } -func (x *ResourceDetails) GetScReclaimPolicy() string { +func (x *ResourceDetails) GetResourceVersion() string { if x != nil { - return x.ScReclaimPolicy + return x.ResourceVersion } return "" } -func (x *ResourceDetails) GetScVolumeBindingMode() string { +func (x *ResourceDetails) GetApiVersion() string { if x != nil { - return x.ScVolumeBindingMode + return x.ApiVersion } return "" } -func (x *ResourceDetails) GetScAllowVolumeExpansion() bool { - if x != nil { - return x.ScAllowVolumeExpansion - } - return false +type isResourceDetails_Details interface { + isResourceDetails_Details() } -func (x *ResourceDetails) GetScParameters() map[string]string { - if x != nil { - return x.ScParameters - } - return nil +type ResourceDetails_PodDetails struct { + // Pod-specific fields + PodDetails *PodDetails `protobuf:"bytes,1,opt,name=pod_details,json=podDetails,proto3,oneof"` } -func (x *ResourceDetails) GetScAllowedTopologies() []string { - if x != nil { - return x.ScAllowedTopologies - } - return nil +type ResourceDetails_DeploymentDetails struct { + // Deployment-specific fields + DeploymentDetails *DeploymentDetails `protobuf:"bytes,2,opt,name=deployment_details,json=deploymentDetails,proto3,oneof"` } -func (x *ResourceDetails) GetScMountOptions() []string { - if x != nil { - return x.ScMountOptions - } - return nil +type ResourceDetails_StatefulSetDetails struct { + // StatefulSet-specific fields + StatefulSetDetails *StatefulSetDetails `protobuf:"bytes,3,opt,name=stateful_set_details,json=statefulSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNsStatus() string { - if x != nil { - return x.NsStatus - } - return "" +type ResourceDetails_DaemonSetDetails struct { + // DaemonSet-specific fields + DaemonSetDetails *DaemonSetDetails `protobuf:"bytes,4,opt,name=daemon_set_details,json=daemonSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNsFinalizers() []string { - if x != nil { - return x.NsFinalizers - } - return nil +type ResourceDetails_ReplicaSetDetails struct { + // ReplicaSet-specific fields + ReplicaSetDetails *ReplicaSetDetails `protobuf:"bytes,5,opt,name=replica_set_details,json=replicaSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeCpuCapacity() string { - if x != nil { - return x.NodeCpuCapacity - } - return "" +type ResourceDetails_JobDetails struct { + // Job-specific fields + JobDetails *JobDetails `protobuf:"bytes,6,opt,name=job_details,json=jobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeMemoryCapacity() string { - if x != nil { - return x.NodeMemoryCapacity - } - return "" +type ResourceDetails_CronJobDetails struct { + // CronJob-specific fields + CronJobDetails *CronJobDetails `protobuf:"bytes,7,opt,name=cron_job_details,json=cronJobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeReady() bool { - if x != nil { - return x.NodeReady - } - return false +type ResourceDetails_ServiceDetails struct { + // Service-specific fields + ServiceDetails *ServiceDetails `protobuf:"bytes,8,opt,name=service_details,json=serviceDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeTaints() []*NodeTaint { - if x != nil { - return x.NodeTaints - } - return nil +type ResourceDetails_IngressDetails struct { + // Ingress-specific fields + IngressDetails *IngressDetails `protobuf:"bytes,9,opt,name=ingress_details,json=ingressDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeRoles() []string { - if x != nil { - return x.NodeRoles - } - return nil +type ResourceDetails_PvcDetails struct { + // PersistentVolumeClaim-specific fields + PvcDetails *PersistentVolumeClaimDetails `protobuf:"bytes,140,opt,name=pvc_details,json=pvcDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeInternalIp() string { - if x != nil { - return x.NodeInternalIp - } - return "" +type ResourceDetails_PvDetails struct { + // PersistentVolume-specific fields + PvDetails *PersistentVolumeDetails `protobuf:"bytes,141,opt,name=pv_details,json=pvDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeExternalIp() string { - if x != nil { - return x.NodeExternalIp - } - return "" +type ResourceDetails_ScDetails struct { + // StorageClass-specific fields + ScDetails *StorageClassDetails `protobuf:"bytes,142,opt,name=sc_details,json=scDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeVersion() string { - if x != nil { - return x.NodeVersion - } - return "" +type ResourceDetails_NsDetails struct { + // Namespace-specific fields + NsDetails *NamespaceDetails `protobuf:"bytes,143,opt,name=ns_details,json=nsDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeInstanceType() string { - if x != nil { - return x.NodeInstanceType - } - return "" +type ResourceDetails_NodeDetails struct { + // Node-specific fields + NodeDetails *NodeDetails `protobuf:"bytes,144,opt,name=node_details,json=nodeDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeOs() string { - if x != nil { - return x.NodeOs - } - return "" +type ResourceDetails_HpaDetails struct { + // HorizontalPodAutoscaler-specific fields + HpaDetails *HPADetails `protobuf:"bytes,145,opt,name=hpa_details,json=hpaDetails,proto3,oneof"` +} + +type ResourceDetails_VpaDetails struct { + // VerticalPodAutoscaler-specific fields + VpaDetails *VPADetails `protobuf:"bytes,146,opt,name=vpa_details,json=vpaDetails,proto3,oneof"` +} + +type ResourceDetails_LimitRangeDetails struct { + // LimitRange-specific fields + LimitRangeDetails *LimitRangeDetails `protobuf:"bytes,147,opt,name=limit_range_details,json=limitRangeDetails,proto3,oneof"` +} + +type ResourceDetails_ServiceAccountDetails struct { + // ServiceAccount-specific fields + ServiceAccountDetails *ServiceAccountDetails `protobuf:"bytes,232,opt,name=service_account_details,json=serviceAccountDetails,proto3,oneof"` +} + +type ResourceDetails_RoleDetails struct { + // Role-specific fields + RoleDetails *RoleDetails `protobuf:"bytes,233,opt,name=role_details,json=roleDetails,proto3,oneof"` +} + +type ResourceDetails_RoleBindingDetails struct { + // RoleBinding-specific fields + RoleBindingDetails *RoleBindingDetails `protobuf:"bytes,234,opt,name=role_binding_details,json=roleBindingDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeContainerRuntime() string { - if x != nil { - return x.NodeContainerRuntime - } - return "" +type ResourceDetails_KedaScaledObjectDetails struct { + // KedaScaledObject-specific fields + KedaScaledObjectDetails *KedaScaledObjectDetails `protobuf:"bytes,235,opt,name=keda_scaled_object_details,json=kedaScaledObjectDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeImageCount() int32 { - if x != nil { - return x.NodeImageCount - } - return 0 +type ResourceDetails_KarpenterResourceDetails struct { + // KarpenterResource-specific fields + KarpenterResourceDetails *KarpenterResourceDetails `protobuf:"bytes,236,opt,name=karpenter_resource_details,json=karpenterResourceDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMinReplicas() int32 { - if x != nil { - return x.HpaMinReplicas - } - return 0 +type ResourceDetails_PodDisruptionBudgetDetails struct { + // PodDisruptionBudget-specific fields + PodDisruptionBudgetDetails *PodDisruptionBudgetDetails `protobuf:"bytes,237,opt,name=pod_disruption_budget_details,json=podDisruptionBudgetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMaxReplicas() int32 { - if x != nil { - return x.HpaMaxReplicas - } - return 0 +type ResourceDetails_ResourceQuotaDetails struct { + // ResourceQuota-specific fields + ResourceQuotaDetails *ResourceQuotaDetails `protobuf:"bytes,238,opt,name=resource_quota_details,json=resourceQuotaDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaCurrentReplicas() int32 { - if x != nil { - return x.HpaCurrentReplicas - } - return 0 +type ResourceDetails_VolcanoJobDetails struct { + // VolcanoJob-specific fields + VolcanoJobDetails *VolcanoJobDetails `protobuf:"bytes,239,opt,name=volcano_job_details,json=volcanoJobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaDesiredReplicas() int32 { - if x != nil { - return x.HpaDesiredReplicas - } - return 0 +type ResourceDetails_SparkApplicationDetails struct { + // SparkApplication-specific fields + SparkApplicationDetails *SparkApplicationDetails `protobuf:"bytes,242,opt,name=spark_application_details,json=sparkApplicationDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMetricsCount() int32 { - if x != nil { - return x.HpaMetricsCount - } - return 0 +type ResourceDetails_ScheduledSparkApplicationDetails struct { + // ScheduledSparkApplication-specific fields + ScheduledSparkApplicationDetails *ScheduledSparkApplicationDetails `protobuf:"bytes,243,opt,name=scheduled_spark_application_details,json=scheduledSparkApplicationDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaStatus() string { - if x != nil { - return x.HpaStatus - } - return "" +type ResourceDetails_KyvernoPolicyDetails struct { + // KyvernoPolicy-specific fields + KyvernoPolicyDetails *KyvernoPolicyDetails `protobuf:"bytes,244,opt,name=kyverno_policy_details,json=kyvernoPolicyDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaScaleUpStabilization() int32 { - if x != nil { - return x.HpaScaleUpStabilization - } - return 0 +type ResourceDetails_KyvernoPolicyReportDetails struct { + // KyvernoPolicyReport-specific fields + KyvernoPolicyReportDetails *KyvernoPolicyReportDetails `protobuf:"bytes,245,opt,name=kyverno_policy_report_details,json=kyvernoPolicyReportDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaScaleDownStabilization() int32 { - if x != nil { - return x.HpaScaleDownStabilization - } - return 0 +type ResourceDetails_GatekeeperConstraintTemplateDetails struct { + // GatekeeperConstraintTemplate-specific fields + GatekeeperConstraintTemplateDetails *GatekeeperConstraintTemplateDetails `protobuf:"bytes,246,opt,name=gatekeeper_constraint_template_details,json=gatekeeperConstraintTemplateDetails,proto3,oneof"` } -func (x *ResourceDetails) GetVpaUpdateMode() string { - if x != nil { - return x.VpaUpdateMode - } - return "" +type ResourceDetails_GatekeeperConstraintDetails struct { + // GatekeeperConstraint-specific fields + GatekeeperConstraintDetails *GatekeeperConstraintDetails `protobuf:"bytes,247,opt,name=gatekeeper_constraint_details,json=gatekeeperConstraintDetails,proto3,oneof"` } -func (x *ResourceDetails) GetVpaPoliciesCount() int32 { - if x != nil { - return x.VpaPoliciesCount - } - return 0 -} +func (*ResourceDetails_PodDetails) isResourceDetails_Details() {} -func (x *ResourceDetails) GetVpaRecommendationsCount() int32 { - if x != nil { - return x.VpaRecommendationsCount - } - return 0 +func (*ResourceDetails_DeploymentDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_StatefulSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_DaemonSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ReplicaSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_JobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_CronJobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ServiceDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_IngressDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PvcDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PvDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ScDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_NsDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_NodeDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_HpaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_VpaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_LimitRangeDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ServiceAccountDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_RoleDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_RoleBindingDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KedaScaledObjectDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KarpenterResourceDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PodDisruptionBudgetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ResourceQuotaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_VolcanoJobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_SparkApplicationDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ScheduledSparkApplicationDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KyvernoPolicyDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KyvernoPolicyReportDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_GatekeeperConstraintTemplateDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_GatekeeperConstraintDetails) isResourceDetails_Details() {} + +// PodDetails contains detailed Pod information (for the oneof, if we need nested data later) +type PodDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container details for debugging } -func (x *ResourceDetails) GetVpaCpuTarget() string { - if x != nil { - return x.VpaCpuTarget +func (x *PodDetails) Reset() { + *x = PodDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ResourceDetails) GetVpaMemoryTarget() string { - if x != nil { - return x.VpaMemoryTarget - } - return "" +func (x *PodDetails) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetVpaStatus() string { - if x != nil { - return x.VpaStatus +func (*PodDetails) ProtoMessage() {} + +func (x *PodDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetLimitRangeItemsCount() int32 { - if x != nil { - return x.LimitRangeItemsCount - } - return 0 +// Deprecated: Use PodDetails.ProtoReflect.Descriptor instead. +func (*PodDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{33} } -func (x *ResourceDetails) GetLimitRangeTypes() []string { +func (x *PodDetails) GetContainers() []*ContainerSummary { if x != nil { - return x.LimitRangeTypes + return x.Containers } return nil } -func (x *ResourceDetails) GetLimitRangeHasDefaults() bool { - if x != nil { - return x.LimitRangeHasDefaults - } - return false -} +// ContainerSummary provides essential container information +type ContainerSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetLimitRangeMaxCpu() string { - if x != nil { - return x.LimitRangeMaxCpu - } - return "" + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image + Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` // Container ready status + RestartCount int32 `protobuf:"varint,4,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Container restart count + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` // "running", "waiting", "terminated" + StateReason string `protobuf:"bytes,6,opt,name=state_reason,json=stateReason,proto3" json:"state_reason,omitempty"` // Reason for current state (if not running) } -func (x *ResourceDetails) GetLimitRangeMaxMemory() string { - if x != nil { - return x.LimitRangeMaxMemory +func (x *ContainerSummary) Reset() { + *x = ContainerSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ResourceDetails) GetLimitRangeMinCpu() string { - if x != nil { - return x.LimitRangeMinCpu - } - return "" +func (x *ContainerSummary) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetLimitRangeMinMemory() string { - if x != nil { - return x.LimitRangeMinMemory - } - return "" -} +func (*ContainerSummary) ProtoMessage() {} -func (x *ResourceDetails) GetLimitRangeDefaultCpuLimit() string { - if x != nil { - return x.LimitRangeDefaultCpuLimit +func (x *ContainerSummary) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetLimitRangeDefaultMemoryLimit() string { +// Deprecated: Use ContainerSummary.ProtoReflect.Descriptor instead. +func (*ContainerSummary) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{34} +} + +func (x *ContainerSummary) GetName() string { if x != nil { - return x.LimitRangeDefaultMemoryLimit + return x.Name } return "" } -func (x *ResourceDetails) GetLimitRangeDefaultCpuRequest() string { +func (x *ContainerSummary) GetImage() string { if x != nil { - return x.LimitRangeDefaultCpuRequest + return x.Image } return "" } -func (x *ResourceDetails) GetLimitRangeDefaultMemoryRequest() string { +func (x *ContainerSummary) GetReady() bool { if x != nil { - return x.LimitRangeDefaultMemoryRequest + return x.Ready } - return "" + return false } -func (x *ResourceDetails) GetLimitRangeStatus() string { +func (x *ContainerSummary) GetRestartCount() int32 { if x != nil { - return x.LimitRangeStatus + return x.RestartCount } - return "" + return 0 } -func (x *ResourceDetails) GetResourceVersion() string { +func (x *ContainerSummary) GetState() string { if x != nil { - return x.ResourceVersion + return x.State } return "" } -func (x *ResourceDetails) GetApiVersion() string { +func (x *ContainerSummary) GetStateReason() string { if x != nil { - return x.ApiVersion + return x.StateReason } return "" } -type isResourceDetails_Details interface { - isResourceDetails_Details() -} - -type ResourceDetails_PodDetails struct { - // Pod-specific fields - PodDetails *PodDetails `protobuf:"bytes,1,opt,name=pod_details,json=podDetails,proto3,oneof"` -} - -type ResourceDetails_DeploymentDetails struct { - // Deployment-specific fields - DeploymentDetails *DeploymentDetails `protobuf:"bytes,2,opt,name=deployment_details,json=deploymentDetails,proto3,oneof"` -} - -type ResourceDetails_StatefulSetDetails struct { - // StatefulSet-specific fields - StatefulSetDetails *StatefulSetDetails `protobuf:"bytes,3,opt,name=stateful_set_details,json=statefulSetDetails,proto3,oneof"` -} - -type ResourceDetails_DaemonSetDetails struct { - // DaemonSet-specific fields - DaemonSetDetails *DaemonSetDetails `protobuf:"bytes,4,opt,name=daemon_set_details,json=daemonSetDetails,proto3,oneof"` -} - -type ResourceDetails_ReplicaSetDetails struct { - // ReplicaSet-specific fields - ReplicaSetDetails *ReplicaSetDetails `protobuf:"bytes,5,opt,name=replica_set_details,json=replicaSetDetails,proto3,oneof"` -} - -type ResourceDetails_JobDetails struct { - // Job-specific fields - JobDetails *JobDetails `protobuf:"bytes,6,opt,name=job_details,json=jobDetails,proto3,oneof"` -} - -type ResourceDetails_CronJobDetails struct { - // CronJob-specific fields - CronJobDetails *CronJobDetails `protobuf:"bytes,7,opt,name=cron_job_details,json=cronJobDetails,proto3,oneof"` -} - -type ResourceDetails_ServiceDetails struct { - // Service-specific fields - ServiceDetails *ServiceDetails `protobuf:"bytes,8,opt,name=service_details,json=serviceDetails,proto3,oneof"` -} - -type ResourceDetails_IngressDetails struct { - // Ingress-specific fields - IngressDetails *IngressDetails `protobuf:"bytes,9,opt,name=ingress_details,json=ingressDetails,proto3,oneof"` -} +// DeploymentDetails contains detailed Deployment information for drill-down +type DeploymentDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type ResourceDetails_PvcDetails struct { - // PersistentVolumeClaim-specific fields - PvcDetails *PersistentVolumeClaimDetails `protobuf:"bytes,140,opt,name=pvc_details,json=pvcDetails,proto3,oneof"` + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*DeploymentCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Deployment conditions for debugging } -type ResourceDetails_PvDetails struct { - // PersistentVolume-specific fields - PvDetails *PersistentVolumeDetails `protobuf:"bytes,141,opt,name=pv_details,json=pvDetails,proto3,oneof"` +func (x *DeploymentDetails) Reset() { + *x = DeploymentDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type ResourceDetails_ScDetails struct { - // StorageClass-specific fields - ScDetails *StorageClassDetails `protobuf:"bytes,142,opt,name=sc_details,json=scDetails,proto3,oneof"` +func (x *DeploymentDetails) String() string { + return protoimpl.X.MessageStringOf(x) } -type ResourceDetails_NsDetails struct { - // Namespace-specific fields - NsDetails *NamespaceDetails `protobuf:"bytes,143,opt,name=ns_details,json=nsDetails,proto3,oneof"` -} +func (*DeploymentDetails) ProtoMessage() {} -type ResourceDetails_NodeDetails struct { - // Node-specific fields - NodeDetails *NodeDetails `protobuf:"bytes,144,opt,name=node_details,json=nodeDetails,proto3,oneof"` +func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[35] + 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) } -type ResourceDetails_HpaDetails struct { - // HorizontalPodAutoscaler-specific fields - HpaDetails *HPADetails `protobuf:"bytes,145,opt,name=hpa_details,json=hpaDetails,proto3,oneof"` +// Deprecated: Use DeploymentDetails.ProtoReflect.Descriptor instead. +func (*DeploymentDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{35} } -type ResourceDetails_VpaDetails struct { - // VerticalPodAutoscaler-specific fields - VpaDetails *VPADetails `protobuf:"bytes,146,opt,name=vpa_details,json=vpaDetails,proto3,oneof"` +func (x *DeploymentDetails) GetContainers() []*ContainerTemplate { + if x != nil { + return x.Containers + } + return nil } -type ResourceDetails_LimitRangeDetails struct { - // LimitRange-specific fields - LimitRangeDetails *LimitRangeDetails `protobuf:"bytes,147,opt,name=limit_range_details,json=limitRangeDetails,proto3,oneof"` +func (x *DeploymentDetails) GetConditions() []*DeploymentCondition { + if x != nil { + return x.Conditions + } + return nil } -type ResourceDetails_ServiceAccountDetails struct { - // ServiceAccount-specific fields - ServiceAccountDetails *ServiceAccountDetails `protobuf:"bytes,232,opt,name=service_account_details,json=serviceAccountDetails,proto3,oneof"` -} +// ContainerTemplate represents a container template in a deployment +type ContainerTemplate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type ResourceDetails_RoleDetails struct { - // Role-specific fields - RoleDetails *RoleDetails `protobuf:"bytes,233,opt,name=role_details,json=roleDetails,proto3,oneof"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image + CpuRequestsMillicores int64 `protobuf:"varint,3,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // CPU requests in millicores + MemoryRequestsBytes int64 `protobuf:"varint,4,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Memory requests in bytes + CpuLimitsMillicores int64 `protobuf:"varint,5,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // CPU limits in millicores + MemoryLimitsBytes int64 `protobuf:"varint,6,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Memory limits in bytes } -type ResourceDetails_RoleBindingDetails struct { - // RoleBinding-specific fields - RoleBindingDetails *RoleBindingDetails `protobuf:"bytes,234,opt,name=role_binding_details,json=roleBindingDetails,proto3,oneof"` +func (x *ContainerTemplate) Reset() { + *x = ContainerTemplate{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type ResourceDetails_KedaScaledObjectDetails struct { - // KedaScaledObject-specific fields - KedaScaledObjectDetails *KedaScaledObjectDetails `protobuf:"bytes,235,opt,name=keda_scaled_object_details,json=kedaScaledObjectDetails,proto3,oneof"` +func (x *ContainerTemplate) String() string { + return protoimpl.X.MessageStringOf(x) } -type ResourceDetails_KarpenterResourceDetails struct { - // KarpenterResource-specific fields - KarpenterResourceDetails *KarpenterResourceDetails `protobuf:"bytes,236,opt,name=karpenter_resource_details,json=karpenterResourceDetails,proto3,oneof"` -} +func (*ContainerTemplate) ProtoMessage() {} -type ResourceDetails_PodDisruptionBudgetDetails struct { - // PodDisruptionBudget-specific fields - PodDisruptionBudgetDetails *PodDisruptionBudgetDetails `protobuf:"bytes,237,opt,name=pod_disruption_budget_details,json=podDisruptionBudgetDetails,proto3,oneof"` +func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[36] + 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) } -type ResourceDetails_ResourceQuotaDetails struct { - // ResourceQuota-specific fields - ResourceQuotaDetails *ResourceQuotaDetails `protobuf:"bytes,238,opt,name=resource_quota_details,json=resourceQuotaDetails,proto3,oneof"` +// Deprecated: Use ContainerTemplate.ProtoReflect.Descriptor instead. +func (*ContainerTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{36} } -type ResourceDetails_VolcanoJobDetails struct { - // VolcanoJob-specific fields - VolcanoJobDetails *VolcanoJobDetails `protobuf:"bytes,239,opt,name=volcano_job_details,json=volcanoJobDetails,proto3,oneof"` +func (x *ContainerTemplate) GetName() string { + if x != nil { + return x.Name + } + return "" } -type ResourceDetails_SparkApplicationDetails struct { - // SparkApplication-specific fields - SparkApplicationDetails *SparkApplicationDetails `protobuf:"bytes,242,opt,name=spark_application_details,json=sparkApplicationDetails,proto3,oneof"` +func (x *ContainerTemplate) GetImage() string { + if x != nil { + return x.Image + } + return "" } -type ResourceDetails_ScheduledSparkApplicationDetails struct { - // ScheduledSparkApplication-specific fields - ScheduledSparkApplicationDetails *ScheduledSparkApplicationDetails `protobuf:"bytes,243,opt,name=scheduled_spark_application_details,json=scheduledSparkApplicationDetails,proto3,oneof"` +func (x *ContainerTemplate) GetCpuRequestsMillicores() int64 { + if x != nil { + return x.CpuRequestsMillicores + } + return 0 } -func (*ResourceDetails_PodDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_DeploymentDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_StatefulSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_DaemonSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ReplicaSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_JobDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_CronJobDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ServiceDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_IngressDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_PvcDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_PvDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ScDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_NsDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetMemoryRequestsBytes() int64 { + if x != nil { + return x.MemoryRequestsBytes + } + return 0 +} -func (*ResourceDetails_NodeDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetCpuLimitsMillicores() int64 { + if x != nil { + return x.CpuLimitsMillicores + } + return 0 +} -func (*ResourceDetails_HpaDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetMemoryLimitsBytes() int64 { + if x != nil { + return x.MemoryLimitsBytes + } + return 0 +} -func (*ResourceDetails_VpaDetails) isResourceDetails_Details() {} +// DeploymentCondition represents a deployment condition +type DeploymentCondition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (*ResourceDetails_LimitRangeDetails) isResourceDetails_Details() {} + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Available", "Progressing", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastUpdateTime int64 `protobuf:"varint,5,opt,name=last_update_time,json=lastUpdateTime,proto3" json:"last_update_time,omitempty"` // Last time condition was updated +} -func (*ResourceDetails_ServiceAccountDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) Reset() { + *x = DeploymentCondition{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} -func (*ResourceDetails_RoleDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) String() string { + return protoimpl.X.MessageStringOf(x) +} -func (*ResourceDetails_RoleBindingDetails) isResourceDetails_Details() {} +func (*DeploymentCondition) ProtoMessage() {} -func (*ResourceDetails_KedaScaledObjectDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[37] + 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) +} -func (*ResourceDetails_KarpenterResourceDetails) isResourceDetails_Details() {} +// Deprecated: Use DeploymentCondition.ProtoReflect.Descriptor instead. +func (*DeploymentCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{37} +} -func (*ResourceDetails_PodDisruptionBudgetDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetType() string { + if x != nil { + return x.Type + } + return "" +} -func (*ResourceDetails_ResourceQuotaDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} -func (*ResourceDetails_VolcanoJobDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} -func (*ResourceDetails_SparkApplicationDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} -func (*ResourceDetails_ScheduledSparkApplicationDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetLastUpdateTime() int64 { + if x != nil { + return x.LastUpdateTime + } + return 0 +} -// PodDetails contains detailed Pod information (for the oneof, if we need nested data later) -type PodDetails struct { +// StatefulSetDetails contains detailed StatefulSet information for drill-down +type StatefulSetDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container details for debugging + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + VolumeClaimTemplates []*VolumeClaimTemplate `protobuf:"bytes,2,rep,name=volume_claim_templates,json=volumeClaimTemplates,proto3" json:"volume_claim_templates,omitempty"` // PVC templates + Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` // Update strategy partition (for canary updates) } -func (x *PodDetails) Reset() { - *x = PodDetails{} +func (x *StatefulSetDetails) Reset() { + *x = StatefulSetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[27] + mi := &file_api_v1_common_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PodDetails) String() string { +func (x *StatefulSetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PodDetails) ProtoMessage() {} +func (*StatefulSetDetails) ProtoMessage() {} -func (x *PodDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[27] +func (x *StatefulSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5936,49 +7326,62 @@ func (x *PodDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PodDetails.ProtoReflect.Descriptor instead. -func (*PodDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{27} +// Deprecated: Use StatefulSetDetails.ProtoReflect.Descriptor instead. +func (*StatefulSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{38} } -func (x *PodDetails) GetContainers() []*ContainerSummary { +func (x *StatefulSetDetails) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -// ContainerSummary provides essential container information -type ContainerSummary struct { +func (x *StatefulSetDetails) GetVolumeClaimTemplates() []*VolumeClaimTemplate { + if x != nil { + return x.VolumeClaimTemplates + } + return nil +} + +func (x *StatefulSetDetails) GetPartition() int32 { + if x != nil { + return x.Partition + } + return 0 +} + +// VolumeClaimTemplate represents a volume claim template in a StatefulSet +type VolumeClaimTemplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image - Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` // Container ready status - RestartCount int32 `protobuf:"varint,4,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Container restart count - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` // "running", "waiting", "terminated" - StateReason string `protobuf:"bytes,6,opt,name=state_reason,json=stateReason,proto3" json:"state_reason,omitempty"` // Reason for current state (if not running) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC template name + AccessModes []string `protobuf:"bytes,2,rep,name=access_modes,json=accessModes,proto3" json:"access_modes,omitempty"` // "ReadWriteOnce", etc. + VolumeMode string `protobuf:"bytes,3,opt,name=volume_mode,json=volumeMode,proto3" json:"volume_mode,omitempty"` // "Filesystem" or "Block" + StorageRequests int64 `protobuf:"varint,4,opt,name=storage_requests,json=storageRequests,proto3" json:"storage_requests,omitempty"` // Storage size requested in bytes + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Storage class name (optional) } -func (x *ContainerSummary) Reset() { - *x = ContainerSummary{} +func (x *VolumeClaimTemplate) Reset() { + *x = VolumeClaimTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[28] + mi := &file_api_v1_common_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerSummary) String() string { +func (x *VolumeClaimTemplate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerSummary) ProtoMessage() {} +func (*VolumeClaimTemplate) ProtoMessage() {} -func (x *ContainerSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[28] +func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5989,80 +7392,137 @@ func (x *ContainerSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerSummary.ProtoReflect.Descriptor instead. -func (*ContainerSummary) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{28} +// Deprecated: Use VolumeClaimTemplate.ProtoReflect.Descriptor instead. +func (*VolumeClaimTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{39} } -func (x *ContainerSummary) GetName() string { +func (x *VolumeClaimTemplate) GetName() string { if x != nil { return x.Name } return "" } -func (x *ContainerSummary) GetImage() string { +func (x *VolumeClaimTemplate) GetAccessModes() []string { if x != nil { - return x.Image + return x.AccessModes } - return "" + return nil } -func (x *ContainerSummary) GetReady() bool { +func (x *VolumeClaimTemplate) GetVolumeMode() string { if x != nil { - return x.Ready + return x.VolumeMode } - return false + return "" } -func (x *ContainerSummary) GetRestartCount() int32 { +func (x *VolumeClaimTemplate) GetStorageRequests() int64 { if x != nil { - return x.RestartCount + return x.StorageRequests } return 0 } -func (x *ContainerSummary) GetState() string { +func (x *VolumeClaimTemplate) GetStorageClass() string { if x != nil { - return x.State + return x.StorageClass } return "" } -func (x *ContainerSummary) GetStateReason() string { +// DaemonSetDetails contains detailed DaemonSet information for drill-down +type DaemonSetDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Tolerations []*TolerationInfo `protobuf:"bytes,2,rep,name=tolerations,proto3" json:"tolerations,omitempty"` // Tolerations for node scheduling + NodeSelector *NodeSelector `protobuf:"bytes,3,opt,name=node_selector,json=nodeSelector,proto3" json:"node_selector,omitempty"` // Node selector requirements (optional) +} + +func (x *DaemonSetDetails) Reset() { + *x = DaemonSetDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DaemonSetDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DaemonSetDetails) ProtoMessage() {} + +func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_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 DaemonSetDetails.ProtoReflect.Descriptor instead. +func (*DaemonSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{40} +} + +func (x *DaemonSetDetails) GetContainers() []*ContainerTemplate { + if x != nil { + return x.Containers + } + return nil +} + +func (x *DaemonSetDetails) GetTolerations() []*TolerationInfo { + if x != nil { + return x.Tolerations + } + return nil +} + +func (x *DaemonSetDetails) GetNodeSelector() *NodeSelector { if x != nil { - return x.StateReason + return x.NodeSelector } - return "" + return nil } -// DeploymentDetails contains detailed Deployment information for drill-down -type DeploymentDetails struct { +// ReplicaSetDetails contains detailed ReplicaSet information for drill-down +type ReplicaSetDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - Conditions []*DeploymentCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Deployment conditions for debugging + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for replica set } -func (x *DeploymentDetails) Reset() { - *x = DeploymentDetails{} +func (x *ReplicaSetDetails) Reset() { + *x = ReplicaSetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[29] + mi := &file_api_v1_common_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeploymentDetails) String() string { +func (x *ReplicaSetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeploymentDetails) ProtoMessage() {} +func (*ReplicaSetDetails) ProtoMessage() {} -func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[29] +func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6073,56 +7533,53 @@ func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeploymentDetails.ProtoReflect.Descriptor instead. -func (*DeploymentDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{29} +// Deprecated: Use ReplicaSetDetails.ProtoReflect.Descriptor instead. +func (*ReplicaSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{41} } -func (x *DeploymentDetails) GetContainers() []*ContainerTemplate { +func (x *ReplicaSetDetails) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -func (x *DeploymentDetails) GetConditions() []*DeploymentCondition { +func (x *ReplicaSetDetails) GetSelector() *LabelSelector { if x != nil { - return x.Conditions + return x.Selector } return nil } -// ContainerTemplate represents a container template in a deployment -type ContainerTemplate struct { +// JobDetails contains detailed Job information for drill-down +type JobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image - CpuRequestsMillicores int64 `protobuf:"varint,3,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // CPU requests in millicores - MemoryRequestsBytes int64 `protobuf:"varint,4,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Memory requests in bytes - CpuLimitsMillicores int64 `protobuf:"varint,5,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // CPU limits in millicores - MemoryLimitsBytes int64 `protobuf:"varint,6,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Memory limits in bytes + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*JobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Job conditions for debugging + Selector *LabelSelector `protobuf:"bytes,3,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for job } -func (x *ContainerTemplate) Reset() { - *x = ContainerTemplate{} +func (x *JobDetails) Reset() { + *x = JobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[30] + mi := &file_api_v1_common_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerTemplate) String() string { +func (x *JobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerTemplate) ProtoMessage() {} +func (*JobDetails) ProtoMessage() {} -func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[30] +func (x *JobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6133,83 +7590,63 @@ func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerTemplate.ProtoReflect.Descriptor instead. -func (*ContainerTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{30} -} - -func (x *ContainerTemplate) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ContainerTemplate) GetImage() string { - if x != nil { - return x.Image - } - return "" -} - -func (x *ContainerTemplate) GetCpuRequestsMillicores() int64 { - if x != nil { - return x.CpuRequestsMillicores - } - return 0 +// Deprecated: Use JobDetails.ProtoReflect.Descriptor instead. +func (*JobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{42} } -func (x *ContainerTemplate) GetMemoryRequestsBytes() int64 { +func (x *JobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.MemoryRequestsBytes + return x.Containers } - return 0 + return nil } -func (x *ContainerTemplate) GetCpuLimitsMillicores() int64 { +func (x *JobDetails) GetConditions() []*JobCondition { if x != nil { - return x.CpuLimitsMillicores + return x.Conditions } - return 0 + return nil } -func (x *ContainerTemplate) GetMemoryLimitsBytes() int64 { +func (x *JobDetails) GetSelector() *LabelSelector { if x != nil { - return x.MemoryLimitsBytes + return x.Selector } - return 0 + return nil } -// DeploymentCondition represents a deployment condition -type DeploymentCondition struct { +// JobCondition represents a job condition +type JobCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Available", "Progressing", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastUpdateTime int64 `protobuf:"varint,5,opt,name=last_update_time,json=lastUpdateTime,proto3" json:"last_update_time,omitempty"` // Last time condition was updated + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Complete", "Failed", "SuccessCriteriaMet", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *DeploymentCondition) Reset() { - *x = DeploymentCondition{} +func (x *JobCondition) Reset() { + *x = JobCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[31] + mi := &file_api_v1_common_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeploymentCondition) String() string { +func (x *JobCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeploymentCondition) ProtoMessage() {} +func (*JobCondition) ProtoMessage() {} -func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[31] +func (x *JobCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6220,140 +7657,81 @@ func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeploymentCondition.ProtoReflect.Descriptor instead. -func (*DeploymentCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{31} +// Deprecated: Use JobCondition.ProtoReflect.Descriptor instead. +func (*JobCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{43} } -func (x *DeploymentCondition) GetType() string { +func (x *JobCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *DeploymentCondition) GetStatus() string { +func (x *JobCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *DeploymentCondition) GetReason() string { +func (x *JobCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *DeploymentCondition) GetMessage() string { +func (x *JobCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *DeploymentCondition) GetLastUpdateTime() int64 { +func (x *JobCondition) GetLastProbeTime() int64 { if x != nil { - return x.LastUpdateTime + return x.LastProbeTime } return 0 } -// StatefulSetDetails contains detailed StatefulSet information for drill-down -type StatefulSetDetails struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - VolumeClaimTemplates []*VolumeClaimTemplate `protobuf:"bytes,2,rep,name=volume_claim_templates,json=volumeClaimTemplates,proto3" json:"volume_claim_templates,omitempty"` // PVC templates - Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` // Update strategy partition (for canary updates) -} - -func (x *StatefulSetDetails) Reset() { - *x = StatefulSetDetails{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatefulSetDetails) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatefulSetDetails) ProtoMessage() {} - -func (x *StatefulSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[32] - 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 StatefulSetDetails.ProtoReflect.Descriptor instead. -func (*StatefulSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{32} -} - -func (x *StatefulSetDetails) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil -} - -func (x *StatefulSetDetails) GetVolumeClaimTemplates() []*VolumeClaimTemplate { - if x != nil { - return x.VolumeClaimTemplates - } - return nil -} - -func (x *StatefulSetDetails) GetPartition() int32 { +func (x *JobCondition) GetLastTransitionTime() int64 { if x != nil { - return x.Partition + return x.LastTransitionTime } return 0 } -// VolumeClaimTemplate represents a volume claim template in a StatefulSet -type VolumeClaimTemplate struct { +// CronJobDetails contains detailed CronJob information for drill-down +type CronJobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC template name - AccessModes []string `protobuf:"bytes,2,rep,name=access_modes,json=accessModes,proto3" json:"access_modes,omitempty"` // "ReadWriteOnce", etc. - VolumeMode string `protobuf:"bytes,3,opt,name=volume_mode,json=volumeMode,proto3" json:"volume_mode,omitempty"` // "Filesystem" or "Block" - StorageRequests int64 `protobuf:"varint,4,opt,name=storage_requests,json=storageRequests,proto3" json:"storage_requests,omitempty"` // Storage size requested in bytes - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Storage class name (optional) + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from job template pod spec + ActiveJobs []*ActiveJobReference `protobuf:"bytes,2,rep,name=active_jobs,json=activeJobs,proto3" json:"active_jobs,omitempty"` // Currently active jobs + JobTemplate *JobTemplate `protobuf:"bytes,3,opt,name=job_template,json=jobTemplate,proto3" json:"job_template,omitempty"` // Job template specification } -func (x *VolumeClaimTemplate) Reset() { - *x = VolumeClaimTemplate{} +func (x *CronJobDetails) Reset() { + *x = CronJobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[33] + mi := &file_api_v1_common_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolumeClaimTemplate) String() string { +func (x *CronJobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolumeClaimTemplate) ProtoMessage() {} +func (*CronJobDetails) ProtoMessage() {} -func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[33] +func (x *CronJobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6364,74 +7742,61 @@ func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolumeClaimTemplate.ProtoReflect.Descriptor instead. -func (*VolumeClaimTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{33} -} - -func (x *VolumeClaimTemplate) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use CronJobDetails.ProtoReflect.Descriptor instead. +func (*CronJobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{44} } -func (x *VolumeClaimTemplate) GetAccessModes() []string { +func (x *CronJobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.AccessModes + return x.Containers } return nil } -func (x *VolumeClaimTemplate) GetVolumeMode() string { - if x != nil { - return x.VolumeMode - } - return "" -} - -func (x *VolumeClaimTemplate) GetStorageRequests() int64 { +func (x *CronJobDetails) GetActiveJobs() []*ActiveJobReference { if x != nil { - return x.StorageRequests + return x.ActiveJobs } - return 0 + return nil } -func (x *VolumeClaimTemplate) GetStorageClass() string { +func (x *CronJobDetails) GetJobTemplate() *JobTemplate { if x != nil { - return x.StorageClass + return x.JobTemplate } - return "" + return nil } -// DaemonSetDetails contains detailed DaemonSet information for drill-down -type DaemonSetDetails struct { +// ActiveJobReference represents an active job created by a CronJob +type ActiveJobReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - Tolerations []*TolerationInfo `protobuf:"bytes,2,rep,name=tolerations,proto3" json:"tolerations,omitempty"` // Tolerations for node scheduling - NodeSelector *NodeSelector `protobuf:"bytes,3,opt,name=node_selector,json=nodeSelector,proto3" json:"node_selector,omitempty"` // Node selector requirements (optional) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Job name + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` // Job UID + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Job namespace + CreationTime int64 `protobuf:"varint,4,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` // Job creation timestamp } -func (x *DaemonSetDetails) Reset() { - *x = DaemonSetDetails{} +func (x *ActiveJobReference) Reset() { + *x = ActiveJobReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[34] + mi := &file_api_v1_common_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DaemonSetDetails) String() string { +func (x *ActiveJobReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DaemonSetDetails) ProtoMessage() {} +func (*ActiveJobReference) ProtoMessage() {} -func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[34] +func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6442,59 +7807,69 @@ func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DaemonSetDetails.ProtoReflect.Descriptor instead. -func (*DaemonSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{34} +// Deprecated: Use ActiveJobReference.ProtoReflect.Descriptor instead. +func (*ActiveJobReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{45} } -func (x *DaemonSetDetails) GetContainers() []*ContainerTemplate { +func (x *ActiveJobReference) GetName() string { if x != nil { - return x.Containers + return x.Name } - return nil + return "" } -func (x *DaemonSetDetails) GetTolerations() []*TolerationInfo { +func (x *ActiveJobReference) GetUid() string { if x != nil { - return x.Tolerations + return x.Uid } - return nil + return "" } -func (x *DaemonSetDetails) GetNodeSelector() *NodeSelector { +func (x *ActiveJobReference) GetNamespace() string { if x != nil { - return x.NodeSelector + return x.Namespace } - return nil + return "" } -// ReplicaSetDetails contains detailed ReplicaSet information for drill-down -type ReplicaSetDetails struct { +func (x *ActiveJobReference) GetCreationTime() int64 { + if x != nil { + return x.CreationTime + } + return 0 +} + +// JobTemplate represents the job template in a CronJob +type JobTemplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for replica set + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates + BackoffLimit int32 `protobuf:"varint,2,opt,name=backoff_limit,json=backoffLimit,proto3" json:"backoff_limit,omitempty"` // Backoff limit from job template + Completions int32 `protobuf:"varint,3,opt,name=completions,proto3" json:"completions,omitempty"` // Desired completions + Parallelism int32 `protobuf:"varint,4,opt,name=parallelism,proto3" json:"parallelism,omitempty"` // Parallelism setting + CompletionMode string `protobuf:"bytes,5,opt,name=completion_mode,json=completionMode,proto3" json:"completion_mode,omitempty"` // Completion mode } -func (x *ReplicaSetDetails) Reset() { - *x = ReplicaSetDetails{} +func (x *JobTemplate) Reset() { + *x = JobTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[35] + mi := &file_api_v1_common_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReplicaSetDetails) String() string { +func (x *JobTemplate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplicaSetDetails) ProtoMessage() {} +func (*JobTemplate) ProtoMessage() {} -func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[35] +func (x *JobTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6505,53 +7880,75 @@ func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplicaSetDetails.ProtoReflect.Descriptor instead. -func (*ReplicaSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{35} +// Deprecated: Use JobTemplate.ProtoReflect.Descriptor instead. +func (*JobTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{46} } -func (x *ReplicaSetDetails) GetContainers() []*ContainerTemplate { +func (x *JobTemplate) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -func (x *ReplicaSetDetails) GetSelector() *LabelSelector { +func (x *JobTemplate) GetBackoffLimit() int32 { if x != nil { - return x.Selector + return x.BackoffLimit } - return nil + return 0 } -// JobDetails contains detailed Job information for drill-down -type JobDetails struct { +func (x *JobTemplate) GetCompletions() int32 { + if x != nil { + return x.Completions + } + return 0 +} + +func (x *JobTemplate) GetParallelism() int32 { + if x != nil { + return x.Parallelism + } + return 0 +} + +func (x *JobTemplate) GetCompletionMode() string { + if x != nil { + return x.CompletionMode + } + return "" +} + +// ServiceDetails contains detailed Service information for drill-down +type ServiceDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - Conditions []*JobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Job conditions for debugging - Selector *LabelSelector `protobuf:"bytes,3,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for job + Ports []*ServicePort `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"` // Detailed port information + Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector + LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,3,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // LoadBalancer ingress points + EndpointAddresses []string `protobuf:"bytes,4,rep,name=endpoint_addresses,json=endpointAddresses,proto3" json:"endpoint_addresses,omitempty"` // Endpoint addresses (if available) } -func (x *JobDetails) Reset() { - *x = JobDetails{} +func (x *ServiceDetails) Reset() { + *x = ServiceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[36] + mi := &file_api_v1_common_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobDetails) String() string { +func (x *ServiceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobDetails) ProtoMessage() {} +func (*ServiceDetails) ProtoMessage() {} -func (x *JobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[36] +func (x *ServiceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6562,63 +7959,71 @@ func (x *JobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobDetails.ProtoReflect.Descriptor instead. -func (*JobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{36} +// Deprecated: Use ServiceDetails.ProtoReflect.Descriptor instead. +func (*ServiceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{47} } -func (x *JobDetails) GetContainers() []*ContainerTemplate { +func (x *ServiceDetails) GetPorts() []*ServicePort { if x != nil { - return x.Containers + return x.Ports } return nil } -func (x *JobDetails) GetConditions() []*JobCondition { +func (x *ServiceDetails) GetSelector() map[string]string { if x != nil { - return x.Conditions + return x.Selector } return nil } -func (x *JobDetails) GetSelector() *LabelSelector { +func (x *ServiceDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { if x != nil { - return x.Selector + return x.LoadBalancerIngress } return nil } -// JobCondition represents a job condition -type JobCondition struct { +func (x *ServiceDetails) GetEndpointAddresses() []string { + if x != nil { + return x.EndpointAddresses + } + return nil +} + +// ServicePort represents a port exposed by a service +type ServicePort struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Complete", "Failed", "SuccessCriteriaMet", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Port name (optional) + Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Service port number + TargetPort int32 `protobuf:"varint,3,opt,name=target_port,json=targetPort,proto3" json:"target_port,omitempty"` // Target port on pods (could be port number or name) + TargetPortName string `protobuf:"bytes,4,opt,name=target_port_name,json=targetPortName,proto3" json:"target_port_name,omitempty"` // Target port name if it's a named port + Protocol string `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"` // Protocol: "TCP", "UDP", "SCTP" + NodePort int32 `protobuf:"varint,6,opt,name=node_port,json=nodePort,proto3" json:"node_port,omitempty"` // NodePort (for NodePort and LoadBalancer services) + AppProtocol string `protobuf:"bytes,7,opt,name=app_protocol,json=appProtocol,proto3" json:"app_protocol,omitempty"` // Application protocol (optional, e.g., "HTTP", "HTTPS") } -func (x *JobCondition) Reset() { - *x = JobCondition{} +func (x *ServicePort) Reset() { + *x = ServicePort{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[37] + mi := &file_api_v1_common_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobCondition) String() string { +func (x *ServicePort) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobCondition) ProtoMessage() {} +func (*ServicePort) ProtoMessage() {} -func (x *JobCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[37] +func (x *ServicePort) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6629,81 +8034,89 @@ func (x *JobCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobCondition.ProtoReflect.Descriptor instead. -func (*JobCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{37} +// Deprecated: Use ServicePort.ProtoReflect.Descriptor instead. +func (*ServicePort) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{48} } -func (x *JobCondition) GetType() string { +func (x *ServicePort) GetName() string { if x != nil { - return x.Type + return x.Name } return "" } -func (x *JobCondition) GetStatus() string { +func (x *ServicePort) GetPort() int32 { if x != nil { - return x.Status + return x.Port } - return "" + return 0 } -func (x *JobCondition) GetReason() string { +func (x *ServicePort) GetTargetPort() int32 { if x != nil { - return x.Reason + return x.TargetPort + } + return 0 +} + +func (x *ServicePort) GetTargetPortName() string { + if x != nil { + return x.TargetPortName } return "" } -func (x *JobCondition) GetMessage() string { +func (x *ServicePort) GetProtocol() string { if x != nil { - return x.Message + return x.Protocol } return "" } -func (x *JobCondition) GetLastProbeTime() int64 { +func (x *ServicePort) GetNodePort() int32 { if x != nil { - return x.LastProbeTime + return x.NodePort } return 0 } -func (x *JobCondition) GetLastTransitionTime() int64 { +func (x *ServicePort) GetAppProtocol() string { if x != nil { - return x.LastTransitionTime + return x.AppProtocol } - return 0 + return "" } -// CronJobDetails contains detailed CronJob information for drill-down -type CronJobDetails struct { +// LoadBalancerIngress represents a load balancer ingress point +type LoadBalancerIngress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from job template pod spec - ActiveJobs []*ActiveJobReference `protobuf:"bytes,2,rep,name=active_jobs,json=activeJobs,proto3" json:"active_jobs,omitempty"` // Currently active jobs - JobTemplate *JobTemplate `protobuf:"bytes,3,opt,name=job_template,json=jobTemplate,proto3" json:"job_template,omitempty"` // Job template specification + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` // IP address + Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` // Hostname (alternative to IP) + Ports []string `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"` // Ports information from ingress + IpMode string `protobuf:"bytes,4,opt,name=ip_mode,json=ipMode,proto3" json:"ip_mode,omitempty"` // IP mode: "VIP" or "Proxy" } -func (x *CronJobDetails) Reset() { - *x = CronJobDetails{} +func (x *LoadBalancerIngress) Reset() { + *x = LoadBalancerIngress{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[38] + mi := &file_api_v1_common_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CronJobDetails) String() string { +func (x *LoadBalancerIngress) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CronJobDetails) ProtoMessage() {} +func (*LoadBalancerIngress) ProtoMessage() {} -func (x *CronJobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[38] +func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6714,61 +8127,68 @@ func (x *CronJobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CronJobDetails.ProtoReflect.Descriptor instead. -func (*CronJobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{38} +// Deprecated: Use LoadBalancerIngress.ProtoReflect.Descriptor instead. +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{49} } -func (x *CronJobDetails) GetContainers() []*ContainerTemplate { +func (x *LoadBalancerIngress) GetIp() string { if x != nil { - return x.Containers + return x.Ip } - return nil + return "" } -func (x *CronJobDetails) GetActiveJobs() []*ActiveJobReference { +func (x *LoadBalancerIngress) GetHostname() string { if x != nil { - return x.ActiveJobs + return x.Hostname } - return nil + return "" } -func (x *CronJobDetails) GetJobTemplate() *JobTemplate { +func (x *LoadBalancerIngress) GetPorts() []string { if x != nil { - return x.JobTemplate + return x.Ports } return nil } -// ActiveJobReference represents an active job created by a CronJob -type ActiveJobReference struct { +func (x *LoadBalancerIngress) GetIpMode() string { + if x != nil { + return x.IpMode + } + return "" +} + +// IngressDetails contains detailed Ingress information for drill-down +type IngressDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Job name - Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` // Job UID - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Job namespace - CreationTime int64 `protobuf:"varint,4,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` // Job creation timestamp + Rules []*IngressRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Ingress rules + Tls []*IngressTLS `protobuf:"bytes,2,rep,name=tls,proto3" json:"tls,omitempty"` // TLS configurations + DefaultBackend *IngressBackend `protobuf:"bytes,3,opt,name=default_backend,json=defaultBackend,proto3" json:"default_backend,omitempty"` // Default backend (optional) + LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,4,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // Load balancer status } -func (x *ActiveJobReference) Reset() { - *x = ActiveJobReference{} +func (x *IngressDetails) Reset() { + *x = IngressDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[39] + mi := &file_api_v1_common_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ActiveJobReference) String() string { +func (x *IngressDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ActiveJobReference) ProtoMessage() {} +func (*IngressDetails) ProtoMessage() {} -func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[39] +func (x *IngressDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6779,69 +8199,66 @@ func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ActiveJobReference.ProtoReflect.Descriptor instead. -func (*ActiveJobReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{39} +// Deprecated: Use IngressDetails.ProtoReflect.Descriptor instead. +func (*IngressDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{50} } -func (x *ActiveJobReference) GetName() string { +func (x *IngressDetails) GetRules() []*IngressRule { if x != nil { - return x.Name + return x.Rules } - return "" + return nil } -func (x *ActiveJobReference) GetUid() string { +func (x *IngressDetails) GetTls() []*IngressTLS { if x != nil { - return x.Uid + return x.Tls } - return "" + return nil } -func (x *ActiveJobReference) GetNamespace() string { +func (x *IngressDetails) GetDefaultBackend() *IngressBackend { if x != nil { - return x.Namespace + return x.DefaultBackend } - return "" + return nil } -func (x *ActiveJobReference) GetCreationTime() int64 { +func (x *IngressDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { if x != nil { - return x.CreationTime + return x.LoadBalancerIngress } - return 0 + return nil } -// JobTemplate represents the job template in a CronJob -type JobTemplate struct { +// IngressRule represents an ingress rule +type IngressRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates - BackoffLimit int32 `protobuf:"varint,2,opt,name=backoff_limit,json=backoffLimit,proto3" json:"backoff_limit,omitempty"` // Backoff limit from job template - Completions int32 `protobuf:"varint,3,opt,name=completions,proto3" json:"completions,omitempty"` // Desired completions - Parallelism int32 `protobuf:"varint,4,opt,name=parallelism,proto3" json:"parallelism,omitempty"` // Parallelism setting - CompletionMode string `protobuf:"bytes,5,opt,name=completion_mode,json=completionMode,proto3" json:"completion_mode,omitempty"` // Completion mode + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // Host name (optional, empty means all hosts) + Paths []*IngressPath `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` // HTTP paths } -func (x *JobTemplate) Reset() { - *x = JobTemplate{} +func (x *IngressRule) Reset() { + *x = IngressRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[40] + mi := &file_api_v1_common_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobTemplate) String() string { +func (x *IngressRule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobTemplate) ProtoMessage() {} +func (*IngressRule) ProtoMessage() {} -func (x *JobTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[40] +func (x *IngressRule) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6852,75 +8269,53 @@ func (x *JobTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobTemplate.ProtoReflect.Descriptor instead. -func (*JobTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{40} -} - -func (x *JobTemplate) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil -} - -func (x *JobTemplate) GetBackoffLimit() int32 { - if x != nil { - return x.BackoffLimit - } - return 0 -} - -func (x *JobTemplate) GetCompletions() int32 { - if x != nil { - return x.Completions - } - return 0 +// Deprecated: Use IngressRule.ProtoReflect.Descriptor instead. +func (*IngressRule) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{51} } -func (x *JobTemplate) GetParallelism() int32 { +func (x *IngressRule) GetHost() string { if x != nil { - return x.Parallelism + return x.Host } - return 0 + return "" } -func (x *JobTemplate) GetCompletionMode() string { +func (x *IngressRule) GetPaths() []*IngressPath { if x != nil { - return x.CompletionMode + return x.Paths } - return "" + return nil } -// ServiceDetails contains detailed Service information for drill-down -type ServiceDetails struct { +// IngressPath represents a path rule within an ingress +type IngressPath struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ports []*ServicePort `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"` // Detailed port information - Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector - LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,3,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // LoadBalancer ingress points - EndpointAddresses []string `protobuf:"bytes,4,rep,name=endpoint_addresses,json=endpointAddresses,proto3" json:"endpoint_addresses,omitempty"` // Endpoint addresses (if available) + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // URL path + PathType string `protobuf:"bytes,2,opt,name=path_type,json=pathType,proto3" json:"path_type,omitempty"` // Path type: "Exact", "Prefix", "ImplementationSpecific" + Backend *IngressBackend `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"` // Backend service } -func (x *ServiceDetails) Reset() { - *x = ServiceDetails{} +func (x *IngressPath) Reset() { + *x = IngressPath{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[41] + mi := &file_api_v1_common_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServiceDetails) String() string { +func (x *IngressPath) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceDetails) ProtoMessage() {} +func (*IngressPath) ProtoMessage() {} -func (x *ServiceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[41] +func (x *IngressPath) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6931,71 +8326,63 @@ func (x *ServiceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServiceDetails.ProtoReflect.Descriptor instead. -func (*ServiceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{41} -} - -func (x *ServiceDetails) GetPorts() []*ServicePort { - if x != nil { - return x.Ports - } - return nil +// Deprecated: Use IngressPath.ProtoReflect.Descriptor instead. +func (*IngressPath) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{52} } -func (x *ServiceDetails) GetSelector() map[string]string { +func (x *IngressPath) GetPath() string { if x != nil { - return x.Selector + return x.Path } - return nil + return "" } -func (x *ServiceDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { +func (x *IngressPath) GetPathType() string { if x != nil { - return x.LoadBalancerIngress + return x.PathType } - return nil + return "" } -func (x *ServiceDetails) GetEndpointAddresses() []string { +func (x *IngressPath) GetBackend() *IngressBackend { if x != nil { - return x.EndpointAddresses + return x.Backend } return nil } -// ServicePort represents a port exposed by a service -type ServicePort struct { +// IngressBackend represents a backend referenced by an ingress +type IngressBackend struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Port name (optional) - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Service port number - TargetPort int32 `protobuf:"varint,3,opt,name=target_port,json=targetPort,proto3" json:"target_port,omitempty"` // Target port on pods (could be port number or name) - TargetPortName string `protobuf:"bytes,4,opt,name=target_port_name,json=targetPortName,proto3" json:"target_port_name,omitempty"` // Target port name if it's a named port - Protocol string `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"` // Protocol: "TCP", "UDP", "SCTP" - NodePort int32 `protobuf:"varint,6,opt,name=node_port,json=nodePort,proto3" json:"node_port,omitempty"` // NodePort (for NodePort and LoadBalancer services) - AppProtocol string `protobuf:"bytes,7,opt,name=app_protocol,json=appProtocol,proto3" json:"app_protocol,omitempty"` // Application protocol (optional, e.g., "HTTP", "HTTPS") + ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Service name + ServicePort int32 `protobuf:"varint,2,opt,name=service_port,json=servicePort,proto3" json:"service_port,omitempty"` // Service port number + ServicePortName string `protobuf:"bytes,3,opt,name=service_port_name,json=servicePortName,proto3" json:"service_port_name,omitempty"` // Service port name (alternative to number) + ResourceApiVersion string `protobuf:"bytes,4,opt,name=resource_api_version,json=resourceApiVersion,proto3" json:"resource_api_version,omitempty"` // Resource API version (for non-service backends) + ResourceKind string `protobuf:"bytes,5,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Resource kind (for non-service backends) + ResourceName string `protobuf:"bytes,6,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Resource name (for non-service backends) } -func (x *ServicePort) Reset() { - *x = ServicePort{} +func (x *IngressBackend) Reset() { + *x = IngressBackend{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[42] + mi := &file_api_v1_common_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServicePort) String() string { +func (x *IngressBackend) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServicePort) ProtoMessage() {} +func (*IngressBackend) ProtoMessage() {} -func (x *ServicePort) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[42] +func (x *IngressBackend) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7006,89 +8393,139 @@ func (x *ServicePort) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServicePort.ProtoReflect.Descriptor instead. -func (*ServicePort) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{42} +// Deprecated: Use IngressBackend.ProtoReflect.Descriptor instead. +func (*IngressBackend) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{53} } -func (x *ServicePort) GetName() string { +func (x *IngressBackend) GetServiceName() string { if x != nil { - return x.Name + return x.ServiceName } return "" } -func (x *ServicePort) GetPort() int32 { +func (x *IngressBackend) GetServicePort() int32 { if x != nil { - return x.Port + return x.ServicePort } return 0 } -func (x *ServicePort) GetTargetPort() int32 { +func (x *IngressBackend) GetServicePortName() string { if x != nil { - return x.TargetPort + return x.ServicePortName } - return 0 + return "" } -func (x *ServicePort) GetTargetPortName() string { +func (x *IngressBackend) GetResourceApiVersion() string { if x != nil { - return x.TargetPortName + return x.ResourceApiVersion } return "" } -func (x *ServicePort) GetProtocol() string { +func (x *IngressBackend) GetResourceKind() string { if x != nil { - return x.Protocol + return x.ResourceKind } return "" } -func (x *ServicePort) GetNodePort() int32 { +func (x *IngressBackend) GetResourceName() string { if x != nil { - return x.NodePort + return x.ResourceName } - return 0 + return "" } -func (x *ServicePort) GetAppProtocol() string { +// IngressTLS represents TLS configuration for an ingress +type IngressTLS struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` // Hosts covered by this TLS config + SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` // Secret containing the TLS certificate +} + +func (x *IngressTLS) Reset() { + *x = IngressTLS{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IngressTLS) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IngressTLS) ProtoMessage() {} + +func (x *IngressTLS) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[54] + 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 IngressTLS.ProtoReflect.Descriptor instead. +func (*IngressTLS) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{54} +} + +func (x *IngressTLS) GetHosts() []string { if x != nil { - return x.AppProtocol + return x.Hosts + } + return nil +} + +func (x *IngressTLS) GetSecretName() string { + if x != nil { + return x.SecretName } return "" } -// LoadBalancerIngress represents a load balancer ingress point -type LoadBalancerIngress struct { +// PersistentVolumeClaimDetails contains detailed PVC information for drill-down +type PersistentVolumeClaimDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` // IP address - Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` // Hostname (alternative to IP) - Ports []string `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"` // Ports information from ingress - IpMode string `protobuf:"bytes,4,opt,name=ip_mode,json=ipMode,proto3" json:"ip_mode,omitempty"` // IP mode: "VIP" or "Proxy" + ResourceRequirements *ResourceRequirements `protobuf:"bytes,1,opt,name=resource_requirements,json=resourceRequirements,proto3" json:"resource_requirements,omitempty"` // Storage resource requirements + Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Label selector for PV binding + VolumeNodeAffinity []*VolumeNodeAffinity `protobuf:"bytes,3,rep,name=volume_node_affinity,json=volumeNodeAffinity,proto3" json:"volume_node_affinity,omitempty"` // Node affinity constraints + Conditions []*PVCCondition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty"` // PVC conditions + MountedByPods []string `protobuf:"bytes,5,rep,name=mounted_by_pods,json=mountedByPods,proto3" json:"mounted_by_pods,omitempty"` // Pods currently using this PVC } -func (x *LoadBalancerIngress) Reset() { - *x = LoadBalancerIngress{} +func (x *PersistentVolumeClaimDetails) Reset() { + *x = PersistentVolumeClaimDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[43] + mi := &file_api_v1_common_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LoadBalancerIngress) String() string { +func (x *PersistentVolumeClaimDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LoadBalancerIngress) ProtoMessage() {} +func (*PersistentVolumeClaimDetails) ProtoMessage() {} -func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[43] +func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7099,68 +8536,73 @@ func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LoadBalancerIngress.ProtoReflect.Descriptor instead. -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{43} +// Deprecated: Use PersistentVolumeClaimDetails.ProtoReflect.Descriptor instead. +func (*PersistentVolumeClaimDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{55} } -func (x *LoadBalancerIngress) GetIp() string { +func (x *PersistentVolumeClaimDetails) GetResourceRequirements() *ResourceRequirements { if x != nil { - return x.Ip + return x.ResourceRequirements } - return "" + return nil } -func (x *LoadBalancerIngress) GetHostname() string { +func (x *PersistentVolumeClaimDetails) GetSelector() *LabelSelector { if x != nil { - return x.Hostname + return x.Selector } - return "" + return nil } -func (x *LoadBalancerIngress) GetPorts() []string { +func (x *PersistentVolumeClaimDetails) GetVolumeNodeAffinity() []*VolumeNodeAffinity { if x != nil { - return x.Ports + return x.VolumeNodeAffinity } return nil } -func (x *LoadBalancerIngress) GetIpMode() string { +func (x *PersistentVolumeClaimDetails) GetConditions() []*PVCCondition { if x != nil { - return x.IpMode + return x.Conditions } - return "" + return nil } -// IngressDetails contains detailed Ingress information for drill-down -type IngressDetails struct { +func (x *PersistentVolumeClaimDetails) GetMountedByPods() []string { + if x != nil { + return x.MountedByPods + } + return nil +} + +// ResourceRequirements represents storage resource requirements +type ResourceRequirements struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rules []*IngressRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Ingress rules - Tls []*IngressTLS `protobuf:"bytes,2,rep,name=tls,proto3" json:"tls,omitempty"` // TLS configurations - DefaultBackend *IngressBackend `protobuf:"bytes,3,opt,name=default_backend,json=defaultBackend,proto3" json:"default_backend,omitempty"` // Default backend (optional) - LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,4,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // Load balancer status + Requests map[string]string `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource requests (e.g., "storage": "50Gi") + Limits map[string]string `protobuf:"bytes,2,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (optional for PVCs) } -func (x *IngressDetails) Reset() { - *x = IngressDetails{} +func (x *ResourceRequirements) Reset() { + *x = ResourceRequirements{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[44] + mi := &file_api_v1_common_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressDetails) String() string { +func (x *ResourceRequirements) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressDetails) ProtoMessage() {} +func (*ResourceRequirements) ProtoMessage() {} -func (x *IngressDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[44] +func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7171,66 +8613,52 @@ func (x *IngressDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressDetails.ProtoReflect.Descriptor instead. -func (*IngressDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{44} -} - -func (x *IngressDetails) GetRules() []*IngressRule { - if x != nil { - return x.Rules - } - return nil -} - -func (x *IngressDetails) GetTls() []*IngressTLS { - if x != nil { - return x.Tls - } - return nil +// Deprecated: Use ResourceRequirements.ProtoReflect.Descriptor instead. +func (*ResourceRequirements) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{56} } -func (x *IngressDetails) GetDefaultBackend() *IngressBackend { +func (x *ResourceRequirements) GetRequests() map[string]string { if x != nil { - return x.DefaultBackend + return x.Requests } return nil } -func (x *IngressDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { +func (x *ResourceRequirements) GetLimits() map[string]string { if x != nil { - return x.LoadBalancerIngress + return x.Limits } return nil } -// IngressRule represents an ingress rule -type IngressRule struct { +// VolumeNodeAffinity represents node affinity constraints for volumes +type VolumeNodeAffinity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // Host name (optional, empty means all hosts) - Paths []*IngressPath `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` // HTTP paths + Required []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=required,proto3" json:"required,omitempty"` // Required node selector terms + Preferred []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=preferred,proto3" json:"preferred,omitempty"` // Preferred node selector terms } -func (x *IngressRule) Reset() { - *x = IngressRule{} +func (x *VolumeNodeAffinity) Reset() { + *x = VolumeNodeAffinity{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[45] + mi := &file_api_v1_common_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressRule) String() string { +func (x *VolumeNodeAffinity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressRule) ProtoMessage() {} +func (*VolumeNodeAffinity) ProtoMessage() {} -func (x *IngressRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[45] +func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7241,53 +8669,56 @@ func (x *IngressRule) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressRule.ProtoReflect.Descriptor instead. -func (*IngressRule) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{45} +// Deprecated: Use VolumeNodeAffinity.ProtoReflect.Descriptor instead. +func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{57} } -func (x *IngressRule) GetHost() string { +func (x *VolumeNodeAffinity) GetRequired() []*NodeSelectorRequirement { if x != nil { - return x.Host + return x.Required } - return "" + return nil } -func (x *IngressRule) GetPaths() []*IngressPath { +func (x *VolumeNodeAffinity) GetPreferred() []*NodeSelectorRequirement { if x != nil { - return x.Paths + return x.Preferred } return nil } -// IngressPath represents a path rule within an ingress -type IngressPath struct { +// PVCCondition represents a condition of a PVC +type PVCCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // URL path - PathType string `protobuf:"bytes,2,opt,name=path_type,json=pathType,proto3" json:"path_type,omitempty"` // Path type: "Exact", "Prefix", "ImplementationSpecific" - Backend *IngressBackend `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"` // Backend service + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Resizing") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *IngressPath) Reset() { - *x = IngressPath{} +func (x *PVCCondition) Reset() { + *x = PVCCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[46] + mi := &file_api_v1_common_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressPath) String() string { +func (x *PVCCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressPath) ProtoMessage() {} +func (*PVCCondition) ProtoMessage() {} -func (x *IngressPath) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[46] +func (x *PVCCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7298,63 +8729,83 @@ func (x *IngressPath) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressPath.ProtoReflect.Descriptor instead. -func (*IngressPath) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{46} +// Deprecated: Use PVCCondition.ProtoReflect.Descriptor instead. +func (*PVCCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{58} } -func (x *IngressPath) GetPath() string { +func (x *PVCCondition) GetType() string { if x != nil { - return x.Path + return x.Type } return "" } -func (x *IngressPath) GetPathType() string { +func (x *PVCCondition) GetStatus() string { if x != nil { - return x.PathType + return x.Status } return "" } -func (x *IngressPath) GetBackend() *IngressBackend { +func (x *PVCCondition) GetReason() string { if x != nil { - return x.Backend + return x.Reason } - return nil + return "" } -// IngressBackend represents a backend referenced by an ingress -type IngressBackend struct { +func (x *PVCCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *PVCCondition) GetLastProbeTime() int64 { + if x != nil { + return x.LastProbeTime + } + return 0 +} + +func (x *PVCCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime + } + return 0 +} + +// PersistentVolumeDetails contains detailed PV information for drill-down +type PersistentVolumeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Service name - ServicePort int32 `protobuf:"varint,2,opt,name=service_port,json=servicePort,proto3" json:"service_port,omitempty"` // Service port number - ServicePortName string `protobuf:"bytes,3,opt,name=service_port_name,json=servicePortName,proto3" json:"service_port_name,omitempty"` // Service port name (alternative to number) - ResourceApiVersion string `protobuf:"bytes,4,opt,name=resource_api_version,json=resourceApiVersion,proto3" json:"resource_api_version,omitempty"` // Resource API version (for non-service backends) - ResourceKind string `protobuf:"bytes,5,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Resource kind (for non-service backends) - ResourceName string `protobuf:"bytes,6,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Resource name (for non-service backends) + Capacity map[string]string `protobuf:"bytes,1,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage capacity resources + ClaimRef *PVClaimReference `protobuf:"bytes,2,opt,name=claim_ref,json=claimRef,proto3" json:"claim_ref,omitempty"` // Reference to bound PVC + VolumeSource *PVVolumeSource `protobuf:"bytes,3,opt,name=volume_source,json=volumeSource,proto3" json:"volume_source,omitempty"` // Volume source (CSI, HostPath, etc.) + NodeAffinity *NodeSelector `protobuf:"bytes,4,opt,name=node_affinity,json=nodeAffinity,proto3" json:"node_affinity,omitempty"` // Node affinity constraints + MountOptions []string `protobuf:"bytes,5,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Mount options for the volume } -func (x *IngressBackend) Reset() { - *x = IngressBackend{} +func (x *PersistentVolumeDetails) Reset() { + *x = PersistentVolumeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[47] + mi := &file_api_v1_common_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressBackend) String() string { +func (x *PersistentVolumeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressBackend) ProtoMessage() {} +func (*PersistentVolumeDetails) ProtoMessage() {} -func (x *IngressBackend) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[47] +func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7365,80 +8816,76 @@ func (x *IngressBackend) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressBackend.ProtoReflect.Descriptor instead. -func (*IngressBackend) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{47} -} - -func (x *IngressBackend) GetServiceName() string { - if x != nil { - return x.ServiceName - } - return "" +// Deprecated: Use PersistentVolumeDetails.ProtoReflect.Descriptor instead. +func (*PersistentVolumeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{59} } -func (x *IngressBackend) GetServicePort() int32 { +func (x *PersistentVolumeDetails) GetCapacity() map[string]string { if x != nil { - return x.ServicePort + return x.Capacity } - return 0 + return nil } -func (x *IngressBackend) GetServicePortName() string { +func (x *PersistentVolumeDetails) GetClaimRef() *PVClaimReference { if x != nil { - return x.ServicePortName + return x.ClaimRef } - return "" + return nil } -func (x *IngressBackend) GetResourceApiVersion() string { +func (x *PersistentVolumeDetails) GetVolumeSource() *PVVolumeSource { if x != nil { - return x.ResourceApiVersion + return x.VolumeSource } - return "" + return nil } -func (x *IngressBackend) GetResourceKind() string { +func (x *PersistentVolumeDetails) GetNodeAffinity() *NodeSelector { if x != nil { - return x.ResourceKind + return x.NodeAffinity } - return "" + return nil } -func (x *IngressBackend) GetResourceName() string { +func (x *PersistentVolumeDetails) GetMountOptions() []string { if x != nil { - return x.ResourceName + return x.MountOptions } - return "" + return nil } -// IngressTLS represents TLS configuration for an ingress -type IngressTLS struct { +// PVClaimReference represents a reference to a PVC +type PVClaimReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` // Hosts covered by this TLS config - SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` // Secret containing the TLS certificate + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC name + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` // PVC namespace + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // PVC UID + ApiVersion string `protobuf:"bytes,4,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + ResourceVersion string `protobuf:"bytes,5,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Resource version } -func (x *IngressTLS) Reset() { - *x = IngressTLS{} +func (x *PVClaimReference) Reset() { + *x = PVClaimReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[48] + mi := &file_api_v1_common_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressTLS) String() string { +func (x *PVClaimReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressTLS) ProtoMessage() {} +func (*PVClaimReference) ProtoMessage() {} -func (x *IngressTLS) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[48] +func (x *PVClaimReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7449,55 +8896,76 @@ func (x *IngressTLS) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressTLS.ProtoReflect.Descriptor instead. -func (*IngressTLS) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{48} +// Deprecated: Use PVClaimReference.ProtoReflect.Descriptor instead. +func (*PVClaimReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{60} } -func (x *IngressTLS) GetHosts() []string { +func (x *PVClaimReference) GetName() string { if x != nil { - return x.Hosts + return x.Name } - return nil + return "" } -func (x *IngressTLS) GetSecretName() string { +func (x *PVClaimReference) GetNamespace() string { if x != nil { - return x.SecretName + return x.Namespace } return "" } -// PersistentVolumeClaimDetails contains detailed PVC information for drill-down -type PersistentVolumeClaimDetails struct { +func (x *PVClaimReference) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *PVClaimReference) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +func (x *PVClaimReference) GetResourceVersion() string { + if x != nil { + return x.ResourceVersion + } + return "" +} + +// PVVolumeSource represents the source of a persistent volume +type PVVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourceRequirements *ResourceRequirements `protobuf:"bytes,1,opt,name=resource_requirements,json=resourceRequirements,proto3" json:"resource_requirements,omitempty"` // Storage resource requirements - Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Label selector for PV binding - VolumeNodeAffinity []*VolumeNodeAffinity `protobuf:"bytes,3,rep,name=volume_node_affinity,json=volumeNodeAffinity,proto3" json:"volume_node_affinity,omitempty"` // Node affinity constraints - Conditions []*PVCCondition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty"` // PVC conditions - MountedByPods []string `protobuf:"bytes,5,rep,name=mounted_by_pods,json=mountedByPods,proto3" json:"mounted_by_pods,omitempty"` // Pods currently using this PVC + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Volume source type + Csi *CSIVolumeSource `protobuf:"bytes,2,opt,name=csi,proto3" json:"csi,omitempty"` // CSI volume source (if applicable) + HostPath *HostPathVolumeSource `protobuf:"bytes,3,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` // HostPath volume source (if applicable) + Nfs *NFSVolumeSource `protobuf:"bytes,4,opt,name=nfs,proto3" json:"nfs,omitempty"` // NFS volume source (if applicable) + VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Additional volume attributes } -func (x *PersistentVolumeClaimDetails) Reset() { - *x = PersistentVolumeClaimDetails{} +func (x *PVVolumeSource) Reset() { + *x = PVVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[49] + mi := &file_api_v1_common_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PersistentVolumeClaimDetails) String() string { +func (x *PVVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PersistentVolumeClaimDetails) ProtoMessage() {} +func (*PVVolumeSource) ProtoMessage() {} -func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[49] +func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7508,73 +8976,76 @@ func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PersistentVolumeClaimDetails.ProtoReflect.Descriptor instead. -func (*PersistentVolumeClaimDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{49} +// Deprecated: Use PVVolumeSource.ProtoReflect.Descriptor instead. +func (*PVVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{61} } -func (x *PersistentVolumeClaimDetails) GetResourceRequirements() *ResourceRequirements { +func (x *PVVolumeSource) GetType() string { if x != nil { - return x.ResourceRequirements + return x.Type } - return nil + return "" } -func (x *PersistentVolumeClaimDetails) GetSelector() *LabelSelector { +func (x *PVVolumeSource) GetCsi() *CSIVolumeSource { if x != nil { - return x.Selector + return x.Csi } return nil } -func (x *PersistentVolumeClaimDetails) GetVolumeNodeAffinity() []*VolumeNodeAffinity { +func (x *PVVolumeSource) GetHostPath() *HostPathVolumeSource { if x != nil { - return x.VolumeNodeAffinity + return x.HostPath } return nil } -func (x *PersistentVolumeClaimDetails) GetConditions() []*PVCCondition { +func (x *PVVolumeSource) GetNfs() *NFSVolumeSource { if x != nil { - return x.Conditions + return x.Nfs } return nil } -func (x *PersistentVolumeClaimDetails) GetMountedByPods() []string { +func (x *PVVolumeSource) GetVolumeAttributes() map[string]string { if x != nil { - return x.MountedByPods + return x.VolumeAttributes } return nil } -// ResourceRequirements represents storage resource requirements -type ResourceRequirements struct { +// CSIVolumeSource represents a CSI volume source +type CSIVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Requests map[string]string `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource requests (e.g., "storage": "50Gi") - Limits map[string]string `protobuf:"bytes,2,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (optional for PVCs) + Driver string `protobuf:"bytes,1,opt,name=driver,proto3" json:"driver,omitempty"` // CSI driver name + VolumeHandle string `protobuf:"bytes,2,opt,name=volume_handle,json=volumeHandle,proto3" json:"volume_handle,omitempty"` // Volume handle/ID + FsType string `protobuf:"bytes,3,opt,name=fs_type,json=fsType,proto3" json:"fs_type,omitempty"` // Filesystem type + ReadOnly bool `protobuf:"varint,4,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether volume is read-only + VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // CSI volume attributes } -func (x *ResourceRequirements) Reset() { - *x = ResourceRequirements{} +func (x *CSIVolumeSource) Reset() { + *x = CSIVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[50] + mi := &file_api_v1_common_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceRequirements) String() string { +func (x *CSIVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceRequirements) ProtoMessage() {} +func (*CSIVolumeSource) ProtoMessage() {} -func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[50] +func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7585,52 +9056,73 @@ func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceRequirements.ProtoReflect.Descriptor instead. -func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{50} +// Deprecated: Use CSIVolumeSource.ProtoReflect.Descriptor instead. +func (*CSIVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{62} } -func (x *ResourceRequirements) GetRequests() map[string]string { +func (x *CSIVolumeSource) GetDriver() string { if x != nil { - return x.Requests + return x.Driver } - return nil + return "" } -func (x *ResourceRequirements) GetLimits() map[string]string { +func (x *CSIVolumeSource) GetVolumeHandle() string { if x != nil { - return x.Limits + return x.VolumeHandle + } + return "" +} + +func (x *CSIVolumeSource) GetFsType() string { + if x != nil { + return x.FsType + } + return "" +} + +func (x *CSIVolumeSource) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *CSIVolumeSource) GetVolumeAttributes() map[string]string { + if x != nil { + return x.VolumeAttributes } return nil } -// VolumeNodeAffinity represents node affinity constraints for volumes -type VolumeNodeAffinity struct { +// HostPathVolumeSource represents a host path volume source +type HostPathVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Required []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=required,proto3" json:"required,omitempty"` // Required node selector terms - Preferred []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=preferred,proto3" json:"preferred,omitempty"` // Preferred node selector terms + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Host path + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // Path type (e.g., "Directory", "File") } -func (x *VolumeNodeAffinity) Reset() { - *x = VolumeNodeAffinity{} +func (x *HostPathVolumeSource) Reset() { + *x = HostPathVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[51] + mi := &file_api_v1_common_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolumeNodeAffinity) String() string { +func (x *HostPathVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolumeNodeAffinity) ProtoMessage() {} +func (*HostPathVolumeSource) ProtoMessage() {} -func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[51] +func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7641,56 +9133,53 @@ func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolumeNodeAffinity.ProtoReflect.Descriptor instead. -func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{51} +// Deprecated: Use HostPathVolumeSource.ProtoReflect.Descriptor instead. +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{63} } -func (x *VolumeNodeAffinity) GetRequired() []*NodeSelectorRequirement { +func (x *HostPathVolumeSource) GetPath() string { if x != nil { - return x.Required + return x.Path } - return nil + return "" } -func (x *VolumeNodeAffinity) GetPreferred() []*NodeSelectorRequirement { +func (x *HostPathVolumeSource) GetType() string { if x != nil { - return x.Preferred + return x.Type } - return nil + return "" } -// PVCCondition represents a condition of a PVC -type PVCCondition struct { +// NFSVolumeSource represents an NFS volume source +type NFSVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Resizing") - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` // NFS server + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // NFS path + ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether NFS mount is read-only } -func (x *PVCCondition) Reset() { - *x = PVCCondition{} +func (x *NFSVolumeSource) Reset() { + *x = NFSVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[52] + mi := &file_api_v1_common_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVCCondition) String() string { +func (x *NFSVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVCCondition) ProtoMessage() {} +func (*NFSVolumeSource) ProtoMessage() {} -func (x *PVCCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[52] +func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7701,83 +9190,64 @@ func (x *PVCCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVCCondition.ProtoReflect.Descriptor instead. -func (*PVCCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{52} -} - -func (x *PVCCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *PVCCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use NFSVolumeSource.ProtoReflect.Descriptor instead. +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{64} } -func (x *PVCCondition) GetReason() string { +func (x *NFSVolumeSource) GetServer() string { if x != nil { - return x.Reason + return x.Server } return "" } -func (x *PVCCondition) GetMessage() string { +func (x *NFSVolumeSource) GetPath() string { if x != nil { - return x.Message + return x.Path } return "" } -func (x *PVCCondition) GetLastProbeTime() int64 { - if x != nil { - return x.LastProbeTime - } - return 0 -} - -func (x *PVCCondition) GetLastTransitionTime() int64 { +func (x *NFSVolumeSource) GetReadOnly() bool { if x != nil { - return x.LastTransitionTime + return x.ReadOnly } - return 0 + return false } -// PersistentVolumeDetails contains detailed PV information for drill-down -type PersistentVolumeDetails struct { +// StorageClassDetails contains detailed StorageClass information for drill-down +type StorageClassDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Capacity map[string]string `protobuf:"bytes,1,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage capacity resources - ClaimRef *PVClaimReference `protobuf:"bytes,2,opt,name=claim_ref,json=claimRef,proto3" json:"claim_ref,omitempty"` // Reference to bound PVC - VolumeSource *PVVolumeSource `protobuf:"bytes,3,opt,name=volume_source,json=volumeSource,proto3" json:"volume_source,omitempty"` // Volume source (CSI, HostPath, etc.) - NodeAffinity *NodeSelector `protobuf:"bytes,4,opt,name=node_affinity,json=nodeAffinity,proto3" json:"node_affinity,omitempty"` // Node affinity constraints - MountOptions []string `protobuf:"bytes,5,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Mount options for the volume + Provisioner string `protobuf:"bytes,1,opt,name=provisioner,proto3" json:"provisioner,omitempty"` // Storage provisioner + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters + AllowedTopologies []*TopologySelector `protobuf:"bytes,3,rep,name=allowed_topologies,json=allowedTopologies,proto3" json:"allowed_topologies,omitempty"` // Allowed topologies + MountOptions []string `protobuf:"bytes,4,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Default mount options + VolumeBindingMode string `protobuf:"bytes,5,opt,name=volume_binding_mode,json=volumeBindingMode,proto3" json:"volume_binding_mode,omitempty"` // Volume binding mode + ReclaimPolicy string `protobuf:"bytes,6,opt,name=reclaim_policy,json=reclaimPolicy,proto3" json:"reclaim_policy,omitempty"` // Default reclaim policy + AllowVolumeExpansion bool `protobuf:"varint,7,opt,name=allow_volume_expansion,json=allowVolumeExpansion,proto3" json:"allow_volume_expansion,omitempty"` // Whether volume expansion is allowed } -func (x *PersistentVolumeDetails) Reset() { - *x = PersistentVolumeDetails{} +func (x *StorageClassDetails) Reset() { + *x = StorageClassDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[53] + mi := &file_api_v1_common_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PersistentVolumeDetails) String() string { +func (x *StorageClassDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PersistentVolumeDetails) ProtoMessage() {} +func (*StorageClassDetails) ProtoMessage() {} -func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[53] +func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7788,76 +9258,88 @@ func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PersistentVolumeDetails.ProtoReflect.Descriptor instead. -func (*PersistentVolumeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{53} +// Deprecated: Use StorageClassDetails.ProtoReflect.Descriptor instead. +func (*StorageClassDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{65} } -func (x *PersistentVolumeDetails) GetCapacity() map[string]string { +func (x *StorageClassDetails) GetProvisioner() string { if x != nil { - return x.Capacity + return x.Provisioner } - return nil + return "" } -func (x *PersistentVolumeDetails) GetClaimRef() *PVClaimReference { +func (x *StorageClassDetails) GetParameters() map[string]string { if x != nil { - return x.ClaimRef + return x.Parameters } return nil } -func (x *PersistentVolumeDetails) GetVolumeSource() *PVVolumeSource { +func (x *StorageClassDetails) GetAllowedTopologies() []*TopologySelector { if x != nil { - return x.VolumeSource + return x.AllowedTopologies } return nil } -func (x *PersistentVolumeDetails) GetNodeAffinity() *NodeSelector { +func (x *StorageClassDetails) GetMountOptions() []string { if x != nil { - return x.NodeAffinity + return x.MountOptions } return nil } -func (x *PersistentVolumeDetails) GetMountOptions() []string { +func (x *StorageClassDetails) GetVolumeBindingMode() string { if x != nil { - return x.MountOptions + return x.VolumeBindingMode } - return nil + return "" } -// PVClaimReference represents a reference to a PVC -type PVClaimReference struct { +func (x *StorageClassDetails) GetReclaimPolicy() string { + if x != nil { + return x.ReclaimPolicy + } + return "" +} + +func (x *StorageClassDetails) GetAllowVolumeExpansion() bool { + if x != nil { + return x.AllowVolumeExpansion + } + return false +} + +// NamespaceDetails contains detailed Namespace information for drill-down +type NamespaceDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC name - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` // PVC namespace - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // PVC UID - ApiVersion string `protobuf:"bytes,4,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version - ResourceVersion string `protobuf:"bytes,5,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Resource version + Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"` // Namespace phase: "Active", "Terminating" + Finalizers []string `protobuf:"bytes,2,rep,name=finalizers,proto3" json:"finalizers,omitempty"` // Finalizers preventing deletion + Conditions map[string]string `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Namespace conditions if any } -func (x *PVClaimReference) Reset() { - *x = PVClaimReference{} +func (x *NamespaceDetails) Reset() { + *x = NamespaceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[54] + mi := &file_api_v1_common_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVClaimReference) String() string { +func (x *NamespaceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVClaimReference) ProtoMessage() {} +func (*NamespaceDetails) ProtoMessage() {} -func (x *PVClaimReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[54] +func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7868,76 +9350,69 @@ func (x *PVClaimReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVClaimReference.ProtoReflect.Descriptor instead. -func (*PVClaimReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{54} -} - -func (x *PVClaimReference) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *PVClaimReference) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" +// Deprecated: Use NamespaceDetails.ProtoReflect.Descriptor instead. +func (*NamespaceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{66} } -func (x *PVClaimReference) GetUid() string { +func (x *NamespaceDetails) GetPhase() string { if x != nil { - return x.Uid + return x.Phase } return "" } -func (x *PVClaimReference) GetApiVersion() string { +func (x *NamespaceDetails) GetFinalizers() []string { if x != nil { - return x.ApiVersion + return x.Finalizers } - return "" + return nil } -func (x *PVClaimReference) GetResourceVersion() string { +func (x *NamespaceDetails) GetConditions() map[string]string { if x != nil { - return x.ResourceVersion + return x.Conditions } - return "" + return nil } -// PVVolumeSource represents the source of a persistent volume -type PVVolumeSource struct { +// NodeDetails contains detailed Node information for drill-down +type NodeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Volume source type - Csi *CSIVolumeSource `protobuf:"bytes,2,opt,name=csi,proto3" json:"csi,omitempty"` // CSI volume source (if applicable) - HostPath *HostPathVolumeSource `protobuf:"bytes,3,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` // HostPath volume source (if applicable) - Nfs *NFSVolumeSource `protobuf:"bytes,4,opt,name=nfs,proto3" json:"nfs,omitempty"` // NFS volume source (if applicable) - VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Additional volume attributes + Addresses []*NodeAddress `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` // Node addresses (Internal/External IP, DNS, etc.) + Conditions []*NodeCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Node conditions (Ready, MemoryPressure, etc.) + SystemInfo *NodeSystemInfo `protobuf:"bytes,3,opt,name=system_info,json=systemInfo,proto3" json:"system_info,omitempty"` // System information (OS, kernel, etc.) + Capacity map[string]string `protobuf:"bytes,4,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource capacity (cpu, memory, etc.) + Allocatable map[string]string `protobuf:"bytes,5,rep,name=allocatable,proto3" json:"allocatable,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Allocatable resources + Images []*NodeImage `protobuf:"bytes,6,rep,name=images,proto3" json:"images,omitempty"` // Container images on the node + // Desired MIG partitioning profile from the nvidia.com/mig.config node + // label; empty on nodes without MIG management. + MigConfigDesired string `protobuf:"bytes,7,opt,name=mig_config_desired,json=migConfigDesired,proto3" json:"mig_config_desired,omitempty"` + // Applied MIG state from the nvidia.com/mig.config.state node label + // (e.g. success, pending, failed); empty on nodes without MIG management. + MigConfigState string `protobuf:"bytes,8,opt,name=mig_config_state,json=migConfigState,proto3" json:"mig_config_state,omitempty"` } -func (x *PVVolumeSource) Reset() { - *x = PVVolumeSource{} +func (x *NodeDetails) Reset() { + *x = NodeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[55] + mi := &file_api_v1_common_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVVolumeSource) String() string { +func (x *NodeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVVolumeSource) ProtoMessage() {} +func (*NodeDetails) ProtoMessage() {} -func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[55] +func (x *NodeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7948,76 +9423,96 @@ func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVVolumeSource.ProtoReflect.Descriptor instead. -func (*PVVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{55} +// Deprecated: Use NodeDetails.ProtoReflect.Descriptor instead. +func (*NodeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{67} } -func (x *PVVolumeSource) GetType() string { +func (x *NodeDetails) GetAddresses() []*NodeAddress { if x != nil { - return x.Type + return x.Addresses } - return "" + return nil } -func (x *PVVolumeSource) GetCsi() *CSIVolumeSource { +func (x *NodeDetails) GetConditions() []*NodeCondition { if x != nil { - return x.Csi + return x.Conditions } return nil } -func (x *PVVolumeSource) GetHostPath() *HostPathVolumeSource { +func (x *NodeDetails) GetSystemInfo() *NodeSystemInfo { if x != nil { - return x.HostPath + return x.SystemInfo } return nil } -func (x *PVVolumeSource) GetNfs() *NFSVolumeSource { +func (x *NodeDetails) GetCapacity() map[string]string { if x != nil { - return x.Nfs + return x.Capacity } return nil } -func (x *PVVolumeSource) GetVolumeAttributes() map[string]string { +func (x *NodeDetails) GetAllocatable() map[string]string { if x != nil { - return x.VolumeAttributes + return x.Allocatable } return nil } -// CSIVolumeSource represents a CSI volume source -type CSIVolumeSource struct { +func (x *NodeDetails) GetImages() []*NodeImage { + if x != nil { + return x.Images + } + return nil +} + +func (x *NodeDetails) GetMigConfigDesired() string { + if x != nil { + return x.MigConfigDesired + } + return "" +} + +func (x *NodeDetails) GetMigConfigState() string { + if x != nil { + return x.MigConfigState + } + return "" +} + +// NodeTaint represents a node taint that affects pod scheduling +type NodeTaint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Driver string `protobuf:"bytes,1,opt,name=driver,proto3" json:"driver,omitempty"` // CSI driver name - VolumeHandle string `protobuf:"bytes,2,opt,name=volume_handle,json=volumeHandle,proto3" json:"volume_handle,omitempty"` // Volume handle/ID - FsType string `protobuf:"bytes,3,opt,name=fs_type,json=fsType,proto3" json:"fs_type,omitempty"` // Filesystem type - ReadOnly bool `protobuf:"varint,4,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether volume is read-only - VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // CSI volume attributes + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Taint key + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Taint value (optional) + Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // Taint effect: "NoSchedule", "PreferNoSchedule", "NoExecute" + TimeAdded int64 `protobuf:"varint,4,opt,name=time_added,json=timeAdded,proto3" json:"time_added,omitempty"` // When the taint was added (optional) } -func (x *CSIVolumeSource) Reset() { - *x = CSIVolumeSource{} +func (x *NodeTaint) Reset() { + *x = NodeTaint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[56] + mi := &file_api_v1_common_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CSIVolumeSource) String() string { +func (x *NodeTaint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CSIVolumeSource) ProtoMessage() {} +func (*NodeTaint) ProtoMessage() {} -func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[56] +func (x *NodeTaint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8028,73 +9523,66 @@ func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CSIVolumeSource.ProtoReflect.Descriptor instead. -func (*CSIVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{56} +// Deprecated: Use NodeTaint.ProtoReflect.Descriptor instead. +func (*NodeTaint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{68} } -func (x *CSIVolumeSource) GetDriver() string { +func (x *NodeTaint) GetKey() string { if x != nil { - return x.Driver + return x.Key } return "" } -func (x *CSIVolumeSource) GetVolumeHandle() string { +func (x *NodeTaint) GetValue() string { if x != nil { - return x.VolumeHandle + return x.Value } return "" } -func (x *CSIVolumeSource) GetFsType() string { +func (x *NodeTaint) GetEffect() string { if x != nil { - return x.FsType + return x.Effect } return "" } -func (x *CSIVolumeSource) GetReadOnly() bool { - if x != nil { - return x.ReadOnly - } - return false -} - -func (x *CSIVolumeSource) GetVolumeAttributes() map[string]string { +func (x *NodeTaint) GetTimeAdded() int64 { if x != nil { - return x.VolumeAttributes + return x.TimeAdded } - return nil + return 0 } -// HostPathVolumeSource represents a host path volume source -type HostPathVolumeSource struct { +// NodeAddress represents a node address +type NodeAddress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Host path - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // Path type (e.g., "Directory", "File") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Address type: "InternalIP", "ExternalIP", "InternalDNS", "ExternalDNS", "Hostname" + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // The address value } -func (x *HostPathVolumeSource) Reset() { - *x = HostPathVolumeSource{} +func (x *NodeAddress) Reset() { + *x = NodeAddress{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[57] + mi := &file_api_v1_common_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HostPathVolumeSource) String() string { +func (x *NodeAddress) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HostPathVolumeSource) ProtoMessage() {} +func (*NodeAddress) ProtoMessage() {} -func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[57] +func (x *NodeAddress) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8105,53 +9593,56 @@ func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HostPathVolumeSource.ProtoReflect.Descriptor instead. -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{57} +// Deprecated: Use NodeAddress.ProtoReflect.Descriptor instead. +func (*NodeAddress) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{69} } -func (x *HostPathVolumeSource) GetPath() string { +func (x *NodeAddress) GetType() string { if x != nil { - return x.Path + return x.Type } return "" } -func (x *HostPathVolumeSource) GetType() string { +func (x *NodeAddress) GetAddress() string { if x != nil { - return x.Type + return x.Address } return "" } -// NFSVolumeSource represents an NFS volume source -type NFSVolumeSource struct { +// NodeCondition represents a node condition +type NodeCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` // NFS server - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // NFS path - ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether NFS mount is read-only + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "Ready", "MemoryPressure", "DiskPressure", "PIDPressure", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastHeartbeatTime int64 `protobuf:"varint,5,opt,name=last_heartbeat_time,json=lastHeartbeatTime,proto3" json:"last_heartbeat_time,omitempty"` // Last heartbeat time + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *NFSVolumeSource) Reset() { - *x = NFSVolumeSource{} +func (x *NodeCondition) Reset() { + *x = NodeCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[58] + mi := &file_api_v1_common_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NFSVolumeSource) String() string { +func (x *NodeCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NFSVolumeSource) ProtoMessage() {} +func (*NodeCondition) ProtoMessage() {} -func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[58] +func (x *NodeCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8159,67 +9650,91 @@ func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { } return ms } - return mi.MessageOf(x) + return mi.MessageOf(x) +} + +// Deprecated: Use NodeCondition.ProtoReflect.Descriptor instead. +func (*NodeCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{70} +} + +func (x *NodeCondition) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *NodeCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" } -// Deprecated: Use NFSVolumeSource.ProtoReflect.Descriptor instead. -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{58} +func (x *NodeCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" } -func (x *NFSVolumeSource) GetServer() string { +func (x *NodeCondition) GetMessage() string { if x != nil { - return x.Server + return x.Message } return "" } -func (x *NFSVolumeSource) GetPath() string { +func (x *NodeCondition) GetLastHeartbeatTime() int64 { if x != nil { - return x.Path + return x.LastHeartbeatTime } - return "" + return 0 } -func (x *NFSVolumeSource) GetReadOnly() bool { +func (x *NodeCondition) GetLastTransitionTime() int64 { if x != nil { - return x.ReadOnly + return x.LastTransitionTime } - return false + return 0 } -// StorageClassDetails contains detailed StorageClass information for drill-down -type StorageClassDetails struct { +// NodeSystemInfo represents node system information +type NodeSystemInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Provisioner string `protobuf:"bytes,1,opt,name=provisioner,proto3" json:"provisioner,omitempty"` // Storage provisioner - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters - AllowedTopologies []*TopologySelector `protobuf:"bytes,3,rep,name=allowed_topologies,json=allowedTopologies,proto3" json:"allowed_topologies,omitempty"` // Allowed topologies - MountOptions []string `protobuf:"bytes,4,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Default mount options - VolumeBindingMode string `protobuf:"bytes,5,opt,name=volume_binding_mode,json=volumeBindingMode,proto3" json:"volume_binding_mode,omitempty"` // Volume binding mode - ReclaimPolicy string `protobuf:"bytes,6,opt,name=reclaim_policy,json=reclaimPolicy,proto3" json:"reclaim_policy,omitempty"` // Default reclaim policy - AllowVolumeExpansion bool `protobuf:"varint,7,opt,name=allow_volume_expansion,json=allowVolumeExpansion,proto3" json:"allow_volume_expansion,omitempty"` // Whether volume expansion is allowed + MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` // Machine ID + SystemUuid string `protobuf:"bytes,2,opt,name=system_uuid,json=systemUuid,proto3" json:"system_uuid,omitempty"` // System UUID + BootId string `protobuf:"bytes,3,opt,name=boot_id,json=bootId,proto3" json:"boot_id,omitempty"` // Boot ID + KernelVersion string `protobuf:"bytes,4,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"` // Kernel version + OsImage string `protobuf:"bytes,5,opt,name=os_image,json=osImage,proto3" json:"os_image,omitempty"` // OS image + ContainerRuntimeVersion string `protobuf:"bytes,6,opt,name=container_runtime_version,json=containerRuntimeVersion,proto3" json:"container_runtime_version,omitempty"` // Container runtime version + KubeletVersion string `protobuf:"bytes,7,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // Kubelet version + KubeProxyVersion string `protobuf:"bytes,8,opt,name=kube_proxy_version,json=kubeProxyVersion,proto3" json:"kube_proxy_version,omitempty"` // Kube-proxy version + OperatingSystem string `protobuf:"bytes,9,opt,name=operating_system,json=operatingSystem,proto3" json:"operating_system,omitempty"` // Operating system + Architecture string `protobuf:"bytes,10,opt,name=architecture,proto3" json:"architecture,omitempty"` // Architecture } -func (x *StorageClassDetails) Reset() { - *x = StorageClassDetails{} +func (x *NodeSystemInfo) Reset() { + *x = NodeSystemInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[59] + mi := &file_api_v1_common_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StorageClassDetails) String() string { +func (x *NodeSystemInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StorageClassDetails) ProtoMessage() {} +func (*NodeSystemInfo) ProtoMessage() {} -func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[59] +func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8230,88 +9745,108 @@ func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StorageClassDetails.ProtoReflect.Descriptor instead. -func (*StorageClassDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{59} +// Deprecated: Use NodeSystemInfo.ProtoReflect.Descriptor instead. +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{71} } -func (x *StorageClassDetails) GetProvisioner() string { +func (x *NodeSystemInfo) GetMachineId() string { if x != nil { - return x.Provisioner + return x.MachineId } return "" } -func (x *StorageClassDetails) GetParameters() map[string]string { +func (x *NodeSystemInfo) GetSystemUuid() string { if x != nil { - return x.Parameters + return x.SystemUuid } - return nil + return "" } -func (x *StorageClassDetails) GetAllowedTopologies() []*TopologySelector { +func (x *NodeSystemInfo) GetBootId() string { if x != nil { - return x.AllowedTopologies + return x.BootId } - return nil + return "" } -func (x *StorageClassDetails) GetMountOptions() []string { +func (x *NodeSystemInfo) GetKernelVersion() string { if x != nil { - return x.MountOptions + return x.KernelVersion } - return nil + return "" } -func (x *StorageClassDetails) GetVolumeBindingMode() string { +func (x *NodeSystemInfo) GetOsImage() string { if x != nil { - return x.VolumeBindingMode + return x.OsImage } return "" } -func (x *StorageClassDetails) GetReclaimPolicy() string { +func (x *NodeSystemInfo) GetContainerRuntimeVersion() string { if x != nil { - return x.ReclaimPolicy + return x.ContainerRuntimeVersion } return "" } -func (x *StorageClassDetails) GetAllowVolumeExpansion() bool { +func (x *NodeSystemInfo) GetKubeletVersion() string { if x != nil { - return x.AllowVolumeExpansion + return x.KubeletVersion } - return false + return "" } -// NamespaceDetails contains detailed Namespace information for drill-down -type NamespaceDetails struct { +func (x *NodeSystemInfo) GetKubeProxyVersion() string { + if x != nil { + return x.KubeProxyVersion + } + return "" +} + +func (x *NodeSystemInfo) GetOperatingSystem() string { + if x != nil { + return x.OperatingSystem + } + return "" +} + +func (x *NodeSystemInfo) GetArchitecture() string { + if x != nil { + return x.Architecture + } + return "" +} + +// NodeImage represents a container image on the node +type NodeImage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"` // Namespace phase: "Active", "Terminating" - Finalizers []string `protobuf:"bytes,2,rep,name=finalizers,proto3" json:"finalizers,omitempty"` // Finalizers preventing deletion - Conditions map[string]string `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Namespace conditions if any + Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"` // Image names/tags + SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` // Image size in bytes } -func (x *NamespaceDetails) Reset() { - *x = NamespaceDetails{} +func (x *NodeImage) Reset() { + *x = NodeImage{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[60] + mi := &file_api_v1_common_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NamespaceDetails) String() string { +func (x *NodeImage) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NamespaceDetails) ProtoMessage() {} +func (*NodeImage) ProtoMessage() {} -func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[60] +func (x *NodeImage) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8322,63 +9857,51 @@ func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NamespaceDetails.ProtoReflect.Descriptor instead. -func (*NamespaceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{60} -} - -func (x *NamespaceDetails) GetPhase() string { - if x != nil { - return x.Phase - } - return "" +// Deprecated: Use NodeImage.ProtoReflect.Descriptor instead. +func (*NodeImage) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{72} } -func (x *NamespaceDetails) GetFinalizers() []string { +func (x *NodeImage) GetNames() []string { if x != nil { - return x.Finalizers + return x.Names } return nil } -func (x *NamespaceDetails) GetConditions() map[string]string { +func (x *NodeImage) GetSizeBytes() int64 { if x != nil { - return x.Conditions + return x.SizeBytes } - return nil + return 0 } -// NodeDetails contains detailed Node information for drill-down -type NodeDetails struct { +// TopologySelector represents topology requirements for storage +type TopologySelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Addresses []*NodeAddress `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` // Node addresses (Internal/External IP, DNS, etc.) - Conditions []*NodeCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Node conditions (Ready, MemoryPressure, etc.) - SystemInfo *NodeSystemInfo `protobuf:"bytes,3,opt,name=system_info,json=systemInfo,proto3" json:"system_info,omitempty"` // System information (OS, kernel, etc.) - Capacity map[string]string `protobuf:"bytes,4,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource capacity (cpu, memory, etc.) - Allocatable map[string]string `protobuf:"bytes,5,rep,name=allocatable,proto3" json:"allocatable,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Allocatable resources - Images []*NodeImage `protobuf:"bytes,6,rep,name=images,proto3" json:"images,omitempty"` // Container images on the node + MatchLabelExpressions []*TopologySelectorTerm `protobuf:"bytes,1,rep,name=match_label_expressions,json=matchLabelExpressions,proto3" json:"match_label_expressions,omitempty"` // Topology selector terms } -func (x *NodeDetails) Reset() { - *x = NodeDetails{} +func (x *TopologySelector) Reset() { + *x = TopologySelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[61] + mi := &file_api_v1_common_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeDetails) String() string { +func (x *TopologySelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeDetails) ProtoMessage() {} +func (*TopologySelector) ProtoMessage() {} -func (x *NodeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[61] +func (x *TopologySelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8389,82 +9912,96 @@ func (x *NodeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeDetails.ProtoReflect.Descriptor instead. -func (*NodeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{61} +// Deprecated: Use TopologySelector.ProtoReflect.Descriptor instead. +func (*TopologySelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{73} } -func (x *NodeDetails) GetAddresses() []*NodeAddress { +func (x *TopologySelector) GetMatchLabelExpressions() []*TopologySelectorTerm { if x != nil { - return x.Addresses + return x.MatchLabelExpressions } return nil } -func (x *NodeDetails) GetConditions() []*NodeCondition { - if x != nil { - return x.Conditions - } - return nil +// TopologySelectorTerm represents a topology selector term +type TopologySelectorTerm struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MatchLabels map[string]string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Labels that must match } -func (x *NodeDetails) GetSystemInfo() *NodeSystemInfo { - if x != nil { - return x.SystemInfo +func (x *TopologySelectorTerm) Reset() { + *x = TopologySelectorTerm{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodeDetails) GetCapacity() map[string]string { - if x != nil { - return x.Capacity - } - return nil +func (x *TopologySelectorTerm) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeDetails) GetAllocatable() map[string]string { - if x != nil { - return x.Allocatable +func (*TopologySelectorTerm) ProtoMessage() {} + +func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) +} + +// Deprecated: Use TopologySelectorTerm.ProtoReflect.Descriptor instead. +func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{74} } -func (x *NodeDetails) GetImages() []*NodeImage { +func (x *TopologySelectorTerm) GetMatchLabels() map[string]string { if x != nil { - return x.Images + return x.MatchLabels } return nil } -// NodeTaint represents a node taint that affects pod scheduling -type NodeTaint struct { +// TolerationInfo represents a simplified pod toleration for DaemonSets +type TolerationInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Taint key - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Taint value (optional) - Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // Taint effect: "NoSchedule", "PreferNoSchedule", "NoExecute" - TimeAdded int64 `protobuf:"varint,4,opt,name=time_added,json=timeAdded,proto3" json:"time_added,omitempty"` // When the taint was added (optional) + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Toleration key (optional for exists/all) + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "Equal", "Exists" + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Value to match (for Equal operator) + Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` // "NoSchedule", "PreferNoSchedule", "NoExecute", or "" + TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` // Toleration period for NoExecute (optional) } -func (x *NodeTaint) Reset() { - *x = NodeTaint{} +func (x *TolerationInfo) Reset() { + *x = TolerationInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[62] + mi := &file_api_v1_common_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeTaint) String() string { +func (x *TolerationInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeTaint) ProtoMessage() {} +func (*TolerationInfo) ProtoMessage() {} -func (x *NodeTaint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[62] +func (x *TolerationInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8475,66 +10012,72 @@ func (x *NodeTaint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeTaint.ProtoReflect.Descriptor instead. -func (*NodeTaint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{62} +// Deprecated: Use TolerationInfo.ProtoReflect.Descriptor instead. +func (*TolerationInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{75} } -func (x *NodeTaint) GetKey() string { +func (x *TolerationInfo) GetKey() string { if x != nil { return x.Key } return "" } -func (x *NodeTaint) GetValue() string { +func (x *TolerationInfo) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *TolerationInfo) GetValue() string { if x != nil { return x.Value } return "" } -func (x *NodeTaint) GetEffect() string { +func (x *TolerationInfo) GetEffect() string { if x != nil { return x.Effect } return "" } -func (x *NodeTaint) GetTimeAdded() int64 { +func (x *TolerationInfo) GetTolerationSeconds() int64 { if x != nil { - return x.TimeAdded + return x.TolerationSeconds } return 0 } -// NodeAddress represents a node address -type NodeAddress struct { +// NodeSelector represents node selector requirements +type NodeSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Address type: "InternalIP", "ExternalIP", "InternalDNS", "ExternalDNS", "Hostname" - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // The address value + Terms []*NodeSelectorTerm `protobuf:"bytes,1,rep,name=terms,proto3" json:"terms,omitempty"` // Node selector terms } -func (x *NodeAddress) Reset() { - *x = NodeAddress{} +func (x *NodeSelector) Reset() { + *x = NodeSelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[63] + mi := &file_api_v1_common_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeAddress) String() string { +func (x *NodeSelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeAddress) ProtoMessage() {} +func (*NodeSelector) ProtoMessage() {} -func (x *NodeAddress) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[63] +func (x *NodeSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8545,56 +10088,45 @@ func (x *NodeAddress) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeAddress.ProtoReflect.Descriptor instead. -func (*NodeAddress) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{63} -} - -func (x *NodeAddress) GetType() string { - if x != nil { - return x.Type - } - return "" +// Deprecated: Use NodeSelector.ProtoReflect.Descriptor instead. +func (*NodeSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{76} } -func (x *NodeAddress) GetAddress() string { +func (x *NodeSelector) GetTerms() []*NodeSelectorTerm { if x != nil { - return x.Address + return x.Terms } - return "" + return nil } -// NodeCondition represents a node condition -type NodeCondition struct { +// NodeSelectorTerm represents a node selector term +type NodeSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "Ready", "MemoryPressure", "DiskPressure", "PIDPressure", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastHeartbeatTime int64 `protobuf:"varint,5,opt,name=last_heartbeat_time,json=lastHeartbeatTime,proto3" json:"last_heartbeat_time,omitempty"` // Last heartbeat time - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + MatchExpressions []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` // Match expressions + MatchFields []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=match_fields,json=matchFields,proto3" json:"match_fields,omitempty"` // Match fields } -func (x *NodeCondition) Reset() { - *x = NodeCondition{} +func (x *NodeSelectorTerm) Reset() { + *x = NodeSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[64] + mi := &file_api_v1_common_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeCondition) String() string { +func (x *NodeSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeCondition) ProtoMessage() {} +func (*NodeSelectorTerm) ProtoMessage() {} -func (x *NodeCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[64] +func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8605,88 +10137,53 @@ func (x *NodeCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeCondition.ProtoReflect.Descriptor instead. -func (*NodeCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{64} -} - -func (x *NodeCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *NodeCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *NodeCondition) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *NodeCondition) GetMessage() string { - if x != nil { - return x.Message - } - return "" +// Deprecated: Use NodeSelectorTerm.ProtoReflect.Descriptor instead. +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{77} } -func (x *NodeCondition) GetLastHeartbeatTime() int64 { +func (x *NodeSelectorTerm) GetMatchExpressions() []*NodeSelectorRequirement { if x != nil { - return x.LastHeartbeatTime + return x.MatchExpressions } - return 0 + return nil } -func (x *NodeCondition) GetLastTransitionTime() int64 { +func (x *NodeSelectorTerm) GetMatchFields() []*NodeSelectorRequirement { if x != nil { - return x.LastTransitionTime + return x.MatchFields } - return 0 + return nil } -// NodeSystemInfo represents node system information -type NodeSystemInfo struct { +// NodeSelectorRequirement represents a node selector requirement +type NodeSelectorRequirement struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` // Machine ID - SystemUuid string `protobuf:"bytes,2,opt,name=system_uuid,json=systemUuid,proto3" json:"system_uuid,omitempty"` // System UUID - BootId string `protobuf:"bytes,3,opt,name=boot_id,json=bootId,proto3" json:"boot_id,omitempty"` // Boot ID - KernelVersion string `protobuf:"bytes,4,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"` // Kernel version - OsImage string `protobuf:"bytes,5,opt,name=os_image,json=osImage,proto3" json:"os_image,omitempty"` // OS image - ContainerRuntimeVersion string `protobuf:"bytes,6,opt,name=container_runtime_version,json=containerRuntimeVersion,proto3" json:"container_runtime_version,omitempty"` // Container runtime version - KubeletVersion string `protobuf:"bytes,7,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // Kubelet version - KubeProxyVersion string `protobuf:"bytes,8,opt,name=kube_proxy_version,json=kubeProxyVersion,proto3" json:"kube_proxy_version,omitempty"` // Kube-proxy version - OperatingSystem string `protobuf:"bytes,9,opt,name=operating_system,json=operatingSystem,proto3" json:"operating_system,omitempty"` // Operating system - Architecture string `protobuf:"bytes,10,opt,name=architecture,proto3" json:"architecture,omitempty"` // Architecture + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Selector key + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "In", "NotIn", "Exists", "DoesNotExist", "Gt", "Lt" + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Values to match } -func (x *NodeSystemInfo) Reset() { - *x = NodeSystemInfo{} +func (x *NodeSelectorRequirement) Reset() { + *x = NodeSelectorRequirement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[65] + mi := &file_api_v1_common_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSystemInfo) String() string { +func (x *NodeSelectorRequirement) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSystemInfo) ProtoMessage() {} +func (*NodeSelectorRequirement) ProtoMessage() {} -func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[65] +func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8697,108 +10194,62 @@ func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSystemInfo.ProtoReflect.Descriptor instead. -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{65} -} - -func (x *NodeSystemInfo) GetMachineId() string { - if x != nil { - return x.MachineId - } - return "" -} - -func (x *NodeSystemInfo) GetSystemUuid() string { - if x != nil { - return x.SystemUuid - } - return "" -} - -func (x *NodeSystemInfo) GetBootId() string { - if x != nil { - return x.BootId - } - return "" -} - -func (x *NodeSystemInfo) GetKernelVersion() string { - if x != nil { - return x.KernelVersion - } - return "" -} - -func (x *NodeSystemInfo) GetOsImage() string { - if x != nil { - return x.OsImage - } - return "" -} - -func (x *NodeSystemInfo) GetContainerRuntimeVersion() string { - if x != nil { - return x.ContainerRuntimeVersion - } - return "" -} - -func (x *NodeSystemInfo) GetKubeletVersion() string { - if x != nil { - return x.KubeletVersion - } - return "" +// Deprecated: Use NodeSelectorRequirement.ProtoReflect.Descriptor instead. +func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{78} } -func (x *NodeSystemInfo) GetKubeProxyVersion() string { +func (x *NodeSelectorRequirement) GetKey() string { if x != nil { - return x.KubeProxyVersion + return x.Key } return "" } -func (x *NodeSystemInfo) GetOperatingSystem() string { +func (x *NodeSelectorRequirement) GetOperator() string { if x != nil { - return x.OperatingSystem + return x.Operator } return "" } -func (x *NodeSystemInfo) GetArchitecture() string { +func (x *NodeSelectorRequirement) GetValues() []string { if x != nil { - return x.Architecture + return x.Values } - return "" + return nil } -// NodeImage represents a container image on the node -type NodeImage struct { +// HPADetails contains detailed HorizontalPodAutoscaler information for drill-down +type HPADetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"` // Image names/tags - SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` // Image size in bytes + ScaleTargetRef *ScaleTargetRef `protobuf:"bytes,1,opt,name=scale_target_ref,json=scaleTargetRef,proto3" json:"scale_target_ref,omitempty"` // Target reference for scaling + Metrics []*HPAMetric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"` // Scaling metrics configuration + Conditions []*HPACondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // HPA conditions for debugging + Behavior *HPABehavior `protobuf:"bytes,4,opt,name=behavior,proto3" json:"behavior,omitempty"` // Scaling behavior policies (optional) + CurrentMetrics []*HPACurrentMetric `protobuf:"bytes,5,rep,name=current_metrics,json=currentMetrics,proto3" json:"current_metrics,omitempty"` // Current metrics values } -func (x *NodeImage) Reset() { - *x = NodeImage{} +func (x *HPADetails) Reset() { + *x = HPADetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[66] + mi := &file_api_v1_common_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeImage) String() string { +func (x *HPADetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeImage) ProtoMessage() {} +func (*HPADetails) ProtoMessage() {} -func (x *NodeImage) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[66] +func (x *HPADetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8809,51 +10260,74 @@ func (x *NodeImage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeImage.ProtoReflect.Descriptor instead. -func (*NodeImage) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{66} +// Deprecated: Use HPADetails.ProtoReflect.Descriptor instead. +func (*HPADetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{79} } -func (x *NodeImage) GetNames() []string { +func (x *HPADetails) GetScaleTargetRef() *ScaleTargetRef { if x != nil { - return x.Names + return x.ScaleTargetRef } return nil } -func (x *NodeImage) GetSizeBytes() int64 { +func (x *HPADetails) GetMetrics() []*HPAMetric { if x != nil { - return x.SizeBytes + return x.Metrics } - return 0 + return nil } -// TopologySelector represents topology requirements for storage -type TopologySelector struct { +func (x *HPADetails) GetConditions() []*HPACondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *HPADetails) GetBehavior() *HPABehavior { + if x != nil { + return x.Behavior + } + return nil +} + +func (x *HPADetails) GetCurrentMetrics() []*HPACurrentMetric { + if x != nil { + return x.CurrentMetrics + } + return nil +} + +// ScaleTargetRef represents the target resource for HPA scaling +type ScaleTargetRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchLabelExpressions []*TopologySelectorTerm `protobuf:"bytes,1,rep,name=match_label_expressions,json=matchLabelExpressions,proto3" json:"match_label_expressions,omitempty"` // Topology selector terms + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource } -func (x *TopologySelector) Reset() { - *x = TopologySelector{} +func (x *ScaleTargetRef) Reset() { + *x = ScaleTargetRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[67] + mi := &file_api_v1_common_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopologySelector) String() string { +func (x *ScaleTargetRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopologySelector) ProtoMessage() {} +func (*ScaleTargetRef) ProtoMessage() {} -func (x *TopologySelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[67] +func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8864,44 +10338,62 @@ func (x *TopologySelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopologySelector.ProtoReflect.Descriptor instead. -func (*TopologySelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{67} +// Deprecated: Use ScaleTargetRef.ProtoReflect.Descriptor instead. +func (*ScaleTargetRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{80} } -func (x *TopologySelector) GetMatchLabelExpressions() []*TopologySelectorTerm { +func (x *ScaleTargetRef) GetKind() string { if x != nil { - return x.MatchLabelExpressions + return x.Kind } - return nil + return "" } -// TopologySelectorTerm represents a topology selector term -type TopologySelectorTerm struct { +func (x *ScaleTargetRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ScaleTargetRef) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +// HPAMetric represents an HPA metric configuration +type HPAMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchLabels map[string]string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Labels that must match + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" + Resource *HPAResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Resource metric (if type is Resource) + Pods *HPAPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Pods metric (if type is Pods) + Object *HPAObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Object metric (if type is Object) + External *HPAExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // External metric (if type is External) } -func (x *TopologySelectorTerm) Reset() { - *x = TopologySelectorTerm{} +func (x *HPAMetric) Reset() { + *x = HPAMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[68] + mi := &file_api_v1_common_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopologySelectorTerm) String() string { +func (x *HPAMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopologySelectorTerm) ProtoMessage() {} +func (*HPAMetric) ProtoMessage() {} -func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[68] +func (x *HPAMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8912,48 +10404,74 @@ func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopologySelectorTerm.ProtoReflect.Descriptor instead. -func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{68} +// Deprecated: Use HPAMetric.ProtoReflect.Descriptor instead. +func (*HPAMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{81} } -func (x *TopologySelectorTerm) GetMatchLabels() map[string]string { +func (x *HPAMetric) GetType() string { if x != nil { - return x.MatchLabels + return x.Type + } + return "" +} + +func (x *HPAMetric) GetResource() *HPAResourceMetric { + if x != nil { + return x.Resource } return nil } -// TolerationInfo represents a simplified pod toleration for DaemonSets -type TolerationInfo struct { +func (x *HPAMetric) GetPods() *HPAPodsMetric { + if x != nil { + return x.Pods + } + return nil +} + +func (x *HPAMetric) GetObject() *HPAObjectMetric { + if x != nil { + return x.Object + } + return nil +} + +func (x *HPAMetric) GetExternal() *HPAExternalMetric { + if x != nil { + return x.External + } + return nil +} + +// HPAResourceMetric represents a resource-based metric +type HPAResourceMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Toleration key (optional for exists/all) - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "Equal", "Exists" - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Value to match (for Equal operator) - Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` // "NoSchedule", "PreferNoSchedule", "NoExecute", or "" - TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` // Toleration period for NoExecute (optional) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name: "cpu", "memory" + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Utilization", "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value (e.g., "80" for 80%, "100m" for 100 millicores) } -func (x *TolerationInfo) Reset() { - *x = TolerationInfo{} +func (x *HPAResourceMetric) Reset() { + *x = HPAResourceMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[69] + mi := &file_api_v1_common_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TolerationInfo) String() string { +func (x *HPAResourceMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TolerationInfo) ProtoMessage() {} +func (*HPAResourceMetric) ProtoMessage() {} -func (x *TolerationInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[69] +func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8964,72 +10482,60 @@ func (x *TolerationInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TolerationInfo.ProtoReflect.Descriptor instead. -func (*TolerationInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{69} -} - -func (x *TolerationInfo) GetKey() string { - if x != nil { - return x.Key - } - return "" +// Deprecated: Use HPAResourceMetric.ProtoReflect.Descriptor instead. +func (*HPAResourceMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{82} } -func (x *TolerationInfo) GetOperator() string { +func (x *HPAResourceMetric) GetName() string { if x != nil { - return x.Operator + return x.Name } return "" } -func (x *TolerationInfo) GetValue() string { +func (x *HPAResourceMetric) GetTargetType() string { if x != nil { - return x.Value + return x.TargetType } return "" } -func (x *TolerationInfo) GetEffect() string { +func (x *HPAResourceMetric) GetTargetValue() string { if x != nil { - return x.Effect + return x.TargetValue } return "" } -func (x *TolerationInfo) GetTolerationSeconds() int64 { - if x != nil { - return x.TolerationSeconds - } - return 0 -} - -// NodeSelector represents node selector requirements -type NodeSelector struct { +// HPAPodsMetric represents a pods-based metric +type HPAPodsMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Terms []*NodeSelectorTerm `protobuf:"bytes,1,rep,name=terms,proto3" json:"terms,omitempty"` // Node selector terms + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target average value per pod } -func (x *NodeSelector) Reset() { - *x = NodeSelector{} +func (x *HPAPodsMetric) Reset() { + *x = HPAPodsMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[70] + mi := &file_api_v1_common_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelector) String() string { +func (x *HPAPodsMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelector) ProtoMessage() {} +func (*HPAPodsMetric) ProtoMessage() {} -func (x *NodeSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[70] +func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9040,45 +10546,61 @@ func (x *NodeSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelector.ProtoReflect.Descriptor instead. -func (*NodeSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{70} +// Deprecated: Use HPAPodsMetric.ProtoReflect.Descriptor instead. +func (*HPAPodsMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{83} } -func (x *NodeSelector) GetTerms() []*NodeSelectorTerm { +func (x *HPAPodsMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.Terms + return x.Metric } return nil } -// NodeSelectorTerm represents a node selector term -type NodeSelectorTerm struct { +func (x *HPAPodsMetric) GetTargetType() string { + if x != nil { + return x.TargetType + } + return "" +} + +func (x *HPAPodsMetric) GetTargetValue() string { + if x != nil { + return x.TargetValue + } + return "" +} + +// HPAObjectMetric represents an object-based metric +type HPAObjectMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchExpressions []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` // Match expressions - MatchFields []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=match_fields,json=matchFields,proto3" json:"match_fields,omitempty"` // Match fields + DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference + Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,3,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" + TargetValue string `protobuf:"bytes,4,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value } -func (x *NodeSelectorTerm) Reset() { - *x = NodeSelectorTerm{} +func (x *HPAObjectMetric) Reset() { + *x = HPAObjectMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[71] + mi := &file_api_v1_common_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelectorTerm) String() string { +func (x *HPAObjectMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelectorTerm) ProtoMessage() {} +func (*HPAObjectMetric) ProtoMessage() {} -func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[71] +func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9089,53 +10611,67 @@ func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelectorTerm.ProtoReflect.Descriptor instead. -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{71} +// Deprecated: Use HPAObjectMetric.ProtoReflect.Descriptor instead. +func (*HPAObjectMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{84} } -func (x *NodeSelectorTerm) GetMatchExpressions() []*NodeSelectorRequirement { +func (x *HPAObjectMetric) GetDescribedObject() *HPAObjectReference { if x != nil { - return x.MatchExpressions + return x.DescribedObject } return nil } -func (x *NodeSelectorTerm) GetMatchFields() []*NodeSelectorRequirement { +func (x *HPAObjectMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.MatchFields + return x.Metric } return nil } -// NodeSelectorRequirement represents a node selector requirement -type NodeSelectorRequirement struct { +func (x *HPAObjectMetric) GetTargetType() string { + if x != nil { + return x.TargetType + } + return "" +} + +func (x *HPAObjectMetric) GetTargetValue() string { + if x != nil { + return x.TargetValue + } + return "" +} + +// HPAExternalMetric represents an external metric +type HPAExternalMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Selector key - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "In", "NotIn", "Exists", "DoesNotExist", "Gt", "Lt" - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Values to match + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value } -func (x *NodeSelectorRequirement) Reset() { - *x = NodeSelectorRequirement{} +func (x *HPAExternalMetric) Reset() { + *x = HPAExternalMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[72] + mi := &file_api_v1_common_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelectorRequirement) String() string { +func (x *HPAExternalMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelectorRequirement) ProtoMessage() {} +func (*HPAExternalMetric) ProtoMessage() {} -func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[72] +func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9146,62 +10682,59 @@ func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelectorRequirement.ProtoReflect.Descriptor instead. -func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{72} +// Deprecated: Use HPAExternalMetric.ProtoReflect.Descriptor instead. +func (*HPAExternalMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{85} } -func (x *NodeSelectorRequirement) GetKey() string { +func (x *HPAExternalMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.Key + return x.Metric } - return "" + return nil } -func (x *NodeSelectorRequirement) GetOperator() string { +func (x *HPAExternalMetric) GetTargetType() string { if x != nil { - return x.Operator + return x.TargetType } return "" } -func (x *NodeSelectorRequirement) GetValues() []string { +func (x *HPAExternalMetric) GetTargetValue() string { if x != nil { - return x.Values + return x.TargetValue } - return nil + return "" } -// HPADetails contains detailed HorizontalPodAutoscaler information for drill-down -type HPADetails struct { +// HPAMetricSelector represents a metric selector +type HPAMetricSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ScaleTargetRef *ScaleTargetRef `protobuf:"bytes,1,opt,name=scale_target_ref,json=scaleTargetRef,proto3" json:"scale_target_ref,omitempty"` // Target reference for scaling - Metrics []*HPAMetric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"` // Scaling metrics configuration - Conditions []*HPACondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // HPA conditions for debugging - Behavior *HPABehavior `protobuf:"bytes,4,opt,name=behavior,proto3" json:"behavior,omitempty"` // Scaling behavior policies (optional) - CurrentMetrics []*HPACurrentMetric `protobuf:"bytes,5,rep,name=current_metrics,json=currentMetrics,proto3" json:"current_metrics,omitempty"` // Current metrics values + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Metric name + Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector (optional) } -func (x *HPADetails) Reset() { - *x = HPADetails{} +func (x *HPAMetricSelector) Reset() { + *x = HPAMetricSelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[73] + mi := &file_api_v1_common_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPADetails) String() string { +func (x *HPAMetricSelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPADetails) ProtoMessage() {} +func (*HPAMetricSelector) ProtoMessage() {} -func (x *HPADetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[73] +func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9212,74 +10745,54 @@ func (x *HPADetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPADetails.ProtoReflect.Descriptor instead. -func (*HPADetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{73} -} - -func (x *HPADetails) GetScaleTargetRef() *ScaleTargetRef { - if x != nil { - return x.ScaleTargetRef - } - return nil -} - -func (x *HPADetails) GetMetrics() []*HPAMetric { - if x != nil { - return x.Metrics - } - return nil -} - -func (x *HPADetails) GetConditions() []*HPACondition { - if x != nil { - return x.Conditions - } - return nil +// Deprecated: Use HPAMetricSelector.ProtoReflect.Descriptor instead. +func (*HPAMetricSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{86} } -func (x *HPADetails) GetBehavior() *HPABehavior { +func (x *HPAMetricSelector) GetName() string { if x != nil { - return x.Behavior + return x.Name } - return nil + return "" } -func (x *HPADetails) GetCurrentMetrics() []*HPACurrentMetric { +func (x *HPAMetricSelector) GetSelector() map[string]string { if x != nil { - return x.CurrentMetrics + return x.Selector } return nil } -// ScaleTargetRef represents the target resource for HPA scaling -type ScaleTargetRef struct { +// HPAObjectReference represents an object reference for metrics +type HPAObjectReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Object kind + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Object name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Object namespace (optional) } -func (x *ScaleTargetRef) Reset() { - *x = ScaleTargetRef{} +func (x *HPAObjectReference) Reset() { + *x = HPAObjectReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[74] + mi := &file_api_v1_common_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ScaleTargetRef) String() string { +func (x *HPAObjectReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ScaleTargetRef) ProtoMessage() {} +func (*HPAObjectReference) ProtoMessage() {} -func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[74] +func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9290,62 +10803,69 @@ func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ScaleTargetRef.ProtoReflect.Descriptor instead. -func (*ScaleTargetRef) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{74} +// Deprecated: Use HPAObjectReference.ProtoReflect.Descriptor instead. +func (*HPAObjectReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{87} } -func (x *ScaleTargetRef) GetKind() string { +func (x *HPAObjectReference) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *ScaleTargetRef) GetName() string { +func (x *HPAObjectReference) GetName() string { if x != nil { return x.Name } return "" } -func (x *ScaleTargetRef) GetApiVersion() string { +func (x *HPAObjectReference) GetApiVersion() string { if x != nil { return x.ApiVersion } return "" } -// HPAMetric represents an HPA metric configuration -type HPAMetric struct { +func (x *HPAObjectReference) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +// HPACurrentMetric represents current metric values +type HPACurrentMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" - Resource *HPAResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Resource metric (if type is Resource) - Pods *HPAPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Pods metric (if type is Pods) - Object *HPAObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Object metric (if type is Object) - External *HPAExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // External metric (if type is External) + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" + Resource *HPACurrentResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Current resource metric + Pods *HPACurrentPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Current pods metric + Object *HPACurrentObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Current object metric + External *HPACurrentExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // Current external metric } -func (x *HPAMetric) Reset() { - *x = HPAMetric{} +func (x *HPACurrentMetric) Reset() { + *x = HPACurrentMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[75] + mi := &file_api_v1_common_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAMetric) String() string { +func (x *HPACurrentMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAMetric) ProtoMessage() {} +func (*HPACurrentMetric) ProtoMessage() {} -func (x *HPAMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[75] +func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9356,74 +10876,74 @@ func (x *HPAMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAMetric.ProtoReflect.Descriptor instead. -func (*HPAMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{75} +// Deprecated: Use HPACurrentMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{88} } -func (x *HPAMetric) GetType() string { +func (x *HPACurrentMetric) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPAMetric) GetResource() *HPAResourceMetric { +func (x *HPACurrentMetric) GetResource() *HPACurrentResourceMetric { if x != nil { return x.Resource } return nil } -func (x *HPAMetric) GetPods() *HPAPodsMetric { +func (x *HPACurrentMetric) GetPods() *HPACurrentPodsMetric { if x != nil { return x.Pods } return nil } -func (x *HPAMetric) GetObject() *HPAObjectMetric { +func (x *HPACurrentMetric) GetObject() *HPACurrentObjectMetric { if x != nil { return x.Object } return nil } -func (x *HPAMetric) GetExternal() *HPAExternalMetric { +func (x *HPACurrentMetric) GetExternal() *HPACurrentExternalMetric { if x != nil { return x.External } return nil } -// HPAResourceMetric represents a resource-based metric -type HPAResourceMetric struct { +// HPACurrentResourceMetric represents current resource metric values +type HPACurrentResourceMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name: "cpu", "memory" - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Utilization", "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value (e.g., "80" for 80%, "100m" for 100 millicores) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name + CurrentUtilization string `protobuf:"bytes,2,opt,name=current_utilization,json=currentUtilization,proto3" json:"current_utilization,omitempty"` // Current utilization percentage (optional) + CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) } -func (x *HPAResourceMetric) Reset() { - *x = HPAResourceMetric{} +func (x *HPACurrentResourceMetric) Reset() { + *x = HPACurrentResourceMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[76] + mi := &file_api_v1_common_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAResourceMetric) String() string { +func (x *HPACurrentResourceMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAResourceMetric) ProtoMessage() {} +func (*HPACurrentResourceMetric) ProtoMessage() {} -func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[76] +func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9434,60 +10954,59 @@ func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAResourceMetric.ProtoReflect.Descriptor instead. -func (*HPAResourceMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{76} +// Deprecated: Use HPACurrentResourceMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentResourceMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{89} } -func (x *HPAResourceMetric) GetName() string { +func (x *HPACurrentResourceMetric) GetName() string { if x != nil { return x.Name } return "" } -func (x *HPAResourceMetric) GetTargetType() string { +func (x *HPACurrentResourceMetric) GetCurrentUtilization() string { if x != nil { - return x.TargetType + return x.CurrentUtilization } return "" } -func (x *HPAResourceMetric) GetTargetValue() string { +func (x *HPACurrentResourceMetric) GetCurrentAverageValue() string { if x != nil { - return x.TargetValue + return x.CurrentAverageValue } return "" } -// HPAPodsMetric represents a pods-based metric -type HPAPodsMetric struct { +// HPACurrentPodsMetric represents current pods metric values +type HPACurrentPodsMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target average value per pod + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + CurrentAverageValue string `protobuf:"bytes,2,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value per pod } -func (x *HPAPodsMetric) Reset() { - *x = HPAPodsMetric{} +func (x *HPACurrentPodsMetric) Reset() { + *x = HPACurrentPodsMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[77] + mi := &file_api_v1_common_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAPodsMetric) String() string { +func (x *HPACurrentPodsMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAPodsMetric) ProtoMessage() {} +func (*HPACurrentPodsMetric) ProtoMessage() {} -func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[77] +func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9498,61 +11017,53 @@ func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAPodsMetric.ProtoReflect.Descriptor instead. -func (*HPAPodsMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{77} +// Deprecated: Use HPACurrentPodsMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentPodsMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{90} } -func (x *HPAPodsMetric) GetMetric() *HPAMetricSelector { +func (x *HPACurrentPodsMetric) GetMetric() *HPAMetricSelector { if x != nil { return x.Metric } return nil } -func (x *HPAPodsMetric) GetTargetType() string { - if x != nil { - return x.TargetType - } - return "" -} - -func (x *HPAPodsMetric) GetTargetValue() string { +func (x *HPACurrentPodsMetric) GetCurrentAverageValue() string { if x != nil { - return x.TargetValue + return x.CurrentAverageValue } return "" } -// HPAObjectMetric represents an object-based metric -type HPAObjectMetric struct { +// HPACurrentObjectMetric represents current object metric values +type HPACurrentObjectMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,3,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" - TargetValue string `protobuf:"bytes,4,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value + CurrentValue string `protobuf:"bytes,3,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value } -func (x *HPAObjectMetric) Reset() { - *x = HPAObjectMetric{} +func (x *HPACurrentObjectMetric) Reset() { + *x = HPACurrentObjectMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[78] + mi := &file_api_v1_common_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAObjectMetric) String() string { +func (x *HPACurrentObjectMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAObjectMetric) ProtoMessage() {} +func (*HPACurrentObjectMetric) ProtoMessage() {} -func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[78] +func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9563,67 +11074,126 @@ func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAObjectMetric.ProtoReflect.Descriptor instead. -func (*HPAObjectMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{78} +// Deprecated: Use HPACurrentObjectMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentObjectMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{91} } -func (x *HPAObjectMetric) GetDescribedObject() *HPAObjectReference { +func (x *HPACurrentObjectMetric) GetDescribedObject() *HPAObjectReference { if x != nil { return x.DescribedObject } return nil } -func (x *HPAObjectMetric) GetMetric() *HPAMetricSelector { +func (x *HPACurrentObjectMetric) GetMetric() *HPAMetricSelector { if x != nil { return x.Metric } return nil } -func (x *HPAObjectMetric) GetTargetType() string { +func (x *HPACurrentObjectMetric) GetCurrentValue() string { if x != nil { - return x.TargetType + return x.CurrentValue } return "" } -func (x *HPAObjectMetric) GetTargetValue() string { +// HPACurrentExternalMetric represents current external metric values +type HPACurrentExternalMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + CurrentValue string `protobuf:"bytes,2,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value + CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) +} + +func (x *HPACurrentExternalMetric) Reset() { + *x = HPACurrentExternalMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HPACurrentExternalMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HPACurrentExternalMetric) ProtoMessage() {} + +func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[92] + 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 HPACurrentExternalMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentExternalMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{92} +} + +func (x *HPACurrentExternalMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.TargetValue + return x.Metric + } + return nil +} + +func (x *HPACurrentExternalMetric) GetCurrentValue() string { + if x != nil { + return x.CurrentValue } return "" } -// HPAExternalMetric represents an external metric -type HPAExternalMetric struct { +func (x *HPACurrentExternalMetric) GetCurrentAverageValue() string { + if x != nil { + return x.CurrentAverageValue + } + return "" +} + +// HPACondition represents an HPA condition +type HPACondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "AbleToScale", "ScalingActive", "ScalingLimited" + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *HPAExternalMetric) Reset() { - *x = HPAExternalMetric{} +func (x *HPACondition) Reset() { + *x = HPACondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[79] + mi := &file_api_v1_common_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAExternalMetric) String() string { +func (x *HPACondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAExternalMetric) ProtoMessage() {} +func (*HPACondition) ProtoMessage() {} -func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[79] +func (x *HPACondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9634,59 +11204,73 @@ func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAExternalMetric.ProtoReflect.Descriptor instead. -func (*HPAExternalMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{79} +// Deprecated: Use HPACondition.ProtoReflect.Descriptor instead. +func (*HPACondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{93} } -func (x *HPAExternalMetric) GetMetric() *HPAMetricSelector { +func (x *HPACondition) GetType() string { if x != nil { - return x.Metric + return x.Type } - return nil + return "" } -func (x *HPAExternalMetric) GetTargetType() string { +func (x *HPACondition) GetStatus() string { if x != nil { - return x.TargetType + return x.Status + } + return "" +} + +func (x *HPACondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *HPACondition) GetMessage() string { + if x != nil { + return x.Message } return "" } -func (x *HPAExternalMetric) GetTargetValue() string { +func (x *HPACondition) GetLastTransitionTime() int64 { if x != nil { - return x.TargetValue + return x.LastTransitionTime } - return "" + return 0 } -// HPAMetricSelector represents a metric selector -type HPAMetricSelector struct { +// HPABehavior represents HPA scaling behavior policies +type HPABehavior struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Metric name - Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector (optional) + ScaleUp *HPAScalingRules `protobuf:"bytes,1,opt,name=scale_up,json=scaleUp,proto3" json:"scale_up,omitempty"` // Scale up behavior + ScaleDown *HPAScalingRules `protobuf:"bytes,2,opt,name=scale_down,json=scaleDown,proto3" json:"scale_down,omitempty"` // Scale down behavior } -func (x *HPAMetricSelector) Reset() { - *x = HPAMetricSelector{} +func (x *HPABehavior) Reset() { + *x = HPABehavior{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[80] + mi := &file_api_v1_common_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAMetricSelector) String() string { +func (x *HPABehavior) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAMetricSelector) ProtoMessage() {} +func (*HPABehavior) ProtoMessage() {} -func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[80] +func (x *HPABehavior) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9697,54 +11281,53 @@ func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAMetricSelector.ProtoReflect.Descriptor instead. -func (*HPAMetricSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{80} +// Deprecated: Use HPABehavior.ProtoReflect.Descriptor instead. +func (*HPABehavior) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{94} } -func (x *HPAMetricSelector) GetName() string { +func (x *HPABehavior) GetScaleUp() *HPAScalingRules { if x != nil { - return x.Name + return x.ScaleUp } - return "" + return nil } -func (x *HPAMetricSelector) GetSelector() map[string]string { +func (x *HPABehavior) GetScaleDown() *HPAScalingRules { if x != nil { - return x.Selector + return x.ScaleDown } return nil } -// HPAObjectReference represents an object reference for metrics -type HPAObjectReference struct { +// HPAScalingRules represents scaling behavior rules +type HPAScalingRules struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Object kind - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Object name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Object namespace (optional) + StabilizationWindowSeconds int32 `protobuf:"varint,1,opt,name=stabilization_window_seconds,json=stabilizationWindowSeconds,proto3" json:"stabilization_window_seconds,omitempty"` // Stabilization window + SelectPolicy string `protobuf:"bytes,2,opt,name=select_policy,json=selectPolicy,proto3" json:"select_policy,omitempty"` // Policy selection: "Max", "Min", "Disabled" + Policies []*HPAScalingPolicy `protobuf:"bytes,3,rep,name=policies,proto3" json:"policies,omitempty"` // Scaling policies } -func (x *HPAObjectReference) Reset() { - *x = HPAObjectReference{} +func (x *HPAScalingRules) Reset() { + *x = HPAScalingRules{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[81] + mi := &file_api_v1_common_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAObjectReference) String() string { +func (x *HPAScalingRules) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAObjectReference) ProtoMessage() {} +func (*HPAScalingRules) ProtoMessage() {} -func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[81] +func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9755,69 +11338,60 @@ func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAObjectReference.ProtoReflect.Descriptor instead. -func (*HPAObjectReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{81} -} - -func (x *HPAObjectReference) GetKind() string { - if x != nil { - return x.Kind - } - return "" +// Deprecated: Use HPAScalingRules.ProtoReflect.Descriptor instead. +func (*HPAScalingRules) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{95} } -func (x *HPAObjectReference) GetName() string { +func (x *HPAScalingRules) GetStabilizationWindowSeconds() int32 { if x != nil { - return x.Name + return x.StabilizationWindowSeconds } - return "" + return 0 } -func (x *HPAObjectReference) GetApiVersion() string { +func (x *HPAScalingRules) GetSelectPolicy() string { if x != nil { - return x.ApiVersion + return x.SelectPolicy } return "" } -func (x *HPAObjectReference) GetNamespace() string { +func (x *HPAScalingRules) GetPolicies() []*HPAScalingPolicy { if x != nil { - return x.Namespace + return x.Policies } - return "" + return nil } -// HPACurrentMetric represents current metric values -type HPACurrentMetric struct { +// HPAScalingPolicy represents a scaling policy +type HPAScalingPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" - Resource *HPACurrentResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Current resource metric - Pods *HPACurrentPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Current pods metric - Object *HPACurrentObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Current object metric - External *HPACurrentExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // Current external metric + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Policy type: "Pods", "Percent" + Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` // Policy value + PeriodSeconds int32 `protobuf:"varint,3,opt,name=period_seconds,json=periodSeconds,proto3" json:"period_seconds,omitempty"` // Period in seconds } -func (x *HPACurrentMetric) Reset() { - *x = HPACurrentMetric{} +func (x *HPAScalingPolicy) Reset() { + *x = HPAScalingPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[82] + mi := &file_api_v1_common_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentMetric) String() string { +func (x *HPAScalingPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentMetric) ProtoMessage() {} +func (*HPAScalingPolicy) ProtoMessage() {} -func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[82] +func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9828,74 +11402,62 @@ func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{82} +// Deprecated: Use HPAScalingPolicy.ProtoReflect.Descriptor instead. +func (*HPAScalingPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{96} } -func (x *HPACurrentMetric) GetType() string { +func (x *HPAScalingPolicy) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPACurrentMetric) GetResource() *HPACurrentResourceMetric { - if x != nil { - return x.Resource - } - return nil -} - -func (x *HPACurrentMetric) GetPods() *HPACurrentPodsMetric { - if x != nil { - return x.Pods - } - return nil -} - -func (x *HPACurrentMetric) GetObject() *HPACurrentObjectMetric { +func (x *HPAScalingPolicy) GetValue() int32 { if x != nil { - return x.Object + return x.Value } - return nil + return 0 } -func (x *HPACurrentMetric) GetExternal() *HPACurrentExternalMetric { +func (x *HPAScalingPolicy) GetPeriodSeconds() int32 { if x != nil { - return x.External + return x.PeriodSeconds } - return nil + return 0 } -// HPACurrentResourceMetric represents current resource metric values -type HPACurrentResourceMetric struct { +// VPADetails contains detailed VerticalPodAutoscaler information for drill-down +type VPADetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name - CurrentUtilization string `protobuf:"bytes,2,opt,name=current_utilization,json=currentUtilization,proto3" json:"current_utilization,omitempty"` // Current utilization percentage (optional) - CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) + TargetRef *VPATargetRef `protobuf:"bytes,1,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // Target reference for VPA + UpdatePolicy *VPAUpdatePolicy `protobuf:"bytes,2,opt,name=update_policy,json=updatePolicy,proto3" json:"update_policy,omitempty"` // Update policy configuration + ResourcePolicy *VPAResourcePolicy `protobuf:"bytes,3,opt,name=resource_policy,json=resourcePolicy,proto3" json:"resource_policy,omitempty"` // Resource policy configuration + Recommendation *VPARecommendation `protobuf:"bytes,4,opt,name=recommendation,proto3" json:"recommendation,omitempty"` // Current recommendations + Conditions []*VPACondition `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty"` // VPA conditions for debugging } -func (x *HPACurrentResourceMetric) Reset() { - *x = HPACurrentResourceMetric{} +func (x *VPADetails) Reset() { + *x = VPADetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[83] + mi := &file_api_v1_common_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentResourceMetric) String() string { +func (x *VPADetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentResourceMetric) ProtoMessage() {} +func (*VPADetails) ProtoMessage() {} -func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[83] +func (x *VPADetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9906,59 +11468,74 @@ func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentResourceMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentResourceMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{83} +// Deprecated: Use VPADetails.ProtoReflect.Descriptor instead. +func (*VPADetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{97} } -func (x *HPACurrentResourceMetric) GetName() string { +func (x *VPADetails) GetTargetRef() *VPATargetRef { if x != nil { - return x.Name + return x.TargetRef } - return "" + return nil } -func (x *HPACurrentResourceMetric) GetCurrentUtilization() string { +func (x *VPADetails) GetUpdatePolicy() *VPAUpdatePolicy { if x != nil { - return x.CurrentUtilization + return x.UpdatePolicy } - return "" + return nil } -func (x *HPACurrentResourceMetric) GetCurrentAverageValue() string { +func (x *VPADetails) GetResourcePolicy() *VPAResourcePolicy { if x != nil { - return x.CurrentAverageValue + return x.ResourcePolicy } - return "" + return nil } -// HPACurrentPodsMetric represents current pods metric values -type HPACurrentPodsMetric struct { +func (x *VPADetails) GetRecommendation() *VPARecommendation { + if x != nil { + return x.Recommendation + } + return nil +} + +func (x *VPADetails) GetConditions() []*VPACondition { + if x != nil { + return x.Conditions + } + return nil +} + +// VPATargetRef represents the target resource for VPA +type VPATargetRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentAverageValue string `protobuf:"bytes,2,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value per pod + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource } -func (x *HPACurrentPodsMetric) Reset() { - *x = HPACurrentPodsMetric{} +func (x *VPATargetRef) Reset() { + *x = VPATargetRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[84] + mi := &file_api_v1_common_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentPodsMetric) String() string { +func (x *VPATargetRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentPodsMetric) ProtoMessage() {} +func (*VPATargetRef) ProtoMessage() {} -func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[84] +func (x *VPATargetRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9969,53 +11546,59 @@ func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentPodsMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentPodsMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{84} +// Deprecated: Use VPATargetRef.ProtoReflect.Descriptor instead. +func (*VPATargetRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{98} +} + +func (x *VPATargetRef) GetKind() string { + if x != nil { + return x.Kind + } + return "" } -func (x *HPACurrentPodsMetric) GetMetric() *HPAMetricSelector { +func (x *VPATargetRef) GetName() string { if x != nil { - return x.Metric + return x.Name } - return nil + return "" } -func (x *HPACurrentPodsMetric) GetCurrentAverageValue() string { +func (x *VPATargetRef) GetApiVersion() string { if x != nil { - return x.CurrentAverageValue + return x.ApiVersion } return "" } -// HPACurrentObjectMetric represents current object metric values -type HPACurrentObjectMetric struct { +// VPAUpdatePolicy represents VPA update policy +type VPAUpdatePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference - Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentValue string `protobuf:"bytes,3,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value + UpdateMode string `protobuf:"bytes,1,opt,name=update_mode,json=updateMode,proto3" json:"update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" + MinReplicas int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum replicas during update (optional) } -func (x *HPACurrentObjectMetric) Reset() { - *x = HPACurrentObjectMetric{} +func (x *VPAUpdatePolicy) Reset() { + *x = VPAUpdatePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[85] + mi := &file_api_v1_common_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentObjectMetric) String() string { +func (x *VPAUpdatePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentObjectMetric) ProtoMessage() {} +func (*VPAUpdatePolicy) ProtoMessage() {} -func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[85] +func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10026,60 +11609,51 @@ func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentObjectMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentObjectMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{85} -} - -func (x *HPACurrentObjectMetric) GetDescribedObject() *HPAObjectReference { - if x != nil { - return x.DescribedObject - } - return nil +// Deprecated: Use VPAUpdatePolicy.ProtoReflect.Descriptor instead. +func (*VPAUpdatePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{99} } -func (x *HPACurrentObjectMetric) GetMetric() *HPAMetricSelector { +func (x *VPAUpdatePolicy) GetUpdateMode() string { if x != nil { - return x.Metric + return x.UpdateMode } - return nil + return "" } -func (x *HPACurrentObjectMetric) GetCurrentValue() string { +func (x *VPAUpdatePolicy) GetMinReplicas() int32 { if x != nil { - return x.CurrentValue + return x.MinReplicas } - return "" + return 0 } -// HPACurrentExternalMetric represents current external metric values -type HPACurrentExternalMetric struct { +// VPAResourcePolicy represents VPA resource policy +type VPAResourcePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentValue string `protobuf:"bytes,2,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value - CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) + ContainerPolicies []*VPAContainerResourcePolicy `protobuf:"bytes,1,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` // Per-container policies } -func (x *HPACurrentExternalMetric) Reset() { - *x = HPACurrentExternalMetric{} +func (x *VPAResourcePolicy) Reset() { + *x = VPAResourcePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[86] + mi := &file_api_v1_common_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentExternalMetric) String() string { +func (x *VPAResourcePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentExternalMetric) ProtoMessage() {} +func (*VPAResourcePolicy) ProtoMessage() {} -func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[86] +func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10090,62 +11664,49 @@ func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentExternalMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentExternalMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{86} +// Deprecated: Use VPAResourcePolicy.ProtoReflect.Descriptor instead. +func (*VPAResourcePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{100} } -func (x *HPACurrentExternalMetric) GetMetric() *HPAMetricSelector { +func (x *VPAResourcePolicy) GetContainerPolicies() []*VPAContainerResourcePolicy { if x != nil { - return x.Metric + return x.ContainerPolicies } return nil } -func (x *HPACurrentExternalMetric) GetCurrentValue() string { - if x != nil { - return x.CurrentValue - } - return "" -} - -func (x *HPACurrentExternalMetric) GetCurrentAverageValue() string { - if x != nil { - return x.CurrentAverageValue - } - return "" -} - -// HPACondition represents an HPA condition -type HPACondition struct { +// VPAContainerResourcePolicy represents VPA policy for a container +type VPAContainerResourcePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "AbleToScale", "ScalingActive", "ScalingLimited" - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name + Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"` // Mode: "Auto", "Off" + MinAllowed map[string]string `protobuf:"bytes,3,rep,name=min_allowed,json=minAllowed,proto3" json:"min_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum allowed resources + MaxAllowed map[string]string `protobuf:"bytes,4,rep,name=max_allowed,json=maxAllowed,proto3" json:"max_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum allowed resources + ControlledResources []string `protobuf:"bytes,5,rep,name=controlled_resources,json=controlledResources,proto3" json:"controlled_resources,omitempty"` // Controlled resource types + ControlledValues string `protobuf:"bytes,6,opt,name=controlled_values,json=controlledValues,proto3" json:"controlled_values,omitempty"` // Controlled values: "RequestsAndLimits", "RequestsOnly" } -func (x *HPACondition) Reset() { - *x = HPACondition{} +func (x *VPAContainerResourcePolicy) Reset() { + *x = VPAContainerResourcePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[87] + mi := &file_api_v1_common_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACondition) String() string { +func (x *VPAContainerResourcePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACondition) ProtoMessage() {} +func (*VPAContainerResourcePolicy) ProtoMessage() {} -func (x *HPACondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[87] +func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10156,73 +11717,79 @@ func (x *HPACondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACondition.ProtoReflect.Descriptor instead. -func (*HPACondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{87} +// Deprecated: Use VPAContainerResourcePolicy.ProtoReflect.Descriptor instead. +func (*VPAContainerResourcePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{101} } -func (x *HPACondition) GetType() string { +func (x *VPAContainerResourcePolicy) GetContainerName() string { if x != nil { - return x.Type + return x.ContainerName } return "" } -func (x *HPACondition) GetStatus() string { +func (x *VPAContainerResourcePolicy) GetMode() string { if x != nil { - return x.Status + return x.Mode } return "" } -func (x *HPACondition) GetReason() string { +func (x *VPAContainerResourcePolicy) GetMinAllowed() map[string]string { if x != nil { - return x.Reason + return x.MinAllowed } - return "" + return nil } -func (x *HPACondition) GetMessage() string { +func (x *VPAContainerResourcePolicy) GetMaxAllowed() map[string]string { if x != nil { - return x.Message + return x.MaxAllowed } - return "" + return nil } -func (x *HPACondition) GetLastTransitionTime() int64 { +func (x *VPAContainerResourcePolicy) GetControlledResources() []string { if x != nil { - return x.LastTransitionTime + return x.ControlledResources } - return 0 + return nil } -// HPABehavior represents HPA scaling behavior policies -type HPABehavior struct { +func (x *VPAContainerResourcePolicy) GetControlledValues() string { + if x != nil { + return x.ControlledValues + } + return "" +} + +// VPARecommendation represents VPA recommendations +type VPARecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ScaleUp *HPAScalingRules `protobuf:"bytes,1,opt,name=scale_up,json=scaleUp,proto3" json:"scale_up,omitempty"` // Scale up behavior - ScaleDown *HPAScalingRules `protobuf:"bytes,2,opt,name=scale_down,json=scaleDown,proto3" json:"scale_down,omitempty"` // Scale down behavior + ContainerRecommendations []*VPAContainerRecommendation `protobuf:"bytes,1,rep,name=container_recommendations,json=containerRecommendations,proto3" json:"container_recommendations,omitempty"` // Per-container recommendations } -func (x *HPABehavior) Reset() { - *x = HPABehavior{} +func (x *VPARecommendation) Reset() { + *x = VPARecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[88] + mi := &file_api_v1_common_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPABehavior) String() string { +func (x *VPARecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPABehavior) ProtoMessage() {} +func (*VPARecommendation) ProtoMessage() {} -func (x *HPABehavior) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[88] +func (x *VPARecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10233,53 +11800,48 @@ func (x *HPABehavior) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPABehavior.ProtoReflect.Descriptor instead. -func (*HPABehavior) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{88} -} - -func (x *HPABehavior) GetScaleUp() *HPAScalingRules { - if x != nil { - return x.ScaleUp - } - return nil +// Deprecated: Use VPARecommendation.ProtoReflect.Descriptor instead. +func (*VPARecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{102} } -func (x *HPABehavior) GetScaleDown() *HPAScalingRules { +func (x *VPARecommendation) GetContainerRecommendations() []*VPAContainerRecommendation { if x != nil { - return x.ScaleDown + return x.ContainerRecommendations } return nil } -// HPAScalingRules represents scaling behavior rules -type HPAScalingRules struct { +// VPAContainerRecommendation represents VPA recommendation for a container +type VPAContainerRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StabilizationWindowSeconds int32 `protobuf:"varint,1,opt,name=stabilization_window_seconds,json=stabilizationWindowSeconds,proto3" json:"stabilization_window_seconds,omitempty"` // Stabilization window - SelectPolicy string `protobuf:"bytes,2,opt,name=select_policy,json=selectPolicy,proto3" json:"select_policy,omitempty"` // Policy selection: "Max", "Min", "Disabled" - Policies []*HPAScalingPolicy `protobuf:"bytes,3,rep,name=policies,proto3" json:"policies,omitempty"` // Scaling policies + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name + Target map[string]string `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Target recommendations + LowerBound map[string]string `protobuf:"bytes,3,rep,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Lower bound recommendations + UpperBound map[string]string `protobuf:"bytes,4,rep,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Upper bound recommendations + UncappedTarget map[string]string `protobuf:"bytes,5,rep,name=uncapped_target,json=uncappedTarget,proto3" json:"uncapped_target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Uncapped target recommendations } -func (x *HPAScalingRules) Reset() { - *x = HPAScalingRules{} +func (x *VPAContainerRecommendation) Reset() { + *x = VPAContainerRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[89] + mi := &file_api_v1_common_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAScalingRules) String() string { +func (x *VPAContainerRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAScalingRules) ProtoMessage() {} +func (*VPAContainerRecommendation) ProtoMessage() {} -func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[89] +func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10290,60 +11852,76 @@ func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAScalingRules.ProtoReflect.Descriptor instead. -func (*HPAScalingRules) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{89} +// Deprecated: Use VPAContainerRecommendation.ProtoReflect.Descriptor instead. +func (*VPAContainerRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{103} +} + +func (x *VPAContainerRecommendation) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *VPAContainerRecommendation) GetTarget() map[string]string { + if x != nil { + return x.Target + } + return nil } -func (x *HPAScalingRules) GetStabilizationWindowSeconds() int32 { +func (x *VPAContainerRecommendation) GetLowerBound() map[string]string { if x != nil { - return x.StabilizationWindowSeconds + return x.LowerBound } - return 0 + return nil } -func (x *HPAScalingRules) GetSelectPolicy() string { +func (x *VPAContainerRecommendation) GetUpperBound() map[string]string { if x != nil { - return x.SelectPolicy + return x.UpperBound } - return "" + return nil } -func (x *HPAScalingRules) GetPolicies() []*HPAScalingPolicy { +func (x *VPAContainerRecommendation) GetUncappedTarget() map[string]string { if x != nil { - return x.Policies + return x.UncappedTarget } return nil } -// HPAScalingPolicy represents a scaling policy -type HPAScalingPolicy struct { +// VPACondition represents a VPA condition +type VPACondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Policy type: "Pods", "Percent" - Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` // Policy value - PeriodSeconds int32 `protobuf:"varint,3,opt,name=period_seconds,json=periodSeconds,proto3" json:"period_seconds,omitempty"` // Period in seconds + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "RecommendationProvided", "LowConfidence", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *HPAScalingPolicy) Reset() { - *x = HPAScalingPolicy{} +func (x *VPACondition) Reset() { + *x = VPACondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[90] + mi := &file_api_v1_common_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAScalingPolicy) String() string { +func (x *VPACondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAScalingPolicy) ProtoMessage() {} +func (*VPACondition) ProtoMessage() {} -func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[90] +func (x *VPACondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10354,62 +11932,72 @@ func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAScalingPolicy.ProtoReflect.Descriptor instead. -func (*HPAScalingPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{90} +// Deprecated: Use VPACondition.ProtoReflect.Descriptor instead. +func (*VPACondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{104} } -func (x *HPAScalingPolicy) GetType() string { +func (x *VPACondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPAScalingPolicy) GetValue() int32 { +func (x *VPACondition) GetStatus() string { if x != nil { - return x.Value + return x.Status } - return 0 + return "" } -func (x *HPAScalingPolicy) GetPeriodSeconds() int32 { +func (x *VPACondition) GetReason() string { if x != nil { - return x.PeriodSeconds + return x.Reason + } + return "" +} + +func (x *VPACondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *VPACondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime } return 0 } -// VPADetails contains detailed VerticalPodAutoscaler information for drill-down -type VPADetails struct { +// LimitRangeDetails contains detailed LimitRange information for drill-down +type LimitRangeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetRef *VPATargetRef `protobuf:"bytes,1,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // Target reference for VPA - UpdatePolicy *VPAUpdatePolicy `protobuf:"bytes,2,opt,name=update_policy,json=updatePolicy,proto3" json:"update_policy,omitempty"` // Update policy configuration - ResourcePolicy *VPAResourcePolicy `protobuf:"bytes,3,opt,name=resource_policy,json=resourcePolicy,proto3" json:"resource_policy,omitempty"` // Resource policy configuration - Recommendation *VPARecommendation `protobuf:"bytes,4,opt,name=recommendation,proto3" json:"recommendation,omitempty"` // Current recommendations - Conditions []*VPACondition `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty"` // VPA conditions for debugging + Limits []*LimitRangeItem `protobuf:"bytes,1,rep,name=limits,proto3" json:"limits,omitempty"` // Limit range items } -func (x *VPADetails) Reset() { - *x = VPADetails{} +func (x *LimitRangeDetails) Reset() { + *x = LimitRangeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[91] + mi := &file_api_v1_common_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPADetails) String() string { +func (x *LimitRangeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPADetails) ProtoMessage() {} +func (*LimitRangeDetails) ProtoMessage() {} -func (x *VPADetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[91] +func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10420,74 +12008,49 @@ func (x *VPADetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPADetails.ProtoReflect.Descriptor instead. -func (*VPADetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{91} -} - -func (x *VPADetails) GetTargetRef() *VPATargetRef { - if x != nil { - return x.TargetRef - } - return nil -} - -func (x *VPADetails) GetUpdatePolicy() *VPAUpdatePolicy { - if x != nil { - return x.UpdatePolicy - } - return nil -} - -func (x *VPADetails) GetResourcePolicy() *VPAResourcePolicy { - if x != nil { - return x.ResourcePolicy - } - return nil -} - -func (x *VPADetails) GetRecommendation() *VPARecommendation { - if x != nil { - return x.Recommendation - } - return nil +// Deprecated: Use LimitRangeDetails.ProtoReflect.Descriptor instead. +func (*LimitRangeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{105} } -func (x *VPADetails) GetConditions() []*VPACondition { +func (x *LimitRangeDetails) GetLimits() []*LimitRangeItem { if x != nil { - return x.Conditions + return x.Limits } return nil } -// VPATargetRef represents the target resource for VPA -type VPATargetRef struct { +// LimitRangeItem represents a single limit range item +type LimitRangeItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Type: "Container", "Pod", "PersistentVolumeClaim" + DefaultLimits map[string]string `protobuf:"bytes,2,rep,name=default_limits,json=defaultLimits,proto3" json:"default_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default limits + DefaultRequest map[string]string `protobuf:"bytes,3,rep,name=default_request,json=defaultRequest,proto3" json:"default_request,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default requests + Max map[string]string `protobuf:"bytes,4,rep,name=max,proto3" json:"max,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum limits + Min map[string]string `protobuf:"bytes,5,rep,name=min,proto3" json:"min,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum limits + MaxLimitRequestRatio map[string]string `protobuf:"bytes,6,rep,name=max_limit_request_ratio,json=maxLimitRequestRatio,proto3" json:"max_limit_request_ratio,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Max limit/request ratio } -func (x *VPATargetRef) Reset() { - *x = VPATargetRef{} +func (x *LimitRangeItem) Reset() { + *x = LimitRangeItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[92] + mi := &file_api_v1_common_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPATargetRef) String() string { +func (x *LimitRangeItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPATargetRef) ProtoMessage() {} +func (*LimitRangeItem) ProtoMessage() {} -func (x *VPATargetRef) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[92] +func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10498,59 +12061,82 @@ func (x *VPATargetRef) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPATargetRef.ProtoReflect.Descriptor instead. -func (*VPATargetRef) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{92} +// Deprecated: Use LimitRangeItem.ProtoReflect.Descriptor instead. +func (*LimitRangeItem) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{106} } -func (x *VPATargetRef) GetKind() string { +func (x *LimitRangeItem) GetType() string { if x != nil { - return x.Kind + return x.Type } return "" } -func (x *VPATargetRef) GetName() string { +func (x *LimitRangeItem) GetDefaultLimits() map[string]string { if x != nil { - return x.Name + return x.DefaultLimits } - return "" + return nil } -func (x *VPATargetRef) GetApiVersion() string { +func (x *LimitRangeItem) GetDefaultRequest() map[string]string { if x != nil { - return x.ApiVersion + return x.DefaultRequest } - return "" + return nil } -// VPAUpdatePolicy represents VPA update policy -type VPAUpdatePolicy struct { +func (x *LimitRangeItem) GetMax() map[string]string { + if x != nil { + return x.Max + } + return nil +} + +func (x *LimitRangeItem) GetMin() map[string]string { + if x != nil { + return x.Min + } + return nil +} + +func (x *LimitRangeItem) GetMaxLimitRequestRatio() map[string]string { + if x != nil { + return x.MaxLimitRequestRatio + } + return nil +} + +// ServiceAccountDetails contains detailed ServiceAccount information for drill-down +type ServiceAccountDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UpdateMode string `protobuf:"bytes,1,opt,name=update_mode,json=updateMode,proto3" json:"update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" - MinReplicas int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum replicas during update (optional) + AutomountServiceAccountToken bool `protobuf:"varint,1,opt,name=automount_service_account_token,json=automountServiceAccountToken,proto3" json:"automount_service_account_token,omitempty"` // Whether to automatically mount service account token + Secrets []string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty"` // Names of secrets referenced by this service account + ImagePullSecrets []string `protobuf:"bytes,3,rep,name=image_pull_secrets,json=imagePullSecrets,proto3" json:"image_pull_secrets,omitempty"` // Names of image pull secrets + ResourceVersion string `protobuf:"bytes,4,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` } -func (x *VPAUpdatePolicy) Reset() { - *x = VPAUpdatePolicy{} +func (x *ServiceAccountDetails) Reset() { + *x = ServiceAccountDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[93] + mi := &file_api_v1_common_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAUpdatePolicy) String() string { +func (x *ServiceAccountDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAUpdatePolicy) ProtoMessage() {} +func (*ServiceAccountDetails) ProtoMessage() {} -func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[93] +func (x *ServiceAccountDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10561,51 +12147,65 @@ func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAUpdatePolicy.ProtoReflect.Descriptor instead. -func (*VPAUpdatePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{93} +// Deprecated: Use ServiceAccountDetails.ProtoReflect.Descriptor instead. +func (*ServiceAccountDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{107} } -func (x *VPAUpdatePolicy) GetUpdateMode() string { +func (x *ServiceAccountDetails) GetAutomountServiceAccountToken() bool { if x != nil { - return x.UpdateMode + return x.AutomountServiceAccountToken + } + return false +} + +func (x *ServiceAccountDetails) GetSecrets() []string { + if x != nil { + return x.Secrets + } + return nil +} + +func (x *ServiceAccountDetails) GetImagePullSecrets() []string { + if x != nil { + return x.ImagePullSecrets } - return "" + return nil } -func (x *VPAUpdatePolicy) GetMinReplicas() int32 { +func (x *ServiceAccountDetails) GetResourceVersion() string { if x != nil { - return x.MinReplicas + return x.ResourceVersion } - return 0 + return "" } -// VPAResourcePolicy represents VPA resource policy -type VPAResourcePolicy struct { +// RoleDetails contains detailed Role information for drill-down +type RoleDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerPolicies []*VPAContainerResourcePolicy `protobuf:"bytes,1,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` // Per-container policies + Rules []*RoleRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Role rules defining permissions } -func (x *VPAResourcePolicy) Reset() { - *x = VPAResourcePolicy{} +func (x *RoleDetails) Reset() { + *x = RoleDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[94] + mi := &file_api_v1_common_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAResourcePolicy) String() string { +func (x *RoleDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAResourcePolicy) ProtoMessage() {} +func (*RoleDetails) ProtoMessage() {} -func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[94] +func (x *RoleDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10616,49 +12216,47 @@ func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAResourcePolicy.ProtoReflect.Descriptor instead. -func (*VPAResourcePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{94} +// Deprecated: Use RoleDetails.ProtoReflect.Descriptor instead. +func (*RoleDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{108} } -func (x *VPAResourcePolicy) GetContainerPolicies() []*VPAContainerResourcePolicy { +func (x *RoleDetails) GetRules() []*RoleRule { if x != nil { - return x.ContainerPolicies + return x.Rules } return nil } -// VPAContainerResourcePolicy represents VPA policy for a container -type VPAContainerResourcePolicy struct { +// RoleRule represents a single role rule +type RoleRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name - Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"` // Mode: "Auto", "Off" - MinAllowed map[string]string `protobuf:"bytes,3,rep,name=min_allowed,json=minAllowed,proto3" json:"min_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum allowed resources - MaxAllowed map[string]string `protobuf:"bytes,4,rep,name=max_allowed,json=maxAllowed,proto3" json:"max_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum allowed resources - ControlledResources []string `protobuf:"bytes,5,rep,name=controlled_resources,json=controlledResources,proto3" json:"controlled_resources,omitempty"` // Controlled resource types - ControlledValues string `protobuf:"bytes,6,opt,name=controlled_values,json=controlledValues,proto3" json:"controlled_values,omitempty"` // Controlled values: "RequestsAndLimits", "RequestsOnly" + ApiGroups []string `protobuf:"bytes,1,rep,name=api_groups,json=apiGroups,proto3" json:"api_groups,omitempty"` // API groups (e.g., "", "apps", "extensions") + Resources []string `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` // Resources (e.g., "pods", "deployments") + Verbs []string `protobuf:"bytes,3,rep,name=verbs,proto3" json:"verbs,omitempty"` // Verbs (e.g., "get", "list", "create", "update", "delete") + ResourceNames []string `protobuf:"bytes,4,rep,name=resource_names,json=resourceNames,proto3" json:"resource_names,omitempty"` // Specific resource names (optional) } -func (x *VPAContainerResourcePolicy) Reset() { - *x = VPAContainerResourcePolicy{} +func (x *RoleRule) Reset() { + *x = RoleRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[95] + mi := &file_api_v1_common_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAContainerResourcePolicy) String() string { +func (x *RoleRule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAContainerResourcePolicy) ProtoMessage() {} +func (*RoleRule) ProtoMessage() {} -func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[95] +func (x *RoleRule) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10669,79 +12267,66 @@ func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAContainerResourcePolicy.ProtoReflect.Descriptor instead. -func (*VPAContainerResourcePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{95} -} - -func (x *VPAContainerResourcePolicy) GetContainerName() string { - if x != nil { - return x.ContainerName - } - return "" -} - -func (x *VPAContainerResourcePolicy) GetMode() string { - if x != nil { - return x.Mode - } - return "" +// Deprecated: Use RoleRule.ProtoReflect.Descriptor instead. +func (*RoleRule) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{109} } -func (x *VPAContainerResourcePolicy) GetMinAllowed() map[string]string { +func (x *RoleRule) GetApiGroups() []string { if x != nil { - return x.MinAllowed + return x.ApiGroups } return nil } -func (x *VPAContainerResourcePolicy) GetMaxAllowed() map[string]string { +func (x *RoleRule) GetResources() []string { if x != nil { - return x.MaxAllowed + return x.Resources } return nil } -func (x *VPAContainerResourcePolicy) GetControlledResources() []string { +func (x *RoleRule) GetVerbs() []string { if x != nil { - return x.ControlledResources + return x.Verbs } return nil } -func (x *VPAContainerResourcePolicy) GetControlledValues() string { +func (x *RoleRule) GetResourceNames() []string { if x != nil { - return x.ControlledValues + return x.ResourceNames } - return "" + return nil } -// VPARecommendation represents VPA recommendations -type VPARecommendation struct { +// RoleBindingDetails contains detailed RoleBinding information for drill-down +type RoleBindingDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerRecommendations []*VPAContainerRecommendation `protobuf:"bytes,1,rep,name=container_recommendations,json=containerRecommendations,proto3" json:"container_recommendations,omitempty"` // Per-container recommendations + Subjects []*RoleBindingSubject `protobuf:"bytes,1,rep,name=subjects,proto3" json:"subjects,omitempty"` // Subjects that the role is bound to + RoleRef *RoleReference `protobuf:"bytes,2,opt,name=role_ref,json=roleRef,proto3" json:"role_ref,omitempty"` // Reference to the role being bound } -func (x *VPARecommendation) Reset() { - *x = VPARecommendation{} +func (x *RoleBindingDetails) Reset() { + *x = RoleBindingDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[96] + mi := &file_api_v1_common_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPARecommendation) String() string { +func (x *RoleBindingDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPARecommendation) ProtoMessage() {} +func (*RoleBindingDetails) ProtoMessage() {} -func (x *VPARecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[96] +func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10752,48 +12337,54 @@ func (x *VPARecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPARecommendation.ProtoReflect.Descriptor instead. -func (*VPARecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{96} +// Deprecated: Use RoleBindingDetails.ProtoReflect.Descriptor instead. +func (*RoleBindingDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{110} } -func (x *VPARecommendation) GetContainerRecommendations() []*VPAContainerRecommendation { +func (x *RoleBindingDetails) GetSubjects() []*RoleBindingSubject { if x != nil { - return x.ContainerRecommendations + return x.Subjects } return nil } -// VPAContainerRecommendation represents VPA recommendation for a container -type VPAContainerRecommendation struct { +func (x *RoleBindingDetails) GetRoleRef() *RoleReference { + if x != nil { + return x.RoleRef + } + return nil +} + +// RoleBindingSubject represents a subject in a role binding +type RoleBindingSubject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name - Target map[string]string `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Target recommendations - LowerBound map[string]string `protobuf:"bytes,3,rep,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Lower bound recommendations - UpperBound map[string]string `protobuf:"bytes,4,rep,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Upper bound recommendations - UncappedTarget map[string]string `protobuf:"bytes,5,rep,name=uncapped_target,json=uncappedTarget,proto3" json:"uncapped_target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Uncapped target recommendations + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Subject kind: "User", "Group", "ServiceAccount" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Subject name + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Subject namespace (for ServiceAccount) + ApiGroup string `protobuf:"bytes,4,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (optional) } -func (x *VPAContainerRecommendation) Reset() { - *x = VPAContainerRecommendation{} +func (x *RoleBindingSubject) Reset() { + *x = RoleBindingSubject{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[97] + mi := &file_api_v1_common_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAContainerRecommendation) String() string { +func (x *RoleBindingSubject) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAContainerRecommendation) ProtoMessage() {} +func (*RoleBindingSubject) ProtoMessage() {} -func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[97] +func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10804,76 +12395,136 @@ func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAContainerRecommendation.ProtoReflect.Descriptor instead. -func (*VPAContainerRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{97} +// Deprecated: Use RoleBindingSubject.ProtoReflect.Descriptor instead. +func (*RoleBindingSubject) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{111} } -func (x *VPAContainerRecommendation) GetContainerName() string { +func (x *RoleBindingSubject) GetKind() string { if x != nil { - return x.ContainerName + return x.Kind } return "" } -func (x *VPAContainerRecommendation) GetTarget() map[string]string { +func (x *RoleBindingSubject) GetName() string { if x != nil { - return x.Target + return x.Name } - return nil + return "" } -func (x *VPAContainerRecommendation) GetLowerBound() map[string]string { +func (x *RoleBindingSubject) GetNamespace() string { if x != nil { - return x.LowerBound + return x.Namespace } - return nil + return "" } -func (x *VPAContainerRecommendation) GetUpperBound() map[string]string { +func (x *RoleBindingSubject) GetApiGroup() string { if x != nil { - return x.UpperBound + return x.ApiGroup } - return nil + return "" } -func (x *VPAContainerRecommendation) GetUncappedTarget() map[string]string { +// RoleReference represents a reference to a role in a role binding +type RoleReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Role kind: "Role", "ClusterRole" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Role name + ApiGroup string `protobuf:"bytes,3,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (typically "rbac.authorization.k8s.io") +} + +func (x *RoleReference) Reset() { + *x = RoleReference{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoleReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoleReference) ProtoMessage() {} + +func (x *RoleReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[112] + 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 RoleReference.ProtoReflect.Descriptor instead. +func (*RoleReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{112} +} + +func (x *RoleReference) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *RoleReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RoleReference) GetApiGroup() string { if x != nil { - return x.UncappedTarget + return x.ApiGroup } - return nil + return "" } -// VPACondition represents a VPA condition -type VPACondition struct { +// KedaScaledObjectDetails contains detailed KEDA ScaledObject information +type KedaScaledObjectDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "RecommendationProvided", "LowConfidence", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` // Name of the scale target + TargetKind string `protobuf:"bytes,2,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"` // Kind of the scale target (e.g., "Deployment") + MinReplicas int32 `protobuf:"varint,3,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum number of replicas + MaxReplicas int32 `protobuf:"varint,4,opt,name=max_replicas,json=maxReplicas,proto3" json:"max_replicas,omitempty"` // Maximum number of replicas + CurrentReplicas int32 `protobuf:"varint,5,opt,name=current_replicas,json=currentReplicas,proto3" json:"current_replicas,omitempty"` // Current number of replicas + Triggers []*KedaScaledObjectTrigger `protobuf:"bytes,6,rep,name=triggers,proto3" json:"triggers,omitempty"` // List of scaling triggers + Conditions []*KedaScaledObjectCondition `protobuf:"bytes,7,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Active", "Unknown" } -func (x *VPACondition) Reset() { - *x = VPACondition{} +func (x *KedaScaledObjectDetails) Reset() { + *x = KedaScaledObjectDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[98] + mi := &file_api_v1_common_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPACondition) String() string { +func (x *KedaScaledObjectDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPACondition) ProtoMessage() {} +func (*KedaScaledObjectDetails) ProtoMessage() {} -func (x *VPACondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[98] +func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10884,72 +12535,94 @@ func (x *VPACondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPACondition.ProtoReflect.Descriptor instead. -func (*VPACondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{98} +// Deprecated: Use KedaScaledObjectDetails.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{113} } -func (x *VPACondition) GetType() string { +func (x *KedaScaledObjectDetails) GetTargetName() string { if x != nil { - return x.Type + return x.TargetName } return "" } -func (x *VPACondition) GetStatus() string { +func (x *KedaScaledObjectDetails) GetTargetKind() string { if x != nil { - return x.Status + return x.TargetKind } return "" } -func (x *VPACondition) GetReason() string { +func (x *KedaScaledObjectDetails) GetMinReplicas() int32 { if x != nil { - return x.Reason + return x.MinReplicas } - return "" + return 0 } -func (x *VPACondition) GetMessage() string { +func (x *KedaScaledObjectDetails) GetMaxReplicas() int32 { if x != nil { - return x.Message + return x.MaxReplicas } - return "" + return 0 } -func (x *VPACondition) GetLastTransitionTime() int64 { +func (x *KedaScaledObjectDetails) GetCurrentReplicas() int32 { if x != nil { - return x.LastTransitionTime + return x.CurrentReplicas } return 0 } -// LimitRangeDetails contains detailed LimitRange information for drill-down -type LimitRangeDetails struct { +func (x *KedaScaledObjectDetails) GetTriggers() []*KedaScaledObjectTrigger { + if x != nil { + return x.Triggers + } + return nil +} + +func (x *KedaScaledObjectDetails) GetConditions() []*KedaScaledObjectCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *KedaScaledObjectDetails) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +// KedaScaledObjectTrigger represents a scaling trigger +type KedaScaledObjectTrigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Limits []*LimitRangeItem `protobuf:"bytes,1,rep,name=limits,proto3" json:"limits,omitempty"` // Limit range items + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Trigger type (e.g., "cpu", "memory", "prometheus") + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Trigger-specific metadata } -func (x *LimitRangeDetails) Reset() { - *x = LimitRangeDetails{} +func (x *KedaScaledObjectTrigger) Reset() { + *x = KedaScaledObjectTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[99] + mi := &file_api_v1_common_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LimitRangeDetails) String() string { +func (x *KedaScaledObjectTrigger) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LimitRangeDetails) ProtoMessage() {} +func (*KedaScaledObjectTrigger) ProtoMessage() {} -func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[99] +func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10960,49 +12633,55 @@ func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LimitRangeDetails.ProtoReflect.Descriptor instead. -func (*LimitRangeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{99} +// Deprecated: Use KedaScaledObjectTrigger.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectTrigger) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{114} } -func (x *LimitRangeDetails) GetLimits() []*LimitRangeItem { +func (x *KedaScaledObjectTrigger) GetType() string { if x != nil { - return x.Limits + return x.Type + } + return "" +} + +func (x *KedaScaledObjectTrigger) GetMetadata() map[string]string { + if x != nil { + return x.Metadata } return nil } -// LimitRangeItem represents a single limit range item -type LimitRangeItem struct { +// KedaScaledObjectCondition represents a condition of a KEDA ScaledObject +type KedaScaledObjectCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Type: "Container", "Pod", "PersistentVolumeClaim" - DefaultLimits map[string]string `protobuf:"bytes,2,rep,name=default_limits,json=defaultLimits,proto3" json:"default_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default limits - DefaultRequest map[string]string `protobuf:"bytes,3,rep,name=default_request,json=defaultRequest,proto3" json:"default_request,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default requests - Max map[string]string `protobuf:"bytes,4,rep,name=max,proto3" json:"max,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum limits - Min map[string]string `protobuf:"bytes,5,rep,name=min,proto3" json:"min,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum limits - MaxLimitRequestRatio map[string]string `protobuf:"bytes,6,rep,name=max_limit_request_ratio,json=maxLimitRequestRatio,proto3" json:"max_limit_request_ratio,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Max limit/request ratio + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Active") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *LimitRangeItem) Reset() { - *x = LimitRangeItem{} +func (x *KedaScaledObjectCondition) Reset() { + *x = KedaScaledObjectCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[100] + mi := &file_api_v1_common_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LimitRangeItem) String() string { +func (x *KedaScaledObjectCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LimitRangeItem) ProtoMessage() {} +func (*KedaScaledObjectCondition) ProtoMessage() {} -func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[100] +func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11013,151 +12692,188 @@ func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LimitRangeItem.ProtoReflect.Descriptor instead. -func (*LimitRangeItem) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{100} +// Deprecated: Use KedaScaledObjectCondition.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{115} } -func (x *LimitRangeItem) GetType() string { +func (x *KedaScaledObjectCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *LimitRangeItem) GetDefaultLimits() map[string]string { - if x != nil { - return x.DefaultLimits - } - return nil -} - -func (x *LimitRangeItem) GetDefaultRequest() map[string]string { +func (x *KedaScaledObjectCondition) GetStatus() string { if x != nil { - return x.DefaultRequest + return x.Status } - return nil + return "" } -func (x *LimitRangeItem) GetMax() map[string]string { +func (x *KedaScaledObjectCondition) GetReason() string { if x != nil { - return x.Max + return x.Reason } - return nil + return "" } -func (x *LimitRangeItem) GetMin() map[string]string { +func (x *KedaScaledObjectCondition) GetMessage() string { if x != nil { - return x.Min + return x.Message } - return nil + return "" } -func (x *LimitRangeItem) GetMaxLimitRequestRatio() map[string]string { +func (x *KedaScaledObjectCondition) GetLastTransitionTime() int64 { if x != nil { - return x.MaxLimitRequestRatio + return x.LastTransitionTime } - return nil + return 0 } -// ServiceAccountDetails contains detailed ServiceAccount information for drill-down -type ServiceAccountDetails struct { +// KarpenterResourceDetails contains detailed Karpenter resource information +type KarpenterResourceDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AutomountServiceAccountToken bool `protobuf:"varint,1,opt,name=automount_service_account_token,json=automountServiceAccountToken,proto3" json:"automount_service_account_token,omitempty"` // Whether to automatically mount service account token - Secrets []string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty"` // Names of secrets referenced by this service account - ImagePullSecrets []string `protobuf:"bytes,3,rep,name=image_pull_secrets,json=imagePullSecrets,proto3" json:"image_pull_secrets,omitempty"` // Names of image pull secrets - ResourceVersion string `protobuf:"bytes,4,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` // Type of Karpenter resource (NodePool, NodeClaim, Provisioner) + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Available", "Unknown" + Conditions []*KarpenterResourceCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + Capacity *KarpenterCapacity `protobuf:"bytes,4,opt,name=capacity,proto3" json:"capacity,omitempty"` // Resource capacity (for NodePool/NodeClaim) + Requirements []*KarpenterRequirement `protobuf:"bytes,5,rep,name=requirements,proto3" json:"requirements,omitempty"` // Instance requirements (for NodePool) + NodeClassRef string `protobuf:"bytes,6,opt,name=node_class_ref,json=nodeClassRef,proto3" json:"node_class_ref,omitempty"` // Reference to NodeClass (for NodePool) + NodeName string `protobuf:"bytes,7,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Associated node name (for NodeClaim) + Limits map[string]string `protobuf:"bytes,8,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (for Provisioner) + KarpenterVersion string `protobuf:"bytes,9,opt,name=karpenter_version,json=karpenterVersion,proto3" json:"karpenter_version,omitempty"` // Karpenter version } -func (x *ServiceAccountDetails) Reset() { - *x = ServiceAccountDetails{} +func (x *KarpenterResourceDetails) Reset() { + *x = KarpenterResourceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[101] + mi := &file_api_v1_common_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServiceAccountDetails) String() string { +func (x *KarpenterResourceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceAccountDetails) ProtoMessage() {} - -func (x *ServiceAccountDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (*KarpenterResourceDetails) ProtoMessage() {} + +func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[116] + 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 KarpenterResourceDetails.ProtoReflect.Descriptor instead. +func (*KarpenterResourceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{116} +} + +func (x *KarpenterResourceDetails) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *KarpenterResourceDetails) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *KarpenterResourceDetails) GetConditions() []*KarpenterResourceCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *KarpenterResourceDetails) GetCapacity() *KarpenterCapacity { + if x != nil { + return x.Capacity } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ServiceAccountDetails.ProtoReflect.Descriptor instead. -func (*ServiceAccountDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{101} +func (x *KarpenterResourceDetails) GetRequirements() []*KarpenterRequirement { + if x != nil { + return x.Requirements + } + return nil } -func (x *ServiceAccountDetails) GetAutomountServiceAccountToken() bool { +func (x *KarpenterResourceDetails) GetNodeClassRef() string { if x != nil { - return x.AutomountServiceAccountToken + return x.NodeClassRef } - return false + return "" } -func (x *ServiceAccountDetails) GetSecrets() []string { +func (x *KarpenterResourceDetails) GetNodeName() string { if x != nil { - return x.Secrets + return x.NodeName } - return nil + return "" } -func (x *ServiceAccountDetails) GetImagePullSecrets() []string { +func (x *KarpenterResourceDetails) GetLimits() map[string]string { if x != nil { - return x.ImagePullSecrets + return x.Limits } return nil } -func (x *ServiceAccountDetails) GetResourceVersion() string { +func (x *KarpenterResourceDetails) GetKarpenterVersion() string { if x != nil { - return x.ResourceVersion + return x.KarpenterVersion } return "" } -// RoleDetails contains detailed Role information for drill-down -type RoleDetails struct { +// KarpenterResourceCondition represents a condition of a Karpenter resource +type KarpenterResourceCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rules []*RoleRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Role rules defining permissions + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Available") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *RoleDetails) Reset() { - *x = RoleDetails{} +func (x *KarpenterResourceCondition) Reset() { + *x = KarpenterResourceCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[102] + mi := &file_api_v1_common_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleDetails) String() string { +func (x *KarpenterResourceCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleDetails) ProtoMessage() {} +func (*KarpenterResourceCondition) ProtoMessage() {} -func (x *RoleDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[102] +func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11168,47 +12884,74 @@ func (x *RoleDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleDetails.ProtoReflect.Descriptor instead. -func (*RoleDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{102} +// Deprecated: Use KarpenterResourceCondition.ProtoReflect.Descriptor instead. +func (*KarpenterResourceCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{117} } -func (x *RoleDetails) GetRules() []*RoleRule { +func (x *KarpenterResourceCondition) GetType() string { if x != nil { - return x.Rules + return x.Type } - return nil + return "" } -// RoleRule represents a single role rule -type RoleRule struct { +func (x *KarpenterResourceCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *KarpenterResourceCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *KarpenterResourceCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *KarpenterResourceCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime + } + return 0 +} + +// KarpenterCapacity represents capacity information +type KarpenterCapacity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiGroups []string `protobuf:"bytes,1,rep,name=api_groups,json=apiGroups,proto3" json:"api_groups,omitempty"` // API groups (e.g., "", "apps", "extensions") - Resources []string `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` // Resources (e.g., "pods", "deployments") - Verbs []string `protobuf:"bytes,3,rep,name=verbs,proto3" json:"verbs,omitempty"` // Verbs (e.g., "get", "list", "create", "update", "delete") - ResourceNames []string `protobuf:"bytes,4,rep,name=resource_names,json=resourceNames,proto3" json:"resource_names,omitempty"` // Specific resource names (optional) + Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` // CPU capacity (e.g., "4") + Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` // Memory capacity (e.g., "16Gi") + Other map[string]string `protobuf:"bytes,3,rep,name=other,proto3" json:"other,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Other resource capacities } -func (x *RoleRule) Reset() { - *x = RoleRule{} +func (x *KarpenterCapacity) Reset() { + *x = KarpenterCapacity{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[103] + mi := &file_api_v1_common_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleRule) String() string { +func (x *KarpenterCapacity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleRule) ProtoMessage() {} +func (*KarpenterCapacity) ProtoMessage() {} -func (x *RoleRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[103] +func (x *KarpenterCapacity) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11219,66 +12962,60 @@ func (x *RoleRule) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleRule.ProtoReflect.Descriptor instead. -func (*RoleRule) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{103} -} - -func (x *RoleRule) GetApiGroups() []string { - if x != nil { - return x.ApiGroups - } - return nil +// Deprecated: Use KarpenterCapacity.ProtoReflect.Descriptor instead. +func (*KarpenterCapacity) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{118} } -func (x *RoleRule) GetResources() []string { +func (x *KarpenterCapacity) GetCpu() string { if x != nil { - return x.Resources + return x.Cpu } - return nil + return "" } -func (x *RoleRule) GetVerbs() []string { +func (x *KarpenterCapacity) GetMemory() string { if x != nil { - return x.Verbs + return x.Memory } - return nil + return "" } -func (x *RoleRule) GetResourceNames() []string { +func (x *KarpenterCapacity) GetOther() map[string]string { if x != nil { - return x.ResourceNames + return x.Other } return nil } -// RoleBindingDetails contains detailed RoleBinding information for drill-down -type RoleBindingDetails struct { +// KarpenterRequirement represents an instance requirement +type KarpenterRequirement struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Subjects []*RoleBindingSubject `protobuf:"bytes,1,rep,name=subjects,proto3" json:"subjects,omitempty"` // Subjects that the role is bound to - RoleRef *RoleReference `protobuf:"bytes,2,opt,name=role_ref,json=roleRef,proto3" json:"role_ref,omitempty"` // Reference to the role being bound + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Requirement key (e.g., "node.kubernetes.io/instance-type") + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // Operator (e.g., "In", "NotIn", "Exists") + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Requirement values } -func (x *RoleBindingDetails) Reset() { - *x = RoleBindingDetails{} +func (x *KarpenterRequirement) Reset() { + *x = KarpenterRequirement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[104] + mi := &file_api_v1_common_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleBindingDetails) String() string { +func (x *KarpenterRequirement) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleBindingDetails) ProtoMessage() {} +func (*KarpenterRequirement) ProtoMessage() {} -func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[104] +func (x *KarpenterRequirement) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11289,54 +13026,59 @@ func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleBindingDetails.ProtoReflect.Descriptor instead. -func (*RoleBindingDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{104} +// Deprecated: Use KarpenterRequirement.ProtoReflect.Descriptor instead. +func (*KarpenterRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{119} } -func (x *RoleBindingDetails) GetSubjects() []*RoleBindingSubject { +func (x *KarpenterRequirement) GetKey() string { if x != nil { - return x.Subjects + return x.Key } - return nil + return "" } -func (x *RoleBindingDetails) GetRoleRef() *RoleReference { +func (x *KarpenterRequirement) GetOperator() string { if x != nil { - return x.RoleRef + return x.Operator + } + return "" +} + +func (x *KarpenterRequirement) GetValues() []string { + if x != nil { + return x.Values } return nil } -// RoleBindingSubject represents a subject in a role binding -type RoleBindingSubject struct { +// ResourceFieldFilter filters resources on a single field; values are OR'd together. +type ResourceFieldFilter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Subject kind: "User", "Group", "ServiceAccount" - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Subject name - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Subject namespace (for ServiceAccount) - ApiGroup string `protobuf:"bytes,4,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (optional) + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` // e.g. "type", "class", "kind", "namespace" + Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` // OR'd together } -func (x *RoleBindingSubject) Reset() { - *x = RoleBindingSubject{} +func (x *ResourceFieldFilter) Reset() { + *x = ResourceFieldFilter{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[105] + mi := &file_api_v1_common_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleBindingSubject) String() string { +func (x *ResourceFieldFilter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleBindingSubject) ProtoMessage() {} +func (*ResourceFieldFilter) ProtoMessage() {} -func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[105] +func (x *ResourceFieldFilter) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11347,67 +13089,54 @@ func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleBindingSubject.ProtoReflect.Descriptor instead. -func (*RoleBindingSubject) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{105} -} - -func (x *RoleBindingSubject) GetKind() string { - if x != nil { - return x.Kind - } - return "" -} - -func (x *RoleBindingSubject) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use ResourceFieldFilter.ProtoReflect.Descriptor instead. +func (*ResourceFieldFilter) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{120} } -func (x *RoleBindingSubject) GetNamespace() string { +func (x *ResourceFieldFilter) GetField() string { if x != nil { - return x.Namespace + return x.Field } return "" } -func (x *RoleBindingSubject) GetApiGroup() string { +func (x *ResourceFieldFilter) GetValues() []string { if x != nil { - return x.ApiGroup + return x.Values } - return "" + return nil } -// RoleReference represents a reference to a role in a role binding -type RoleReference struct { +// ResourceFilterFieldOptions describes the distinct values available for a filterable field. +type ResourceFilterFieldOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Role kind: "Role", "ClusterRole" - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Role name - ApiGroup string `protobuf:"bytes,3,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (typically "rbac.authorization.k8s.io") + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` + Truncated bool `protobuf:"varint,4,opt,name=truncated,proto3" json:"truncated,omitempty"` // true when the value list was capped and is incomplete } - -func (x *RoleReference) Reset() { - *x = RoleReference{} + +func (x *ResourceFilterFieldOptions) Reset() { + *x = ResourceFilterFieldOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[106] + mi := &file_api_v1_common_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleReference) String() string { +func (x *ResourceFilterFieldOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleReference) ProtoMessage() {} +func (*ResourceFilterFieldOptions) ProtoMessage() {} -func (x *RoleReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[106] +func (x *ResourceFilterFieldOptions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11418,65 +13147,84 @@ func (x *RoleReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleReference.ProtoReflect.Descriptor instead. -func (*RoleReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{106} +// Deprecated: Use ResourceFilterFieldOptions.ProtoReflect.Descriptor instead. +func (*ResourceFilterFieldOptions) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{121} } -func (x *RoleReference) GetKind() string { +func (x *ResourceFilterFieldOptions) GetField() string { if x != nil { - return x.Kind + return x.Field } return "" } -func (x *RoleReference) GetName() string { +func (x *ResourceFilterFieldOptions) GetLabel() string { if x != nil { - return x.Name + return x.Label } return "" } -func (x *RoleReference) GetApiGroup() string { +func (x *ResourceFilterFieldOptions) GetValues() []string { if x != nil { - return x.ApiGroup + return x.Values } - return "" + return nil } -// KedaScaledObjectDetails contains detailed KEDA ScaledObject information -type KedaScaledObjectDetails struct { +func (x *ResourceFilterFieldOptions) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +// WorkloadFilters provides optional filters for narrowing the GetWorkloads request. +// All fields are optional. When multiple fields are provided, they are ANDed together. +type WorkloadFilters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` // Name of the scale target - TargetKind string `protobuf:"bytes,2,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"` // Kind of the scale target (e.g., "Deployment") - MinReplicas int32 `protobuf:"varint,3,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum number of replicas - MaxReplicas int32 `protobuf:"varint,4,opt,name=max_replicas,json=maxReplicas,proto3" json:"max_replicas,omitempty"` // Maximum number of replicas - CurrentReplicas int32 `protobuf:"varint,5,opt,name=current_replicas,json=currentReplicas,proto3" json:"current_replicas,omitempty"` // Current number of replicas - Triggers []*KedaScaledObjectTrigger `protobuf:"bytes,6,rep,name=triggers,proto3" json:"triggers,omitempty"` // List of scaling triggers - Conditions []*KedaScaledObjectCondition `protobuf:"bytes,7,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions - Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Active", "Unknown" + // Targeting criteria (AND logic between non-null fields) + NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels + KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds + // Match workloads with at least one container detected as one of these + // languages (e.g. "python", "go", "java"). ANY container matching is + // sufficient — containers do not all need to match. + LanguageFilter []string `protobuf:"bytes,17,rep,name=language_filter,json=languageFilter,proto3" json:"language_filter,omitempty"` + // Exact detected version strings (e.g. "3.11.4"). Only meaningful when + // language_filter is also set; ignored otherwise. + LanguageVersionFilter []string `protobuf:"bytes,18,rep,name=language_version_filter,json=languageVersionFilter,proto3" json:"language_version_filter,omitempty"` + NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes + NamespaceNames []string `protobuf:"bytes,22,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` // Target workloads in any of these namespaces by exact name (OR'd together; ANDed with other filter fields; no-op when empty) + NamespacePattern *RegexPattern `protobuf:"bytes,23,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Lifecycle status filter (overrides legacy show_deleted when set) + Status WorkloadStatusFilter `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.WorkloadStatusFilter" json:"status,omitempty"` // ACTIVE, DELETED, or BOTH } -func (x *KedaScaledObjectDetails) Reset() { - *x = KedaScaledObjectDetails{} +func (x *WorkloadFilters) Reset() { + *x = WorkloadFilters{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[107] + mi := &file_api_v1_common_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectDetails) String() string { +func (x *WorkloadFilters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectDetails) ProtoMessage() {} +func (*WorkloadFilters) ProtoMessage() {} -func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[107] +func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11487,94 +13235,129 @@ func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectDetails.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{107} +// Deprecated: Use WorkloadFilters.ProtoReflect.Descriptor instead. +func (*WorkloadFilters) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{122} } -func (x *KedaScaledObjectDetails) GetTargetName() string { +func (x *WorkloadFilters) GetNamespaceSelector() *LabelSelector { if x != nil { - return x.TargetName + return x.NamespaceSelector } - return "" + return nil } -func (x *KedaScaledObjectDetails) GetTargetKind() string { +func (x *WorkloadFilters) GetWorkloadSelector() *LabelSelector { if x != nil { - return x.TargetKind + return x.WorkloadSelector } - return "" + return nil } -func (x *KedaScaledObjectDetails) GetMinReplicas() int32 { +func (x *WorkloadFilters) GetKindFilter() []K8SObjectKind { if x != nil { - return x.MinReplicas + return x.KindFilter } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetMaxReplicas() int32 { +func (x *WorkloadFilters) GetNamePattern() *RegexPattern { if x != nil { - return x.MaxReplicas + return x.NamePattern } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetCurrentReplicas() int32 { +func (x *WorkloadFilters) GetAnnotationSelector() *LabelSelector { if x != nil { - return x.CurrentReplicas + return x.AnnotationSelector } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetTriggers() []*KedaScaledObjectTrigger { +func (x *WorkloadFilters) GetWorkloadNames() []string { if x != nil { - return x.Triggers + return x.WorkloadNames } return nil } -func (x *KedaScaledObjectDetails) GetConditions() []*KedaScaledObjectCondition { +func (x *WorkloadFilters) GetLanguageFilter() []string { if x != nil { - return x.Conditions + return x.LanguageFilter } return nil } -func (x *KedaScaledObjectDetails) GetStatus() string { +func (x *WorkloadFilters) GetLanguageVersionFilter() []string { + if x != nil { + return x.LanguageVersionFilter + } + return nil +} + +func (x *WorkloadFilters) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *WorkloadFilters) GetNamespaceNames() []string { + if x != nil { + return x.NamespaceNames + } + return nil +} + +func (x *WorkloadFilters) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *WorkloadFilters) GetStatus() WorkloadStatusFilter { if x != nil { return x.Status } - return "" + return WorkloadStatusFilter_WORKLOAD_STATUS_FILTER_UNSPECIFIED } -// KedaScaledObjectTrigger represents a scaling trigger -type KedaScaledObjectTrigger struct { +// PodDisruptionBudgetDetails contains detailed PodDisruptionBudget information +type PodDisruptionBudgetDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Trigger type (e.g., "cpu", "memory", "prometheus") - Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Trigger-specific metadata + MinAvailable int32 `protobuf:"varint,1,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum number of pods that should be available + MaxUnavailable int32 `protobuf:"varint,2,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // Maximum number of pods that can be unavailable + CurrentHealthy int32 `protobuf:"varint,3,opt,name=current_healthy,json=currentHealthy,proto3" json:"current_healthy,omitempty"` // Current number of healthy pods + DesiredHealthy int32 `protobuf:"varint,4,opt,name=desired_healthy,json=desiredHealthy,proto3" json:"desired_healthy,omitempty"` // Desired number of healthy pods + DisruptionsAllowed int32 `protobuf:"varint,5,opt,name=disruptions_allowed,json=disruptionsAllowed,proto3" json:"disruptions_allowed,omitempty"` // Number of disruptions currently allowed + ExpectedPods int32 `protobuf:"varint,6,opt,name=expected_pods,json=expectedPods,proto3" json:"expected_pods,omitempty"` // Expected number of pods + Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Healthy", "Disrupted", "Unknown" + SelectorLabels map[string]string `protobuf:"bytes,8,rep,name=selector_labels,json=selectorLabels,proto3" json:"selector_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector for target pods + Conditions []*PodDisruptionBudgetCondition `protobuf:"bytes,9,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions } -func (x *KedaScaledObjectTrigger) Reset() { - *x = KedaScaledObjectTrigger{} +func (x *PodDisruptionBudgetDetails) Reset() { + *x = PodDisruptionBudgetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[108] + mi := &file_api_v1_common_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectTrigger) String() string { +func (x *PodDisruptionBudgetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectTrigger) ProtoMessage() {} +func (*PodDisruptionBudgetDetails) ProtoMessage() {} -func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[108] +func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11585,55 +13368,104 @@ func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectTrigger.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectTrigger) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{108} +// Deprecated: Use PodDisruptionBudgetDetails.ProtoReflect.Descriptor instead. +func (*PodDisruptionBudgetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{123} } -func (x *KedaScaledObjectTrigger) GetType() string { +func (x *PodDisruptionBudgetDetails) GetMinAvailable() int32 { if x != nil { - return x.Type + return x.MinAvailable + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetMaxUnavailable() int32 { + if x != nil { + return x.MaxUnavailable + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetCurrentHealthy() int32 { + if x != nil { + return x.CurrentHealthy + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetDesiredHealthy() int32 { + if x != nil { + return x.DesiredHealthy + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetDisruptionsAllowed() int32 { + if x != nil { + return x.DisruptionsAllowed + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetExpectedPods() int32 { + if x != nil { + return x.ExpectedPods + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (x *KedaScaledObjectTrigger) GetMetadata() map[string]string { +func (x *PodDisruptionBudgetDetails) GetSelectorLabels() map[string]string { if x != nil { - return x.Metadata + return x.SelectorLabels } return nil } -// KedaScaledObjectCondition represents a condition of a KEDA ScaledObject -type KedaScaledObjectCondition struct { +func (x *PodDisruptionBudgetDetails) GetConditions() []*PodDisruptionBudgetCondition { + if x != nil { + return x.Conditions + } + return nil +} + +// PodDisruptionBudgetCondition represents a condition of a PodDisruptionBudget +type PodDisruptionBudgetCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Active") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "DisruptionAllowed") Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *KedaScaledObjectCondition) Reset() { - *x = KedaScaledObjectCondition{} +func (x *PodDisruptionBudgetCondition) Reset() { + *x = PodDisruptionBudgetCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[109] + mi := &file_api_v1_common_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectCondition) String() string { +func (x *PodDisruptionBudgetCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectCondition) ProtoMessage() {} +func (*PodDisruptionBudgetCondition) ProtoMessage() {} -func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[109] +func (x *PodDisruptionBudgetCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11644,80 +13476,77 @@ func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectCondition.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{109} +// Deprecated: Use PodDisruptionBudgetCondition.ProtoReflect.Descriptor instead. +func (*PodDisruptionBudgetCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{124} } -func (x *KedaScaledObjectCondition) GetType() string { +func (x *PodDisruptionBudgetCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *KedaScaledObjectCondition) GetStatus() string { +func (x *PodDisruptionBudgetCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *KedaScaledObjectCondition) GetReason() string { +func (x *PodDisruptionBudgetCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *KedaScaledObjectCondition) GetMessage() string { +func (x *PodDisruptionBudgetCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *KedaScaledObjectCondition) GetLastTransitionTime() int64 { +func (x *PodDisruptionBudgetCondition) GetLastTransitionTime() int64 { if x != nil { return x.LastTransitionTime } return 0 } -// KarpenterResourceDetails contains detailed Karpenter resource information -type KarpenterResourceDetails struct { +// ResourceQuotaDetails contains detailed ResourceQuota information +type ResourceQuotaDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` // Type of Karpenter resource (NodePool, NodeClaim, Provisioner) - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Available", "Unknown" - Conditions []*KarpenterResourceCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions - Capacity *KarpenterCapacity `protobuf:"bytes,4,opt,name=capacity,proto3" json:"capacity,omitempty"` // Resource capacity (for NodePool/NodeClaim) - Requirements []*KarpenterRequirement `protobuf:"bytes,5,rep,name=requirements,proto3" json:"requirements,omitempty"` // Instance requirements (for NodePool) - NodeClassRef string `protobuf:"bytes,6,opt,name=node_class_ref,json=nodeClassRef,proto3" json:"node_class_ref,omitempty"` // Reference to NodeClass (for NodePool) - NodeName string `protobuf:"bytes,7,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Associated node name (for NodeClaim) - Limits map[string]string `protobuf:"bytes,8,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (for Provisioner) - KarpenterVersion string `protobuf:"bytes,9,opt,name=karpenter_version,json=karpenterVersion,proto3" json:"karpenter_version,omitempty"` // Karpenter version + HardLimits map[string]string `protobuf:"bytes,1,rep,name=hard_limits,json=hardLimits,proto3" json:"hard_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Hard resource limits (e.g., "requests.cpu": "4", "requests.memory": "8Gi") + Used map[string]string `protobuf:"bytes,2,rep,name=used,proto3" json:"used,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Currently used resources + Scopes []string `protobuf:"bytes,3,rep,name=scopes,proto3" json:"scopes,omitempty"` // Quota scopes: ["BestEffort", "NotBestEffort", "NotTerminating", "Terminating"] + ScopeSelector map[string]string `protobuf:"bytes,4,rep,name=scope_selector,json=scopeSelector,proto3" json:"scope_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Scope selector match labels + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Valid", "Invalid", "Unknown" + Conditions []*ResourceQuotaCondition `protobuf:"bytes,6,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions } -func (x *KarpenterResourceDetails) Reset() { - *x = KarpenterResourceDetails{} +func (x *ResourceQuotaDetails) Reset() { + *x = ResourceQuotaDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[110] + mi := &file_api_v1_common_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterResourceDetails) String() string { +func (x *ResourceQuotaDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterResourceDetails) ProtoMessage() {} +func (*ResourceQuotaDetails) ProtoMessage() {} -func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[110] +func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11728,104 +13557,83 @@ func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterResourceDetails.ProtoReflect.Descriptor instead. -func (*KarpenterResourceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{110} -} - -func (x *KarpenterResourceDetails) GetResourceType() string { - if x != nil { - return x.ResourceType - } - return "" -} - -func (x *KarpenterResourceDetails) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use ResourceQuotaDetails.ProtoReflect.Descriptor instead. +func (*ResourceQuotaDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{125} } -func (x *KarpenterResourceDetails) GetConditions() []*KarpenterResourceCondition { +func (x *ResourceQuotaDetails) GetHardLimits() map[string]string { if x != nil { - return x.Conditions + return x.HardLimits } return nil } -func (x *KarpenterResourceDetails) GetCapacity() *KarpenterCapacity { +func (x *ResourceQuotaDetails) GetUsed() map[string]string { if x != nil { - return x.Capacity + return x.Used } return nil } -func (x *KarpenterResourceDetails) GetRequirements() []*KarpenterRequirement { +func (x *ResourceQuotaDetails) GetScopes() []string { if x != nil { - return x.Requirements + return x.Scopes } return nil } -func (x *KarpenterResourceDetails) GetNodeClassRef() string { +func (x *ResourceQuotaDetails) GetScopeSelector() map[string]string { if x != nil { - return x.NodeClassRef + return x.ScopeSelector } - return "" + return nil } -func (x *KarpenterResourceDetails) GetNodeName() string { +func (x *ResourceQuotaDetails) GetStatus() string { if x != nil { - return x.NodeName + return x.Status } return "" } -func (x *KarpenterResourceDetails) GetLimits() map[string]string { +func (x *ResourceQuotaDetails) GetConditions() []*ResourceQuotaCondition { if x != nil { - return x.Limits + return x.Conditions } return nil } -func (x *KarpenterResourceDetails) GetKarpenterVersion() string { - if x != nil { - return x.KarpenterVersion - } - return "" -} - -// KarpenterResourceCondition represents a condition of a Karpenter resource -type KarpenterResourceCondition struct { +// ResourceQuotaCondition represents a condition of a ResourceQuota +type ResourceQuotaCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Available") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (typically not used in core/v1) Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *KarpenterResourceCondition) Reset() { - *x = KarpenterResourceCondition{} +func (x *ResourceQuotaCondition) Reset() { + *x = ResourceQuotaCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[111] + mi := &file_api_v1_common_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterResourceCondition) String() string { +func (x *ResourceQuotaCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterResourceCondition) ProtoMessage() {} +func (*ResourceQuotaCondition) ProtoMessage() {} -func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[111] +func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11836,74 +13644,78 @@ func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterResourceCondition.ProtoReflect.Descriptor instead. -func (*KarpenterResourceCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{111} +// Deprecated: Use ResourceQuotaCondition.ProtoReflect.Descriptor instead. +func (*ResourceQuotaCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{126} } -func (x *KarpenterResourceCondition) GetType() string { +func (x *ResourceQuotaCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *KarpenterResourceCondition) GetStatus() string { +func (x *ResourceQuotaCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *KarpenterResourceCondition) GetReason() string { +func (x *ResourceQuotaCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *KarpenterResourceCondition) GetMessage() string { +func (x *ResourceQuotaCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *KarpenterResourceCondition) GetLastTransitionTime() int64 { +func (x *ResourceQuotaCondition) GetLastTransitionTime() int64 { if x != nil { return x.LastTransitionTime } return 0 } -// KarpenterCapacity represents capacity information -type KarpenterCapacity struct { +// VolcanoJobDetails contains detailed VolcanoJob information for drill-down +type VolcanoJobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` // CPU capacity (e.g., "4") - Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` // Memory capacity (e.g., "16Gi") - Other map[string]string `protobuf:"bytes,3,rep,name=other,proto3" json:"other,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Other resource capacities + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*VolcanoJobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // VolcanoJob conditions for debugging + Queue string `protobuf:"bytes,3,opt,name=queue,proto3" json:"queue,omitempty"` // Queue name for scheduling + MinAvailable int32 `protobuf:"varint,4,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum available pods + SchedulePolicy string `protobuf:"bytes,5,opt,name=schedule_policy,json=schedulePolicy,proto3" json:"schedule_policy,omitempty"` // Schedule policy name + PriorityClass string `protobuf:"bytes,6,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name + Tasks []*VolcanoTask `protobuf:"bytes,7,rep,name=tasks,proto3" json:"tasks,omitempty"` // Tasks in the job } -func (x *KarpenterCapacity) Reset() { - *x = KarpenterCapacity{} +func (x *VolcanoJobDetails) Reset() { + *x = VolcanoJobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[112] + mi := &file_api_v1_common_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterCapacity) String() string { +func (x *VolcanoJobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterCapacity) ProtoMessage() {} +func (*VolcanoJobDetails) ProtoMessage() {} -func (x *KarpenterCapacity) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[112] +func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11914,60 +13726,90 @@ func (x *KarpenterCapacity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterCapacity.ProtoReflect.Descriptor instead. -func (*KarpenterCapacity) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{112} +// Deprecated: Use VolcanoJobDetails.ProtoReflect.Descriptor instead. +func (*VolcanoJobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{127} } -func (x *KarpenterCapacity) GetCpu() string { +func (x *VolcanoJobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.Cpu + return x.Containers + } + return nil +} + +func (x *VolcanoJobDetails) GetConditions() []*VolcanoJobCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *VolcanoJobDetails) GetQueue() string { + if x != nil { + return x.Queue } return "" } -func (x *KarpenterCapacity) GetMemory() string { +func (x *VolcanoJobDetails) GetMinAvailable() int32 { if x != nil { - return x.Memory + return x.MinAvailable + } + return 0 +} + +func (x *VolcanoJobDetails) GetSchedulePolicy() string { + if x != nil { + return x.SchedulePolicy } return "" } -func (x *KarpenterCapacity) GetOther() map[string]string { +func (x *VolcanoJobDetails) GetPriorityClass() string { if x != nil { - return x.Other + return x.PriorityClass + } + return "" +} + +func (x *VolcanoJobDetails) GetTasks() []*VolcanoTask { + if x != nil { + return x.Tasks } return nil } -// KarpenterRequirement represents an instance requirement -type KarpenterRequirement struct { +// VolcanoJobCondition represents a volcano job condition +type VolcanoJobCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Requirement key (e.g., "node.kubernetes.io/instance-type") - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // Operator (e.g., "In", "NotIn", "Exists") - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Requirement values + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Pending", "Running", "Completed", "Failed", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *KarpenterRequirement) Reset() { - *x = KarpenterRequirement{} +func (x *VolcanoJobCondition) Reset() { + *x = VolcanoJobCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[113] + mi := &file_api_v1_common_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterRequirement) String() string { +func (x *VolcanoJobCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterRequirement) ProtoMessage() {} +func (*VolcanoJobCondition) ProtoMessage() {} -func (x *KarpenterRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[113] +func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11978,68 +13820,74 @@ func (x *KarpenterRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterRequirement.ProtoReflect.Descriptor instead. -func (*KarpenterRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{113} +// Deprecated: Use VolcanoJobCondition.ProtoReflect.Descriptor instead. +func (*VolcanoJobCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{128} } -func (x *KarpenterRequirement) GetKey() string { +func (x *VolcanoJobCondition) GetType() string { if x != nil { - return x.Key + return x.Type } return "" } -func (x *KarpenterRequirement) GetOperator() string { +func (x *VolcanoJobCondition) GetStatus() string { if x != nil { - return x.Operator + return x.Status } return "" } -func (x *KarpenterRequirement) GetValues() []string { +func (x *VolcanoJobCondition) GetReason() string { if x != nil { - return x.Values + return x.Reason + } + return "" +} + +func (x *VolcanoJobCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *VolcanoJobCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime } - return nil + return 0 } -// WorkloadFilters provides optional filters for narrowing the GetWorkloads request. -// All fields are optional. When multiple fields are provided, they are ANDed together. -type WorkloadFilters struct { +// VolcanoTask represents a task in a VolcanoJob +type VolcanoTask struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Targeting criteria (AND logic between non-null fields) - NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels - KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds - NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes - // Lifecycle status filter (overrides legacy show_deleted when set) - Status WorkloadStatusFilter `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.WorkloadStatusFilter" json:"status,omitempty"` // ACTIVE, DELETED, or BOTH + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Task name + Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` // Number of replicas + Containers []*ContainerTemplate `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates } -func (x *WorkloadFilters) Reset() { - *x = WorkloadFilters{} +func (x *VolcanoTask) Reset() { + *x = VolcanoTask{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[114] + mi := &file_api_v1_common_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadFilters) String() string { +func (x *VolcanoTask) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadFilters) ProtoMessage() {} +func (*VolcanoTask) ProtoMessage() {} -func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[114] +func (x *VolcanoTask) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12050,101 +13898,73 @@ func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadFilters.ProtoReflect.Descriptor instead. -func (*WorkloadFilters) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{114} -} - -func (x *WorkloadFilters) GetNamespaceSelector() *LabelSelector { - if x != nil { - return x.NamespaceSelector - } - return nil -} - -func (x *WorkloadFilters) GetWorkloadSelector() *LabelSelector { - if x != nil { - return x.WorkloadSelector - } - return nil -} - -func (x *WorkloadFilters) GetKindFilter() []K8SObjectKind { - if x != nil { - return x.KindFilter - } - return nil -} - -func (x *WorkloadFilters) GetNamePattern() *RegexPattern { - if x != nil { - return x.NamePattern - } - return nil +// Deprecated: Use VolcanoTask.ProtoReflect.Descriptor instead. +func (*VolcanoTask) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{129} } -func (x *WorkloadFilters) GetAnnotationSelector() *LabelSelector { +func (x *VolcanoTask) GetName() string { if x != nil { - return x.AnnotationSelector + return x.Name } - return nil + return "" } -func (x *WorkloadFilters) GetWorkloadNames() []string { +func (x *VolcanoTask) GetReplicas() int32 { if x != nil { - return x.WorkloadNames + return x.Replicas } - return nil + return 0 } -func (x *WorkloadFilters) GetNodeGroupNames() []string { +func (x *VolcanoTask) GetContainers() []*ContainerTemplate { if x != nil { - return x.NodeGroupNames + return x.Containers } return nil } -func (x *WorkloadFilters) GetStatus() WorkloadStatusFilter { - if x != nil { - return x.Status - } - return WorkloadStatusFilter_WORKLOAD_STATUS_FILTER_UNSPECIFIED -} - -// PodDisruptionBudgetDetails contains detailed PodDisruptionBudget information -type PodDisruptionBudgetDetails struct { +// SparkApplicationDetails contains detailed SparkApplication information for drill-down +type SparkApplicationDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinAvailable int32 `protobuf:"varint,1,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum number of pods that should be available - MaxUnavailable int32 `protobuf:"varint,2,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // Maximum number of pods that can be unavailable - CurrentHealthy int32 `protobuf:"varint,3,opt,name=current_healthy,json=currentHealthy,proto3" json:"current_healthy,omitempty"` // Current number of healthy pods - DesiredHealthy int32 `protobuf:"varint,4,opt,name=desired_healthy,json=desiredHealthy,proto3" json:"desired_healthy,omitempty"` // Desired number of healthy pods - DisruptionsAllowed int32 `protobuf:"varint,5,opt,name=disruptions_allowed,json=disruptionsAllowed,proto3" json:"disruptions_allowed,omitempty"` // Number of disruptions currently allowed - ExpectedPods int32 `protobuf:"varint,6,opt,name=expected_pods,json=expectedPods,proto3" json:"expected_pods,omitempty"` // Expected number of pods - Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Healthy", "Disrupted", "Unknown" - SelectorLabels map[string]string `protobuf:"bytes,8,rep,name=selector_labels,json=selectorLabels,proto3" json:"selector_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector for target pods - Conditions []*PodDisruptionBudgetCondition `protobuf:"bytes,9,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from driver/executor specs + SparkVersion string `protobuf:"bytes,2,opt,name=spark_version,json=sparkVersion,proto3" json:"spark_version,omitempty"` // Spark version + ApplicationType string `protobuf:"bytes,3,opt,name=application_type,json=applicationType,proto3" json:"application_type,omitempty"` // Java, Scala, Python, R + DeployMode string `protobuf:"bytes,4,opt,name=deploy_mode,json=deployMode,proto3" json:"deploy_mode,omitempty"` // cluster, client, in-cluster-client + MainClass string `protobuf:"bytes,5,opt,name=main_class,json=mainClass,proto3" json:"main_class,omitempty"` // Main class for Java/Scala applications + MainApplicationFile string `protobuf:"bytes,6,opt,name=main_application_file,json=mainApplicationFile,proto3" json:"main_application_file,omitempty"` // Main application file path + Arguments []string `protobuf:"bytes,7,rep,name=arguments,proto3" json:"arguments,omitempty"` // Application arguments + SparkDriverInfo *SparkDriverInfo `protobuf:"bytes,8,opt,name=spark_driver_info,json=sparkDriverInfo,proto3" json:"spark_driver_info,omitempty"` // Driver information + ExecutorInstances int32 `protobuf:"varint,9,opt,name=executor_instances,json=executorInstances,proto3" json:"executor_instances,omitempty"` // Number of executor instances (from spec.executor.instances) + ExecutorsReady int32 `protobuf:"varint,16,opt,name=executors_ready,json=executorsReady,proto3" json:"executors_ready,omitempty"` // Number of RUNNING executors (from status.executorState); only meaningful when app is running + ApplicationState string `protobuf:"bytes,10,opt,name=application_state,json=applicationState,proto3" json:"application_state,omitempty"` // Application state: SUBMITTED, RUNNING, COMPLETED, FAILED, etc. + SparkApplicationId string `protobuf:"bytes,11,opt,name=spark_application_id,json=sparkApplicationId,proto3" json:"spark_application_id,omitempty"` // Spark application ID + SubmissionId string `protobuf:"bytes,12,opt,name=submission_id,json=submissionId,proto3" json:"submission_id,omitempty"` // Submission ID + Suspended bool `protobuf:"varint,13,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether application is suspended + RestartPolicy *SparkRestartPolicyInfo `protobuf:"bytes,14,opt,name=restart_policy,json=restartPolicy,proto3" json:"restart_policy,omitempty"` // Restart policy information + DynamicAllocation *SparkDynamicAllocationInfo `protobuf:"bytes,15,opt,name=dynamic_allocation,json=dynamicAllocation,proto3" json:"dynamic_allocation,omitempty"` // Dynamic allocation configuration } -func (x *PodDisruptionBudgetDetails) Reset() { - *x = PodDisruptionBudgetDetails{} +func (x *SparkApplicationDetails) Reset() { + *x = SparkApplicationDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[115] + mi := &file_api_v1_common_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PodDisruptionBudgetDetails) String() string { +func (x *SparkApplicationDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PodDisruptionBudgetDetails) ProtoMessage() {} +func (*SparkApplicationDetails) ProtoMessage() {} -func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[115] +func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12155,185 +13975,157 @@ func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PodDisruptionBudgetDetails.ProtoReflect.Descriptor instead. -func (*PodDisruptionBudgetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{115} -} - -func (x *PodDisruptionBudgetDetails) GetMinAvailable() int32 { - if x != nil { - return x.MinAvailable - } - return 0 +// Deprecated: Use SparkApplicationDetails.ProtoReflect.Descriptor instead. +func (*SparkApplicationDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{130} } -func (x *PodDisruptionBudgetDetails) GetMaxUnavailable() int32 { +func (x *SparkApplicationDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.MaxUnavailable + return x.Containers } - return 0 + return nil } -func (x *PodDisruptionBudgetDetails) GetCurrentHealthy() int32 { +func (x *SparkApplicationDetails) GetSparkVersion() string { if x != nil { - return x.CurrentHealthy + return x.SparkVersion } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetDesiredHealthy() int32 { +func (x *SparkApplicationDetails) GetApplicationType() string { if x != nil { - return x.DesiredHealthy + return x.ApplicationType } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetDisruptionsAllowed() int32 { +func (x *SparkApplicationDetails) GetDeployMode() string { if x != nil { - return x.DisruptionsAllowed + return x.DeployMode } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetExpectedPods() int32 { +func (x *SparkApplicationDetails) GetMainClass() string { if x != nil { - return x.ExpectedPods + return x.MainClass } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetStatus() string { +func (x *SparkApplicationDetails) GetMainApplicationFile() string { if x != nil { - return x.Status + return x.MainApplicationFile } return "" } -func (x *PodDisruptionBudgetDetails) GetSelectorLabels() map[string]string { +func (x *SparkApplicationDetails) GetArguments() []string { if x != nil { - return x.SelectorLabels + return x.Arguments } return nil } -func (x *PodDisruptionBudgetDetails) GetConditions() []*PodDisruptionBudgetCondition { +func (x *SparkApplicationDetails) GetSparkDriverInfo() *SparkDriverInfo { if x != nil { - return x.Conditions + return x.SparkDriverInfo } return nil } -// PodDisruptionBudgetCondition represents a condition of a PodDisruptionBudget -type PodDisruptionBudgetCondition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "DisruptionAllowed") - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time -} - -func (x *PodDisruptionBudgetCondition) Reset() { - *x = PodDisruptionBudgetCondition{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[116] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *SparkApplicationDetails) GetExecutorInstances() int32 { + if x != nil { + return x.ExecutorInstances } + return 0 } -func (x *PodDisruptionBudgetCondition) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PodDisruptionBudgetCondition) ProtoMessage() {} - -func (x *PodDisruptionBudgetCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[116] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SparkApplicationDetails) GetExecutorsReady() int32 { + if x != nil { + return x.ExecutorsReady } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use PodDisruptionBudgetCondition.ProtoReflect.Descriptor instead. -func (*PodDisruptionBudgetCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{116} +func (x *SparkApplicationDetails) GetApplicationState() string { + if x != nil { + return x.ApplicationState + } + return "" } -func (x *PodDisruptionBudgetCondition) GetType() string { +func (x *SparkApplicationDetails) GetSparkApplicationId() string { if x != nil { - return x.Type + return x.SparkApplicationId } return "" } -func (x *PodDisruptionBudgetCondition) GetStatus() string { +func (x *SparkApplicationDetails) GetSubmissionId() string { if x != nil { - return x.Status + return x.SubmissionId } return "" } -func (x *PodDisruptionBudgetCondition) GetReason() string { +func (x *SparkApplicationDetails) GetSuspended() bool { if x != nil { - return x.Reason + return x.Suspended } - return "" + return false } -func (x *PodDisruptionBudgetCondition) GetMessage() string { +func (x *SparkApplicationDetails) GetRestartPolicy() *SparkRestartPolicyInfo { if x != nil { - return x.Message + return x.RestartPolicy } - return "" + return nil } -func (x *PodDisruptionBudgetCondition) GetLastTransitionTime() int64 { +func (x *SparkApplicationDetails) GetDynamicAllocation() *SparkDynamicAllocationInfo { if x != nil { - return x.LastTransitionTime + return x.DynamicAllocation } - return 0 + return nil } -// ResourceQuotaDetails contains detailed ResourceQuota information -type ResourceQuotaDetails struct { +// SparkDriverInfo represents information about the Spark driver +type SparkDriverInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - HardLimits map[string]string `protobuf:"bytes,1,rep,name=hard_limits,json=hardLimits,proto3" json:"hard_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Hard resource limits (e.g., "requests.cpu": "4", "requests.memory": "8Gi") - Used map[string]string `protobuf:"bytes,2,rep,name=used,proto3" json:"used,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Currently used resources - Scopes []string `protobuf:"bytes,3,rep,name=scopes,proto3" json:"scopes,omitempty"` // Quota scopes: ["BestEffort", "NotBestEffort", "NotTerminating", "Terminating"] - ScopeSelector map[string]string `protobuf:"bytes,4,rep,name=scope_selector,json=scopeSelector,proto3" json:"scope_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Scope selector match labels - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Valid", "Invalid", "Unknown" - Conditions []*ResourceQuotaCondition `protobuf:"bytes,6,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + PodName string `protobuf:"bytes,1,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` // Driver pod name + WebUiServiceName string `protobuf:"bytes,2,opt,name=web_ui_service_name,json=webUiServiceName,proto3" json:"web_ui_service_name,omitempty"` // Web UI service name + WebUiAddress string `protobuf:"bytes,3,opt,name=web_ui_address,json=webUiAddress,proto3" json:"web_ui_address,omitempty"` // Web UI address + WebUiPort int32 `protobuf:"varint,4,opt,name=web_ui_port,json=webUiPort,proto3" json:"web_ui_port,omitempty"` // Web UI port + WebUiIngressName string `protobuf:"bytes,5,opt,name=web_ui_ingress_name,json=webUiIngressName,proto3" json:"web_ui_ingress_name,omitempty"` // Web UI ingress name (if configured) + WebUiIngressAddress string `protobuf:"bytes,6,opt,name=web_ui_ingress_address,json=webUiIngressAddress,proto3" json:"web_ui_ingress_address,omitempty"` // Web UI ingress address (if configured) + Cores string `protobuf:"bytes,7,opt,name=cores,proto3" json:"cores,omitempty"` // Driver cores + Memory string `protobuf:"bytes,8,opt,name=memory,proto3" json:"memory,omitempty"` // Driver memory + ServiceAccount string `protobuf:"bytes,9,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` // Service account used by driver } -func (x *ResourceQuotaDetails) Reset() { - *x = ResourceQuotaDetails{} +func (x *SparkDriverInfo) Reset() { + *x = SparkDriverInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[117] + mi := &file_api_v1_common_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceQuotaDetails) String() string { +func (x *SparkDriverInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceQuotaDetails) ProtoMessage() {} +func (*SparkDriverInfo) ProtoMessage() {} -func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[117] +func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12344,83 +14136,104 @@ func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceQuotaDetails.ProtoReflect.Descriptor instead. -func (*ResourceQuotaDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{117} +// Deprecated: Use SparkDriverInfo.ProtoReflect.Descriptor instead. +func (*SparkDriverInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{131} } -func (x *ResourceQuotaDetails) GetHardLimits() map[string]string { +func (x *SparkDriverInfo) GetPodName() string { if x != nil { - return x.HardLimits + return x.PodName } - return nil + return "" } -func (x *ResourceQuotaDetails) GetUsed() map[string]string { +func (x *SparkDriverInfo) GetWebUiServiceName() string { if x != nil { - return x.Used + return x.WebUiServiceName } - return nil + return "" } -func (x *ResourceQuotaDetails) GetScopes() []string { +func (x *SparkDriverInfo) GetWebUiAddress() string { if x != nil { - return x.Scopes + return x.WebUiAddress } - return nil + return "" } -func (x *ResourceQuotaDetails) GetScopeSelector() map[string]string { +func (x *SparkDriverInfo) GetWebUiPort() int32 { if x != nil { - return x.ScopeSelector + return x.WebUiPort } - return nil + return 0 } -func (x *ResourceQuotaDetails) GetStatus() string { +func (x *SparkDriverInfo) GetWebUiIngressName() string { if x != nil { - return x.Status + return x.WebUiIngressName } return "" } -func (x *ResourceQuotaDetails) GetConditions() []*ResourceQuotaCondition { +func (x *SparkDriverInfo) GetWebUiIngressAddress() string { if x != nil { - return x.Conditions + return x.WebUiIngressAddress } - return nil + return "" } -// ResourceQuotaCondition represents a condition of a ResourceQuota -type ResourceQuotaCondition struct { +func (x *SparkDriverInfo) GetCores() string { + if x != nil { + return x.Cores + } + return "" +} + +func (x *SparkDriverInfo) GetMemory() string { + if x != nil { + return x.Memory + } + return "" +} + +func (x *SparkDriverInfo) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +// SparkRestartPolicyInfo represents restart policy information +type SparkRestartPolicyInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (typically not used in core/v1) - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Always, OnFailure, Never + OnFailureRetries int32 `protobuf:"varint,2,opt,name=on_failure_retries,json=onFailureRetries,proto3" json:"on_failure_retries,omitempty"` // Number of retries on failure + OnFailureRetryInterval int64 `protobuf:"varint,3,opt,name=on_failure_retry_interval,json=onFailureRetryInterval,proto3" json:"on_failure_retry_interval,omitempty"` // Retry interval in seconds + OnSubmissionFailureRetries int32 `protobuf:"varint,4,opt,name=on_submission_failure_retries,json=onSubmissionFailureRetries,proto3" json:"on_submission_failure_retries,omitempty"` // Number of retries on submission failure + OnSubmissionFailureRetryInterval int64 `protobuf:"varint,5,opt,name=on_submission_failure_retry_interval,json=onSubmissionFailureRetryInterval,proto3" json:"on_submission_failure_retry_interval,omitempty"` // Submission retry interval in seconds } -func (x *ResourceQuotaCondition) Reset() { - *x = ResourceQuotaCondition{} +func (x *SparkRestartPolicyInfo) Reset() { + *x = SparkRestartPolicyInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[118] + mi := &file_api_v1_common_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceQuotaCondition) String() string { +func (x *SparkRestartPolicyInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceQuotaCondition) ProtoMessage() {} +func (*SparkRestartPolicyInfo) ProtoMessage() {} -func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[118] +func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12431,78 +14244,77 @@ func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceQuotaCondition.ProtoReflect.Descriptor instead. -func (*ResourceQuotaCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{118} +// Deprecated: Use SparkRestartPolicyInfo.ProtoReflect.Descriptor instead. +func (*SparkRestartPolicyInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{132} } -func (x *ResourceQuotaCondition) GetType() string { +func (x *SparkRestartPolicyInfo) GetType() string { if x != nil { return x.Type } return "" } -func (x *ResourceQuotaCondition) GetStatus() string { +func (x *SparkRestartPolicyInfo) GetOnFailureRetries() int32 { if x != nil { - return x.Status + return x.OnFailureRetries } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetReason() string { +func (x *SparkRestartPolicyInfo) GetOnFailureRetryInterval() int64 { if x != nil { - return x.Reason + return x.OnFailureRetryInterval } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetMessage() string { +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetries() int32 { if x != nil { - return x.Message + return x.OnSubmissionFailureRetries } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetLastTransitionTime() int64 { +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetryInterval() int64 { if x != nil { - return x.LastTransitionTime + return x.OnSubmissionFailureRetryInterval } return 0 } -// VolcanoJobDetails contains detailed VolcanoJob information for drill-down -type VolcanoJobDetails struct { +// SparkDynamicAllocationInfo represents dynamic allocation configuration +type SparkDynamicAllocationInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec - Conditions []*VolcanoJobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // VolcanoJob conditions for debugging - Queue string `protobuf:"bytes,3,opt,name=queue,proto3" json:"queue,omitempty"` // Queue name for scheduling - MinAvailable int32 `protobuf:"varint,4,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum available pods - SchedulePolicy string `protobuf:"bytes,5,opt,name=schedule_policy,json=schedulePolicy,proto3" json:"schedule_policy,omitempty"` // Schedule policy name - PriorityClass string `protobuf:"bytes,6,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name - Tasks []*VolcanoTask `protobuf:"bytes,7,rep,name=tasks,proto3" json:"tasks,omitempty"` // Tasks in the job + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Whether dynamic allocation is enabled + InitialExecutors int32 `protobuf:"varint,2,opt,name=initial_executors,json=initialExecutors,proto3" json:"initial_executors,omitempty"` // Initial number of executors + MinExecutors int32 `protobuf:"varint,3,opt,name=min_executors,json=minExecutors,proto3" json:"min_executors,omitempty"` // Minimum number of executors + MaxExecutors int32 `protobuf:"varint,4,opt,name=max_executors,json=maxExecutors,proto3" json:"max_executors,omitempty"` // Maximum number of executors + ShuffleTrackingEnabled bool `protobuf:"varint,5,opt,name=shuffle_tracking_enabled,json=shuffleTrackingEnabled,proto3" json:"shuffle_tracking_enabled,omitempty"` // Whether shuffle tracking is enabled + ShuffleTrackingTimeout int64 `protobuf:"varint,6,opt,name=shuffle_tracking_timeout,json=shuffleTrackingTimeout,proto3" json:"shuffle_tracking_timeout,omitempty"` // Shuffle tracking timeout in milliseconds } -func (x *VolcanoJobDetails) Reset() { - *x = VolcanoJobDetails{} +func (x *SparkDynamicAllocationInfo) Reset() { + *x = SparkDynamicAllocationInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[119] + mi := &file_api_v1_common_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolcanoJobDetails) String() string { +func (x *SparkDynamicAllocationInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolcanoJobDetails) ProtoMessage() {} +func (*SparkDynamicAllocationInfo) ProtoMessage() {} -func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[119] +func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12513,90 +14325,93 @@ func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolcanoJobDetails.ProtoReflect.Descriptor instead. -func (*VolcanoJobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{119} -} - -func (x *VolcanoJobDetails) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil +// Deprecated: Use SparkDynamicAllocationInfo.ProtoReflect.Descriptor instead. +func (*SparkDynamicAllocationInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{133} } -func (x *VolcanoJobDetails) GetConditions() []*VolcanoJobCondition { +func (x *SparkDynamicAllocationInfo) GetEnabled() bool { if x != nil { - return x.Conditions + return x.Enabled } - return nil + return false } -func (x *VolcanoJobDetails) GetQueue() string { +func (x *SparkDynamicAllocationInfo) GetInitialExecutors() int32 { if x != nil { - return x.Queue + return x.InitialExecutors } - return "" + return 0 } -func (x *VolcanoJobDetails) GetMinAvailable() int32 { +func (x *SparkDynamicAllocationInfo) GetMinExecutors() int32 { if x != nil { - return x.MinAvailable + return x.MinExecutors } return 0 } -func (x *VolcanoJobDetails) GetSchedulePolicy() string { +func (x *SparkDynamicAllocationInfo) GetMaxExecutors() int32 { if x != nil { - return x.SchedulePolicy + return x.MaxExecutors } - return "" + return 0 } -func (x *VolcanoJobDetails) GetPriorityClass() string { +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingEnabled() bool { if x != nil { - return x.PriorityClass + return x.ShuffleTrackingEnabled } - return "" + return false } -func (x *VolcanoJobDetails) GetTasks() []*VolcanoTask { +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingTimeout() int64 { if x != nil { - return x.Tasks + return x.ShuffleTrackingTimeout } - return nil + return 0 } -// VolcanoJobCondition represents a volcano job condition -type VolcanoJobCondition struct { +// ScheduledSparkApplicationDetails contains detailed ScheduledSparkApplication information for drill-down +type ScheduledSparkApplicationDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Pending", "Running", "Completed", "Failed", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Schedule string `protobuf:"bytes,1,opt,name=schedule,proto3" json:"schedule,omitempty"` // Cron schedule expression (e.g., "@every 15m", "0 * * * *") + TimeZone string `protobuf:"bytes,2,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` // Time zone for schedule (e.g., "UTC", "America/New_York") + Suspended bool `protobuf:"varint,3,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether the schedule is suspended + ConcurrencyPolicy string `protobuf:"bytes,4,opt,name=concurrency_policy,json=concurrencyPolicy,proto3" json:"concurrency_policy,omitempty"` // Allow, Forbid, Replace + SuccessfulRunHistoryLimit int32 `protobuf:"varint,5,opt,name=successful_run_history_limit,json=successfulRunHistoryLimit,proto3" json:"successful_run_history_limit,omitempty"` // Number of successful runs to keep + FailedRunHistoryLimit int32 `protobuf:"varint,6,opt,name=failed_run_history_limit,json=failedRunHistoryLimit,proto3" json:"failed_run_history_limit,omitempty"` // Number of failed runs to keep + ScheduleState string `protobuf:"bytes,7,opt,name=schedule_state,json=scheduleState,proto3" json:"schedule_state,omitempty"` // Current state: Scheduled, Validating, FailedValidation + LastRunName string `protobuf:"bytes,8,opt,name=last_run_name,json=lastRunName,proto3" json:"last_run_name,omitempty"` // Name of the last SparkApplication created + LastRun *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_run,json=lastRun,proto3" json:"last_run,omitempty"` // Time of last run + NextRun *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=next_run,json=nextRun,proto3" json:"next_run,omitempty"` // Time of next scheduled run + PastSuccessfulRunNames []string `protobuf:"bytes,11,rep,name=past_successful_run_names,json=pastSuccessfulRunNames,proto3" json:"past_successful_run_names,omitempty"` // Names of past successful runs + PastFailedRunNames []string `protobuf:"bytes,12,rep,name=past_failed_run_names,json=pastFailedRunNames,proto3" json:"past_failed_run_names,omitempty"` // Names of past failed runs + Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for current schedule state + // Template fields (inherited from SparkApplication) + TemplateDetails *SparkApplicationDetails `protobuf:"bytes,14,opt,name=template_details,json=templateDetails,proto3" json:"template_details,omitempty"` // Details from the SparkApplication template } -func (x *VolcanoJobCondition) Reset() { - *x = VolcanoJobCondition{} +func (x *ScheduledSparkApplicationDetails) Reset() { + *x = ScheduledSparkApplicationDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[120] + mi := &file_api_v1_common_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolcanoJobCondition) String() string { +func (x *ScheduledSparkApplicationDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolcanoJobCondition) ProtoMessage() {} +func (*ScheduledSparkApplicationDetails) ProtoMessage() {} -func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[120] +func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12607,151 +14422,140 @@ func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolcanoJobCondition.ProtoReflect.Descriptor instead. -func (*VolcanoJobCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{120} +// Deprecated: Use ScheduledSparkApplicationDetails.ProtoReflect.Descriptor instead. +func (*ScheduledSparkApplicationDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{134} } -func (x *VolcanoJobCondition) GetType() string { +func (x *ScheduledSparkApplicationDetails) GetSchedule() string { if x != nil { - return x.Type + return x.Schedule } return "" } -func (x *VolcanoJobCondition) GetStatus() string { +func (x *ScheduledSparkApplicationDetails) GetTimeZone() string { if x != nil { - return x.Status + return x.TimeZone } return "" } -func (x *VolcanoJobCondition) GetReason() string { +func (x *ScheduledSparkApplicationDetails) GetSuspended() bool { if x != nil { - return x.Reason + return x.Suspended } - return "" + return false } -func (x *VolcanoJobCondition) GetMessage() string { +func (x *ScheduledSparkApplicationDetails) GetConcurrencyPolicy() string { if x != nil { - return x.Message + return x.ConcurrencyPolicy } return "" } -func (x *VolcanoJobCondition) GetLastTransitionTime() int64 { +func (x *ScheduledSparkApplicationDetails) GetSuccessfulRunHistoryLimit() int32 { if x != nil { - return x.LastTransitionTime + return x.SuccessfulRunHistoryLimit } return 0 } -// VolcanoTask represents a task in a VolcanoJob -type VolcanoTask struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Task name - Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` // Number of replicas - Containers []*ContainerTemplate `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates +func (x *ScheduledSparkApplicationDetails) GetFailedRunHistoryLimit() int32 { + if x != nil { + return x.FailedRunHistoryLimit + } + return 0 } -func (x *VolcanoTask) Reset() { - *x = VolcanoTask{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[121] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ScheduledSparkApplicationDetails) GetScheduleState() string { + if x != nil { + return x.ScheduleState } + return "" } -func (x *VolcanoTask) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ScheduledSparkApplicationDetails) GetLastRunName() string { + if x != nil { + return x.LastRunName + } + return "" } -func (*VolcanoTask) ProtoMessage() {} +func (x *ScheduledSparkApplicationDetails) GetLastRun() *timestamppb.Timestamp { + if x != nil { + return x.LastRun + } + return nil +} -func (x *VolcanoTask) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[121] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ScheduledSparkApplicationDetails) GetNextRun() *timestamppb.Timestamp { + if x != nil { + return x.NextRun } - return mi.MessageOf(x) + return nil } -// Deprecated: Use VolcanoTask.ProtoReflect.Descriptor instead. -func (*VolcanoTask) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{121} +func (x *ScheduledSparkApplicationDetails) GetPastSuccessfulRunNames() []string { + if x != nil { + return x.PastSuccessfulRunNames + } + return nil } -func (x *VolcanoTask) GetName() string { +func (x *ScheduledSparkApplicationDetails) GetPastFailedRunNames() []string { if x != nil { - return x.Name + return x.PastFailedRunNames } - return "" + return nil } -func (x *VolcanoTask) GetReplicas() int32 { +func (x *ScheduledSparkApplicationDetails) GetReason() string { if x != nil { - return x.Replicas + return x.Reason } - return 0 + return "" } -func (x *VolcanoTask) GetContainers() []*ContainerTemplate { +func (x *ScheduledSparkApplicationDetails) GetTemplateDetails() *SparkApplicationDetails { if x != nil { - return x.Containers + return x.TemplateDetails } return nil } -// SparkApplicationDetails contains detailed SparkApplication information for drill-down -type SparkApplicationDetails struct { +// KyvernoPolicyDetails contains detailed Kyverno Policy/ClusterPolicy information for drill-down +type KyvernoPolicyDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from driver/executor specs - SparkVersion string `protobuf:"bytes,2,opt,name=spark_version,json=sparkVersion,proto3" json:"spark_version,omitempty"` // Spark version - ApplicationType string `protobuf:"bytes,3,opt,name=application_type,json=applicationType,proto3" json:"application_type,omitempty"` // Java, Scala, Python, R - DeployMode string `protobuf:"bytes,4,opt,name=deploy_mode,json=deployMode,proto3" json:"deploy_mode,omitempty"` // cluster, client, in-cluster-client - MainClass string `protobuf:"bytes,5,opt,name=main_class,json=mainClass,proto3" json:"main_class,omitempty"` // Main class for Java/Scala applications - MainApplicationFile string `protobuf:"bytes,6,opt,name=main_application_file,json=mainApplicationFile,proto3" json:"main_application_file,omitempty"` // Main application file path - Arguments []string `protobuf:"bytes,7,rep,name=arguments,proto3" json:"arguments,omitempty"` // Application arguments - SparkDriverInfo *SparkDriverInfo `protobuf:"bytes,8,opt,name=spark_driver_info,json=sparkDriverInfo,proto3" json:"spark_driver_info,omitempty"` // Driver information - ExecutorInstances int32 `protobuf:"varint,9,opt,name=executor_instances,json=executorInstances,proto3" json:"executor_instances,omitempty"` // Number of executor instances (from spec.executor.instances) - ExecutorsReady int32 `protobuf:"varint,16,opt,name=executors_ready,json=executorsReady,proto3" json:"executors_ready,omitempty"` // Number of RUNNING executors (from status.executorState); only meaningful when app is running - ApplicationState string `protobuf:"bytes,10,opt,name=application_state,json=applicationState,proto3" json:"application_state,omitempty"` // Application state: SUBMITTED, RUNNING, COMPLETED, FAILED, etc. - SparkApplicationId string `protobuf:"bytes,11,opt,name=spark_application_id,json=sparkApplicationId,proto3" json:"spark_application_id,omitempty"` // Spark application ID - SubmissionId string `protobuf:"bytes,12,opt,name=submission_id,json=submissionId,proto3" json:"submission_id,omitempty"` // Submission ID - Suspended bool `protobuf:"varint,13,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether application is suspended - RestartPolicy *SparkRestartPolicyInfo `protobuf:"bytes,14,opt,name=restart_policy,json=restartPolicy,proto3" json:"restart_policy,omitempty"` // Restart policy information - DynamicAllocation *SparkDynamicAllocationInfo `protobuf:"bytes,15,opt,name=dynamic_allocation,json=dynamicAllocation,proto3" json:"dynamic_allocation,omitempty"` // Dynamic allocation configuration + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Policy (namespaced) or ClusterPolicy + Background bool `protobuf:"varint,2,opt,name=background,proto3" json:"background,omitempty"` // Whether background scanning is enabled + ValidationFailureAction string `protobuf:"bytes,3,opt,name=validation_failure_action,json=validationFailureAction,proto3" json:"validation_failure_action,omitempty"` // Audit or Enforce (rule-level failureAction wins on kyverno 1.13+) + RuleCount int32 `protobuf:"varint,4,opt,name=rule_count,json=ruleCount,proto3" json:"rule_count,omitempty"` // Number of rules in the policy + RuleNames []string `protobuf:"bytes,5,rep,name=rule_names,json=ruleNames,proto3" json:"rule_names,omitempty"` // Rule names + SpecJson string `protobuf:"bytes,6,opt,name=spec_json,json=specJson,proto3" json:"spec_json,omitempty"` // Full policy spec as JSON for raw inspection } -func (x *SparkApplicationDetails) Reset() { - *x = SparkApplicationDetails{} +func (x *KyvernoPolicyDetails) Reset() { + *x = KyvernoPolicyDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[122] + mi := &file_api_v1_common_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkApplicationDetails) String() string { +func (x *KyvernoPolicyDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkApplicationDetails) ProtoMessage() {} +func (*KyvernoPolicyDetails) ProtoMessage() {} -func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[122] +func (x *KyvernoPolicyDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12762,157 +14566,194 @@ func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkApplicationDetails.ProtoReflect.Descriptor instead. -func (*SparkApplicationDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{122} +// Deprecated: Use KyvernoPolicyDetails.ProtoReflect.Descriptor instead. +func (*KyvernoPolicyDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{135} } -func (x *SparkApplicationDetails) GetContainers() []*ContainerTemplate { +func (x *KyvernoPolicyDetails) GetKind() string { if x != nil { - return x.Containers + return x.Kind } - return nil + return "" } -func (x *SparkApplicationDetails) GetSparkVersion() string { +func (x *KyvernoPolicyDetails) GetBackground() bool { if x != nil { - return x.SparkVersion + return x.Background } - return "" + return false } -func (x *SparkApplicationDetails) GetApplicationType() string { +func (x *KyvernoPolicyDetails) GetValidationFailureAction() string { if x != nil { - return x.ApplicationType + return x.ValidationFailureAction } return "" } -func (x *SparkApplicationDetails) GetDeployMode() string { +func (x *KyvernoPolicyDetails) GetRuleCount() int32 { if x != nil { - return x.DeployMode + return x.RuleCount } - return "" + return 0 } -func (x *SparkApplicationDetails) GetMainClass() string { +func (x *KyvernoPolicyDetails) GetRuleNames() []string { if x != nil { - return x.MainClass + return x.RuleNames } - return "" + return nil } -func (x *SparkApplicationDetails) GetMainApplicationFile() string { +func (x *KyvernoPolicyDetails) GetSpecJson() string { if x != nil { - return x.MainApplicationFile + return x.SpecJson } return "" } -func (x *SparkApplicationDetails) GetArguments() []string { - if x != nil { - return x.Arguments +// PolicyReportResult is one per-resource result inside a Kyverno policy report +type PolicyReportResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy string `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` // Policy name + Rule string `protobuf:"bytes,2,opt,name=rule,proto3" json:"rule,omitempty"` // Rule name + Result string `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"` // pass, fail, warn, error, skip + Severity string `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` // critical, high, medium, low, info + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + ResourceKind string `protobuf:"bytes,6,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Kind of the evaluated resource + ResourceNamespace string `protobuf:"bytes,7,opt,name=resource_namespace,json=resourceNamespace,proto3" json:"resource_namespace,omitempty"` // Namespace of the evaluated resource + ResourceName string `protobuf:"bytes,8,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Name of the evaluated resource +} + +func (x *PolicyReportResult) Reset() { + *x = PolicyReportResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *SparkApplicationDetails) GetSparkDriverInfo() *SparkDriverInfo { - if x != nil { - return x.SparkDriverInfo +func (x *PolicyReportResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PolicyReportResult) ProtoMessage() {} + +func (x *PolicyReportResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[136] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *SparkApplicationDetails) GetExecutorInstances() int32 { +// Deprecated: Use PolicyReportResult.ProtoReflect.Descriptor instead. +func (*PolicyReportResult) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{136} +} + +func (x *PolicyReportResult) GetPolicy() string { if x != nil { - return x.ExecutorInstances + return x.Policy } - return 0 + return "" } -func (x *SparkApplicationDetails) GetExecutorsReady() int32 { +func (x *PolicyReportResult) GetRule() string { if x != nil { - return x.ExecutorsReady + return x.Rule } - return 0 + return "" } -func (x *SparkApplicationDetails) GetApplicationState() string { +func (x *PolicyReportResult) GetResult() string { if x != nil { - return x.ApplicationState + return x.Result } return "" } -func (x *SparkApplicationDetails) GetSparkApplicationId() string { +func (x *PolicyReportResult) GetSeverity() string { if x != nil { - return x.SparkApplicationId + return x.Severity } return "" } -func (x *SparkApplicationDetails) GetSubmissionId() string { +func (x *PolicyReportResult) GetMessage() string { if x != nil { - return x.SubmissionId + return x.Message } return "" } -func (x *SparkApplicationDetails) GetSuspended() bool { +func (x *PolicyReportResult) GetResourceKind() string { if x != nil { - return x.Suspended + return x.ResourceKind } - return false + return "" } -func (x *SparkApplicationDetails) GetRestartPolicy() *SparkRestartPolicyInfo { +func (x *PolicyReportResult) GetResourceNamespace() string { if x != nil { - return x.RestartPolicy + return x.ResourceNamespace } - return nil + return "" } -func (x *SparkApplicationDetails) GetDynamicAllocation() *SparkDynamicAllocationInfo { +func (x *PolicyReportResult) GetResourceName() string { if x != nil { - return x.DynamicAllocation + return x.ResourceName } - return nil + return "" } -// SparkDriverInfo represents information about the Spark driver -type SparkDriverInfo struct { +// KyvernoPolicyReportDetails contains detailed policy report information for drill-down. +// The results list is capped at collection time (50); the counts always cover the full report. +type KyvernoPolicyReportDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PodName string `protobuf:"bytes,1,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` // Driver pod name - WebUiServiceName string `protobuf:"bytes,2,opt,name=web_ui_service_name,json=webUiServiceName,proto3" json:"web_ui_service_name,omitempty"` // Web UI service name - WebUiAddress string `protobuf:"bytes,3,opt,name=web_ui_address,json=webUiAddress,proto3" json:"web_ui_address,omitempty"` // Web UI address - WebUiPort int32 `protobuf:"varint,4,opt,name=web_ui_port,json=webUiPort,proto3" json:"web_ui_port,omitempty"` // Web UI port - WebUiIngressName string `protobuf:"bytes,5,opt,name=web_ui_ingress_name,json=webUiIngressName,proto3" json:"web_ui_ingress_name,omitempty"` // Web UI ingress name (if configured) - WebUiIngressAddress string `protobuf:"bytes,6,opt,name=web_ui_ingress_address,json=webUiIngressAddress,proto3" json:"web_ui_ingress_address,omitempty"` // Web UI ingress address (if configured) - Cores string `protobuf:"bytes,7,opt,name=cores,proto3" json:"cores,omitempty"` // Driver cores - Memory string `protobuf:"bytes,8,opt,name=memory,proto3" json:"memory,omitempty"` // Driver memory - ServiceAccount string `protobuf:"bytes,9,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` // Service account used by driver -} - -func (x *SparkDriverInfo) Reset() { - *x = SparkDriverInfo{} + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // PolicyReport (namespaced) or ClusterPolicyReport + ScopeKind string `protobuf:"bytes,2,opt,name=scope_kind,json=scopeKind,proto3" json:"scope_kind,omitempty"` // Kind of the resource the report applies to + ScopeName string `protobuf:"bytes,3,opt,name=scope_name,json=scopeName,proto3" json:"scope_name,omitempty"` // Name of the resource the report applies to + ScopeNamespace string `protobuf:"bytes,4,opt,name=scope_namespace,json=scopeNamespace,proto3" json:"scope_namespace,omitempty"` // Namespace of the resource the report applies to + Pass int32 `protobuf:"varint,5,opt,name=pass,proto3" json:"pass,omitempty"` // Passing result count + Fail int32 `protobuf:"varint,6,opt,name=fail,proto3" json:"fail,omitempty"` // Failing result count + Warn int32 `protobuf:"varint,7,opt,name=warn,proto3" json:"warn,omitempty"` // Warning result count + Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` // Error result count + Skip int32 `protobuf:"varint,9,opt,name=skip,proto3" json:"skip,omitempty"` // Skipped result count + Results []*PolicyReportResult `protobuf:"bytes,10,rep,name=results,proto3" json:"results,omitempty"` // Capped per-resource results + TotalResults int32 `protobuf:"varint,11,opt,name=total_results,json=totalResults,proto3" json:"total_results,omitempty"` // Full result count before capping +} + +func (x *KyvernoPolicyReportDetails) Reset() { + *x = KyvernoPolicyReportDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[123] + mi := &file_api_v1_common_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkDriverInfo) String() string { +func (x *KyvernoPolicyReportDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkDriverInfo) ProtoMessage() {} +func (*KyvernoPolicyReportDetails) ProtoMessage() {} -func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[123] +func (x *KyvernoPolicyReportDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12923,104 +14764,117 @@ func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkDriverInfo.ProtoReflect.Descriptor instead. -func (*SparkDriverInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{123} +// Deprecated: Use KyvernoPolicyReportDetails.ProtoReflect.Descriptor instead. +func (*KyvernoPolicyReportDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{137} +} + +func (x *KyvernoPolicyReportDetails) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *KyvernoPolicyReportDetails) GetScopeKind() string { + if x != nil { + return x.ScopeKind + } + return "" } -func (x *SparkDriverInfo) GetPodName() string { +func (x *KyvernoPolicyReportDetails) GetScopeName() string { if x != nil { - return x.PodName + return x.ScopeName } return "" } -func (x *SparkDriverInfo) GetWebUiServiceName() string { +func (x *KyvernoPolicyReportDetails) GetScopeNamespace() string { if x != nil { - return x.WebUiServiceName + return x.ScopeNamespace } return "" } -func (x *SparkDriverInfo) GetWebUiAddress() string { +func (x *KyvernoPolicyReportDetails) GetPass() int32 { if x != nil { - return x.WebUiAddress + return x.Pass } - return "" + return 0 } -func (x *SparkDriverInfo) GetWebUiPort() int32 { +func (x *KyvernoPolicyReportDetails) GetFail() int32 { if x != nil { - return x.WebUiPort + return x.Fail } return 0 } -func (x *SparkDriverInfo) GetWebUiIngressName() string { +func (x *KyvernoPolicyReportDetails) GetWarn() int32 { if x != nil { - return x.WebUiIngressName + return x.Warn } - return "" + return 0 } -func (x *SparkDriverInfo) GetWebUiIngressAddress() string { +func (x *KyvernoPolicyReportDetails) GetError() int32 { if x != nil { - return x.WebUiIngressAddress + return x.Error } - return "" + return 0 } -func (x *SparkDriverInfo) GetCores() string { +func (x *KyvernoPolicyReportDetails) GetSkip() int32 { if x != nil { - return x.Cores + return x.Skip } - return "" + return 0 } -func (x *SparkDriverInfo) GetMemory() string { +func (x *KyvernoPolicyReportDetails) GetResults() []*PolicyReportResult { if x != nil { - return x.Memory + return x.Results } - return "" + return nil } -func (x *SparkDriverInfo) GetServiceAccount() string { +func (x *KyvernoPolicyReportDetails) GetTotalResults() int32 { if x != nil { - return x.ServiceAccount + return x.TotalResults } - return "" + return 0 } -// SparkRestartPolicyInfo represents restart policy information -type SparkRestartPolicyInfo struct { +// GatekeeperConstraintTemplateDetails contains detailed ConstraintTemplate information for drill-down +type GatekeeperConstraintTemplateDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Always, OnFailure, Never - OnFailureRetries int32 `protobuf:"varint,2,opt,name=on_failure_retries,json=onFailureRetries,proto3" json:"on_failure_retries,omitempty"` // Number of retries on failure - OnFailureRetryInterval int64 `protobuf:"varint,3,opt,name=on_failure_retry_interval,json=onFailureRetryInterval,proto3" json:"on_failure_retry_interval,omitempty"` // Retry interval in seconds - OnSubmissionFailureRetries int32 `protobuf:"varint,4,opt,name=on_submission_failure_retries,json=onSubmissionFailureRetries,proto3" json:"on_submission_failure_retries,omitempty"` // Number of retries on submission failure - OnSubmissionFailureRetryInterval int64 `protobuf:"varint,5,opt,name=on_submission_failure_retry_interval,json=onSubmissionFailureRetryInterval,proto3" json:"on_submission_failure_retry_interval,omitempty"` // Submission retry interval in seconds + CrdKind string `protobuf:"bytes,1,opt,name=crd_kind,json=crdKind,proto3" json:"crd_kind,omitempty"` // Constraint kind this template generates (e.g. K8sRequiredLabels) + Targets []string `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` // Enforcement targets (e.g. admission.k8s.gatekeeper.sh) + Created bool `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"` // Whether the constraint CRD has been created + SpecJson string `protobuf:"bytes,4,opt,name=spec_json,json=specJson,proto3" json:"spec_json,omitempty"` // Full template spec as JSON for raw inspection } -func (x *SparkRestartPolicyInfo) Reset() { - *x = SparkRestartPolicyInfo{} +func (x *GatekeeperConstraintTemplateDetails) Reset() { + *x = GatekeeperConstraintTemplateDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[124] + mi := &file_api_v1_common_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkRestartPolicyInfo) String() string { +func (x *GatekeeperConstraintTemplateDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkRestartPolicyInfo) ProtoMessage() {} +func (*GatekeeperConstraintTemplateDetails) ProtoMessage() {} -func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[124] +func (x *GatekeeperConstraintTemplateDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13031,77 +14885,69 @@ func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkRestartPolicyInfo.ProtoReflect.Descriptor instead. -func (*SparkRestartPolicyInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{124} +// Deprecated: Use GatekeeperConstraintTemplateDetails.ProtoReflect.Descriptor instead. +func (*GatekeeperConstraintTemplateDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{138} } -func (x *SparkRestartPolicyInfo) GetType() string { +func (x *GatekeeperConstraintTemplateDetails) GetCrdKind() string { if x != nil { - return x.Type + return x.CrdKind } return "" } -func (x *SparkRestartPolicyInfo) GetOnFailureRetries() int32 { - if x != nil { - return x.OnFailureRetries - } - return 0 -} - -func (x *SparkRestartPolicyInfo) GetOnFailureRetryInterval() int64 { +func (x *GatekeeperConstraintTemplateDetails) GetTargets() []string { if x != nil { - return x.OnFailureRetryInterval + return x.Targets } - return 0 + return nil } -func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetries() int32 { +func (x *GatekeeperConstraintTemplateDetails) GetCreated() bool { if x != nil { - return x.OnSubmissionFailureRetries + return x.Created } - return 0 + return false } -func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetryInterval() int64 { +func (x *GatekeeperConstraintTemplateDetails) GetSpecJson() string { if x != nil { - return x.OnSubmissionFailureRetryInterval + return x.SpecJson } - return 0 + return "" } -// SparkDynamicAllocationInfo represents dynamic allocation configuration -type SparkDynamicAllocationInfo struct { +// ConstraintViolation is one audit violation on a Gatekeeper constraint status +type ConstraintViolation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Whether dynamic allocation is enabled - InitialExecutors int32 `protobuf:"varint,2,opt,name=initial_executors,json=initialExecutors,proto3" json:"initial_executors,omitempty"` // Initial number of executors - MinExecutors int32 `protobuf:"varint,3,opt,name=min_executors,json=minExecutors,proto3" json:"min_executors,omitempty"` // Minimum number of executors - MaxExecutors int32 `protobuf:"varint,4,opt,name=max_executors,json=maxExecutors,proto3" json:"max_executors,omitempty"` // Maximum number of executors - ShuffleTrackingEnabled bool `protobuf:"varint,5,opt,name=shuffle_tracking_enabled,json=shuffleTrackingEnabled,proto3" json:"shuffle_tracking_enabled,omitempty"` // Whether shuffle tracking is enabled - ShuffleTrackingTimeout int64 `protobuf:"varint,6,opt,name=shuffle_tracking_timeout,json=shuffleTrackingTimeout,proto3" json:"shuffle_tracking_timeout,omitempty"` // Shuffle tracking timeout in milliseconds + ResourceKind string `protobuf:"bytes,1,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Kind of the violating resource + ResourceNamespace string `protobuf:"bytes,2,opt,name=resource_namespace,json=resourceNamespace,proto3" json:"resource_namespace,omitempty"` // Namespace of the violating resource + ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Name of the violating resource + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Violation message + EnforcementAction string `protobuf:"bytes,5,opt,name=enforcement_action,json=enforcementAction,proto3" json:"enforcement_action,omitempty"` // Action recorded on the violation } -func (x *SparkDynamicAllocationInfo) Reset() { - *x = SparkDynamicAllocationInfo{} +func (x *ConstraintViolation) Reset() { + *x = ConstraintViolation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[125] + mi := &file_api_v1_common_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkDynamicAllocationInfo) String() string { +func (x *ConstraintViolation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkDynamicAllocationInfo) ProtoMessage() {} +func (*ConstraintViolation) ProtoMessage() {} -func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[125] +func (x *ConstraintViolation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13112,93 +14958,79 @@ func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkDynamicAllocationInfo.ProtoReflect.Descriptor instead. -func (*SparkDynamicAllocationInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{125} -} - -func (x *SparkDynamicAllocationInfo) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false +// Deprecated: Use ConstraintViolation.ProtoReflect.Descriptor instead. +func (*ConstraintViolation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{139} } -func (x *SparkDynamicAllocationInfo) GetInitialExecutors() int32 { +func (x *ConstraintViolation) GetResourceKind() string { if x != nil { - return x.InitialExecutors + return x.ResourceKind } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetMinExecutors() int32 { +func (x *ConstraintViolation) GetResourceNamespace() string { if x != nil { - return x.MinExecutors + return x.ResourceNamespace } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetMaxExecutors() int32 { +func (x *ConstraintViolation) GetResourceName() string { if x != nil { - return x.MaxExecutors + return x.ResourceName } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetShuffleTrackingEnabled() bool { +func (x *ConstraintViolation) GetMessage() string { if x != nil { - return x.ShuffleTrackingEnabled + return x.Message } - return false + return "" } -func (x *SparkDynamicAllocationInfo) GetShuffleTrackingTimeout() int64 { +func (x *ConstraintViolation) GetEnforcementAction() string { if x != nil { - return x.ShuffleTrackingTimeout + return x.EnforcementAction } - return 0 + return "" } -// ScheduledSparkApplicationDetails contains detailed ScheduledSparkApplication information for drill-down -type ScheduledSparkApplicationDetails struct { +// GatekeeperConstraintDetails contains detailed constraint information for drill-down. +// The violations list is capped by gatekeeper (default 20); total_violations covers the full audit. +type GatekeeperConstraintDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Schedule string `protobuf:"bytes,1,opt,name=schedule,proto3" json:"schedule,omitempty"` // Cron schedule expression (e.g., "@every 15m", "0 * * * *") - TimeZone string `protobuf:"bytes,2,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` // Time zone for schedule (e.g., "UTC", "America/New_York") - Suspended bool `protobuf:"varint,3,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether the schedule is suspended - ConcurrencyPolicy string `protobuf:"bytes,4,opt,name=concurrency_policy,json=concurrencyPolicy,proto3" json:"concurrency_policy,omitempty"` // Allow, Forbid, Replace - SuccessfulRunHistoryLimit int32 `protobuf:"varint,5,opt,name=successful_run_history_limit,json=successfulRunHistoryLimit,proto3" json:"successful_run_history_limit,omitempty"` // Number of successful runs to keep - FailedRunHistoryLimit int32 `protobuf:"varint,6,opt,name=failed_run_history_limit,json=failedRunHistoryLimit,proto3" json:"failed_run_history_limit,omitempty"` // Number of failed runs to keep - ScheduleState string `protobuf:"bytes,7,opt,name=schedule_state,json=scheduleState,proto3" json:"schedule_state,omitempty"` // Current state: Scheduled, Validating, FailedValidation - LastRunName string `protobuf:"bytes,8,opt,name=last_run_name,json=lastRunName,proto3" json:"last_run_name,omitempty"` // Name of the last SparkApplication created - LastRun *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_run,json=lastRun,proto3" json:"last_run,omitempty"` // Time of last run - NextRun *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=next_run,json=nextRun,proto3" json:"next_run,omitempty"` // Time of next scheduled run - PastSuccessfulRunNames []string `protobuf:"bytes,11,rep,name=past_successful_run_names,json=pastSuccessfulRunNames,proto3" json:"past_successful_run_names,omitempty"` // Names of past successful runs - PastFailedRunNames []string `protobuf:"bytes,12,rep,name=past_failed_run_names,json=pastFailedRunNames,proto3" json:"past_failed_run_names,omitempty"` // Names of past failed runs - Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for current schedule state - // Template fields (inherited from SparkApplication) - TemplateDetails *SparkApplicationDetails `protobuf:"bytes,14,opt,name=template_details,json=templateDetails,proto3" json:"template_details,omitempty"` // Details from the SparkApplication template + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Template-generated constraint kind + EnforcementAction string `protobuf:"bytes,2,opt,name=enforcement_action,json=enforcementAction,proto3" json:"enforcement_action,omitempty"` // deny, warn, or dryrun + MatchJson string `protobuf:"bytes,3,opt,name=match_json,json=matchJson,proto3" json:"match_json,omitempty"` // Match criteria as JSON + ParametersJson string `protobuf:"bytes,4,opt,name=parameters_json,json=parametersJson,proto3" json:"parameters_json,omitempty"` // Constraint parameters as JSON + TotalViolations int64 `protobuf:"varint,5,opt,name=total_violations,json=totalViolations,proto3" json:"total_violations,omitempty"` // Full audit violation count + AuditTimestamp *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=audit_timestamp,json=auditTimestamp,proto3" json:"audit_timestamp,omitempty"` // When gatekeeper last audited + Violations []*ConstraintViolation `protobuf:"bytes,7,rep,name=violations,proto3" json:"violations,omitempty"` // Capped audit violations } -func (x *ScheduledSparkApplicationDetails) Reset() { - *x = ScheduledSparkApplicationDetails{} +func (x *GatekeeperConstraintDetails) Reset() { + *x = GatekeeperConstraintDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[126] + mi := &file_api_v1_common_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ScheduledSparkApplicationDetails) String() string { +func (x *GatekeeperConstraintDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ScheduledSparkApplicationDetails) ProtoMessage() {} +func (*GatekeeperConstraintDetails) ProtoMessage() {} -func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[126] +func (x *GatekeeperConstraintDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13209,105 +15041,56 @@ func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ScheduledSparkApplicationDetails.ProtoReflect.Descriptor instead. -func (*ScheduledSparkApplicationDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{126} -} - -func (x *ScheduledSparkApplicationDetails) GetSchedule() string { - if x != nil { - return x.Schedule - } - return "" +// Deprecated: Use GatekeeperConstraintDetails.ProtoReflect.Descriptor instead. +func (*GatekeeperConstraintDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{140} } -func (x *ScheduledSparkApplicationDetails) GetTimeZone() string { +func (x *GatekeeperConstraintDetails) GetKind() string { if x != nil { - return x.TimeZone + return x.Kind } return "" } -func (x *ScheduledSparkApplicationDetails) GetSuspended() bool { - if x != nil { - return x.Suspended - } - return false -} - -func (x *ScheduledSparkApplicationDetails) GetConcurrencyPolicy() string { +func (x *GatekeeperConstraintDetails) GetEnforcementAction() string { if x != nil { - return x.ConcurrencyPolicy + return x.EnforcementAction } return "" } -func (x *ScheduledSparkApplicationDetails) GetSuccessfulRunHistoryLimit() int32 { - if x != nil { - return x.SuccessfulRunHistoryLimit - } - return 0 -} - -func (x *ScheduledSparkApplicationDetails) GetFailedRunHistoryLimit() int32 { - if x != nil { - return x.FailedRunHistoryLimit - } - return 0 -} - -func (x *ScheduledSparkApplicationDetails) GetScheduleState() string { +func (x *GatekeeperConstraintDetails) GetMatchJson() string { if x != nil { - return x.ScheduleState + return x.MatchJson } return "" } -func (x *ScheduledSparkApplicationDetails) GetLastRunName() string { +func (x *GatekeeperConstraintDetails) GetParametersJson() string { if x != nil { - return x.LastRunName + return x.ParametersJson } return "" } -func (x *ScheduledSparkApplicationDetails) GetLastRun() *timestamppb.Timestamp { - if x != nil { - return x.LastRun - } - return nil -} - -func (x *ScheduledSparkApplicationDetails) GetNextRun() *timestamppb.Timestamp { - if x != nil { - return x.NextRun - } - return nil -} - -func (x *ScheduledSparkApplicationDetails) GetPastSuccessfulRunNames() []string { +func (x *GatekeeperConstraintDetails) GetTotalViolations() int64 { if x != nil { - return x.PastSuccessfulRunNames + return x.TotalViolations } - return nil + return 0 } -func (x *ScheduledSparkApplicationDetails) GetPastFailedRunNames() []string { +func (x *GatekeeperConstraintDetails) GetAuditTimestamp() *timestamppb.Timestamp { if x != nil { - return x.PastFailedRunNames + return x.AuditTimestamp } return nil } -func (x *ScheduledSparkApplicationDetails) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *ScheduledSparkApplicationDetails) GetTemplateDetails() *SparkApplicationDetails { +func (x *GatekeeperConstraintDetails) GetViolations() []*ConstraintViolation { if x != nil { - return x.TemplateDetails + return x.Violations } return nil } @@ -13317,43 +15100,53 @@ type Event struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - OwnerUid string `protobuf:"bytes,7,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` - OwnerKind string `protobuf:"bytes,8,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` - OwnerName string `protobuf:"bytes,9,opt,name=owner_name,json=ownerName,proto3" json:"owner_name,omitempty"` - ApiVersion string `protobuf:"bytes,10,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` - ResourceVersion string `protobuf:"bytes,11,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - Count int32 `protobuf:"varint,12,opt,name=count,proto3" json:"count,omitempty"` - Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` - Message string `protobuf:"bytes,14,opt,name=message,proto3" json:"message,omitempty"` - Type string `protobuf:"bytes,15,opt,name=type,proto3" json:"type,omitempty"` - Action string `protobuf:"bytes,16,opt,name=action,proto3" json:"action,omitempty"` - Source string `protobuf:"bytes,17,opt,name=source,proto3" json:"source,omitempty"` - InvolvedObjectKind string `protobuf:"bytes,18,opt,name=involved_object_kind,json=involvedObjectKind,proto3" json:"involved_object_kind,omitempty"` - InvolvedObjectName string `protobuf:"bytes,19,opt,name=involved_object_name,json=involvedObjectName,proto3" json:"involved_object_name,omitempty"` - InvolvedObjectNamespace string `protobuf:"bytes,20,opt,name=involved_object_namespace,json=involvedObjectNamespace,proto3" json:"involved_object_namespace,omitempty"` - ReportingController string `protobuf:"bytes,21,opt,name=reporting_controller,json=reportingController,proto3" json:"reporting_controller,omitempty"` - ReportingInstance string `protobuf:"bytes,22,opt,name=reporting_instance,json=reportingInstance,proto3" json:"reporting_instance,omitempty"` - Annotations map[string]string `protobuf:"bytes,23,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Labels map[string]string `protobuf:"bytes,24,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - InvolvedObjectUid string `protobuf:"bytes,25,opt,name=involved_object_uid,json=involvedObjectUid,proto3" json:"involved_object_uid,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - LastSeen *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` - CreatedAtAge string `protobuf:"bytes,44,opt,name=created_at_age,json=createdAtAge,proto3" json:"created_at_age,omitempty"` - UpdatedAtAge string `protobuf:"bytes,45,opt,name=updated_at_age,json=updatedAtAge,proto3" json:"updated_at_age,omitempty"` - LastSeenAge string `protobuf:"bytes,46,opt,name=last_seen_age,json=lastSeenAge,proto3" json:"last_seen_age,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,47,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + OwnerUid string `protobuf:"bytes,7,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` + OwnerKind string `protobuf:"bytes,8,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` + OwnerName string `protobuf:"bytes,9,opt,name=owner_name,json=ownerName,proto3" json:"owner_name,omitempty"` + ApiVersion string `protobuf:"bytes,10,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` + ResourceVersion string `protobuf:"bytes,11,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + Count int32 `protobuf:"varint,12,opt,name=count,proto3" json:"count,omitempty"` + Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` + Message string `protobuf:"bytes,14,opt,name=message,proto3" json:"message,omitempty"` + Type string `protobuf:"bytes,15,opt,name=type,proto3" json:"type,omitempty"` + Action string `protobuf:"bytes,16,opt,name=action,proto3" json:"action,omitempty"` + Source string `protobuf:"bytes,17,opt,name=source,proto3" json:"source,omitempty"` + InvolvedObjectKind string `protobuf:"bytes,18,opt,name=involved_object_kind,json=involvedObjectKind,proto3" json:"involved_object_kind,omitempty"` + InvolvedObjectName string `protobuf:"bytes,19,opt,name=involved_object_name,json=involvedObjectName,proto3" json:"involved_object_name,omitempty"` + InvolvedObjectNamespace string `protobuf:"bytes,20,opt,name=involved_object_namespace,json=involvedObjectNamespace,proto3" json:"involved_object_namespace,omitempty"` + ReportingController string `protobuf:"bytes,21,opt,name=reporting_controller,json=reportingController,proto3" json:"reporting_controller,omitempty"` + ReportingInstance string `protobuf:"bytes,22,opt,name=reporting_instance,json=reportingInstance,proto3" json:"reporting_instance,omitempty"` + Annotations map[string]string `protobuf:"bytes,23,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Labels map[string]string `protobuf:"bytes,24,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + InvolvedObjectUid string `protobuf:"bytes,25,opt,name=involved_object_uid,json=involvedObjectUid,proto3" json:"involved_object_uid,omitempty"` + // Set only on Karpenter `DisruptionBlocked` events; UNSPECIFIED on every other event. + DisruptionBlockReason DisruptionBlockReason `protobuf:"varint,26,opt,name=disruption_block_reason,json=disruptionBlockReason,proto3,enum=api.v1.DisruptionBlockReason" json:"disruption_block_reason,omitempty"` + // The PodDisruptionBudget that blocked eviction, as "namespace/name". Set only + // alongside DISRUPTION_BLOCK_REASON_PDB_VIOLATION; absent — not empty-string — + // otherwise, since "no PDB was involved" is not the same as "a PDB with no name". + BlockingPdbName *string `protobuf:"bytes,27,opt,name=blocking_pdb_name,json=blockingPdbName,proto3,oneof" json:"blocking_pdb_name,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + LastSeen *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` + CreatedAtAge string `protobuf:"bytes,44,opt,name=created_at_age,json=createdAtAge,proto3" json:"created_at_age,omitempty"` + UpdatedAtAge string `protobuf:"bytes,45,opt,name=updated_at_age,json=updatedAtAge,proto3" json:"updated_at_age,omitempty"` + LastSeenAge string `protobuf:"bytes,46,opt,name=last_seen_age,json=lastSeenAge,proto3" json:"last_seen_age,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,47,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // The pod behind a DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION or + // DISRUPTION_BLOCK_REASON_POD_NOMINATED classification, as "namespace/name". Same + // absent-means-not-applicable contract as blocking_pdb_name. + RelatedPodName *string `protobuf:"bytes,48,opt,name=related_pod_name,json=relatedPodName,proto3,oneof" json:"related_pod_name,omitempty"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[127] + mi := &file_api_v1_common_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13366,7 +15159,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[127] + mi := &file_api_v1_common_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13379,7 +15172,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{127} + return file_api_v1_common_proto_rawDescGZIP(), []int{141} } func (x *Event) GetId() string { @@ -13550,6 +15343,20 @@ func (x *Event) GetInvolvedObjectUid() string { return "" } +func (x *Event) GetDisruptionBlockReason() DisruptionBlockReason { + if x != nil { + return x.DisruptionBlockReason + } + return DisruptionBlockReason_DISRUPTION_BLOCK_REASON_UNSPECIFIED +} + +func (x *Event) GetBlockingPdbName() string { + if x != nil && x.BlockingPdbName != nil { + return *x.BlockingPdbName + } + return "" +} + func (x *Event) GetCreatedAt() *timestamppb.Timestamp { if x != nil { return x.CreatedAt @@ -13599,6 +15406,13 @@ func (x *Event) GetDeletedAt() *timestamppb.Timestamp { return nil } +func (x *Event) GetRelatedPodName() string { + if x != nil && x.RelatedPodName != nil { + return *x.RelatedPodName + } + return "" +} + type EventDatapointInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13616,7 +15430,7 @@ type EventDatapointInfo struct { func (x *EventDatapointInfo) Reset() { *x = EventDatapointInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[128] + mi := &file_api_v1_common_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13629,7 +15443,7 @@ func (x *EventDatapointInfo) String() string { func (*EventDatapointInfo) ProtoMessage() {} func (x *EventDatapointInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[128] + mi := &file_api_v1_common_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13642,7 +15456,7 @@ func (x *EventDatapointInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EventDatapointInfo.ProtoReflect.Descriptor instead. func (*EventDatapointInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{128} + return file_api_v1_common_proto_rawDescGZIP(), []int{142} } func (x *EventDatapointInfo) GetName() string { @@ -13710,7 +15524,7 @@ type EventDatapoint struct { func (x *EventDatapoint) Reset() { *x = EventDatapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[129] + mi := &file_api_v1_common_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13723,7 +15537,7 @@ func (x *EventDatapoint) String() string { func (*EventDatapoint) ProtoMessage() {} func (x *EventDatapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[129] + mi := &file_api_v1_common_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13736,7 +15550,7 @@ func (x *EventDatapoint) ProtoReflect() protoreflect.Message { // Deprecated: Use EventDatapoint.ProtoReflect.Descriptor instead. func (*EventDatapoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{129} + return file_api_v1_common_proto_rawDescGZIP(), []int{143} } func (x *EventDatapoint) GetUtcTime() string { @@ -13794,7 +15608,7 @@ type DimensionCount struct { func (x *DimensionCount) Reset() { *x = DimensionCount{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[130] + mi := &file_api_v1_common_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13807,7 +15621,7 @@ func (x *DimensionCount) String() string { func (*DimensionCount) ProtoMessage() {} func (x *DimensionCount) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[130] + mi := &file_api_v1_common_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13820,7 +15634,7 @@ func (x *DimensionCount) ProtoReflect() protoreflect.Message { // Deprecated: Use DimensionCount.ProtoReflect.Descriptor instead. func (*DimensionCount) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{130} + return file_api_v1_common_proto_rawDescGZIP(), []int{144} } func (x *DimensionCount) GetValue() string { @@ -13864,7 +15678,7 @@ type EventGroup struct { func (x *EventGroup) Reset() { *x = EventGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[131] + mi := &file_api_v1_common_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13877,7 +15691,7 @@ func (x *EventGroup) String() string { func (*EventGroup) ProtoMessage() {} func (x *EventGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[131] + mi := &file_api_v1_common_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13890,7 +15704,7 @@ func (x *EventGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use EventGroup.ProtoReflect.Descriptor instead. func (*EventGroup) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{131} + return file_api_v1_common_proto_rawDescGZIP(), []int{145} } func (x *EventGroup) GetReason() string { @@ -14031,7 +15845,7 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x82, 0x1b, 0x0a, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x6f, 0x6e, 0x22, 0xe1, 0x1b, 0x0a, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x33, @@ -14192,500 +16006,695 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x6f, 0x64, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, - 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x43, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x6e, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x25, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x6c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, + 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x5d, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, + 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, + 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x70, + 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x12, 0x6e, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x24, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x64, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x25, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x12, 0x6c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, + 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x24, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, + 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x74, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, + 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, + 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x75, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x74, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x1e, 0x6d, - 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x75, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x12, 0x48, 0x0a, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x76, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x5b, 0x0a, 0x21, - 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, - 0x72, 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, - 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x58, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x76, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x78, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x48, - 0x6f, 0x75, 0x72, 0x12, 0x5c, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, - 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, - 0x72, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x22, 0xd8, 0x16, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, - 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, - 0x17, 0x6e, 0x6f, 0x64, 0x65, 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, 0x52, 0x15, - 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, - 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, - 0x6d, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, - 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x64, 0x12, 0x48, 0x0a, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, + 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x76, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x5b, 0x0a, 0x21, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, + 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, + 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x58, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x78, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, 0x75, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x48, 0x6f, + 0x75, 0x72, 0x12, 0x5c, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, + 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, + 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x22, 0xf7, 0x1d, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, + 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, + 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, + 0x6e, 0x6f, 0x64, 0x65, 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, 0x52, 0x15, 0x6e, + 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, + 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, + 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, + 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x12, 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x43, + 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, + 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, + 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, + 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x21, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x5c, 0x0a, 0x29, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x22, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x24, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, + 0x5f, 0x72, 0x63, 0x76, 0x18, 0x29, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x74, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, + 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x33, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, + 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x47, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x4c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x18, 0x56, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x46, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, + 0x51, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x5c, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, + 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, + 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5e, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x5f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, + 0x63, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, + 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, + 0x76, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x61, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x44, 0x72, 0x6f, 0x70, 0x70, + 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, + 0x62, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x2b, 0x0a, + 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x65, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x46, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x66, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x24, 0x0a, + 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, + 0x68, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x6f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x2d, 0x0a, 0x13, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x79, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6a, + 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x55, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x2b, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6a, 0x76, 0x6d, + 0x48, 0x65, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x72, 0x73, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x52, 0x73, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x23, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x7e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x7f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x21, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x73, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x46, + 0x0a, 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, + 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x73, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x55, 0x73, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x47, 0x0a, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, + 0x72, 0x65, 0x5f, 0x73, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x84, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, + 0x75, 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x55, 0x73, 0x65, + 0x63, 0x12, 0x4d, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x73, + 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x85, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x63, + 0x12, 0x4d, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x75, + 0x6c, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x86, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, + 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x63, 0x42, + 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, + 0x21, 0x0a, 0x1f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, - 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, - 0x52, 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x21, - 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x5c, 0x0a, 0x29, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x22, 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x24, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, - 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x29, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x34, 0x0a, 0x16, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, - 0x69, 0x74, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, - 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x47, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, - 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x4c, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x56, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x46, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, - 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, - 0x5c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, - 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5d, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, - 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5e, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, - 0x52, 0x63, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, - 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, - 0x63, 0x76, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x61, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x44, 0x72, 0x6f, 0x70, - 0x70, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, - 0x18, 0x62, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x2b, - 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x65, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x66, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x24, - 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x68, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, - 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6f, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x22, 0xf9, 0x03, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x30, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x31, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, - 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x37, 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x70, 0x39, 0x39, 0x39, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x02, 0x70, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x02, 0x70, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x31, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x30, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x30, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, - 0x35, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x34, 0x30, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x30, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x34, 0x35, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x35, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x35, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x35, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x30, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x36, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x35, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x36, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x30, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, - 0x35, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x39, 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x37, 0x22, 0xa2, - 0x08, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, - 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6f, 0x64, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x22, 0xf9, 0x03, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x30, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x31, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x35, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, + 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x39, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, + 0x39, 0x39, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, + 0x70, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, + 0x70, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x31, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x30, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x32, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x30, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x35, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x34, + 0x30, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x34, 0x35, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x35, 0x35, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x35, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x30, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x36, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x35, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x36, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x37, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x35, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, + 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x37, 0x22, 0xa2, 0x08, 0x0a, + 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3c, + 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, 0x0a, 0x09, + 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, - 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, - 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x16, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x66, - 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x43, - 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, - 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xf2, 0x0c, 0x0a, 0x17, 0x46, 0x6f, - 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, - 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, - 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, + 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x14, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x73, 0x5f, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0e, + 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x22, 0x9d, 0x05, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x76, 0x6d, 0x5f, 0x6a, + 0x61, 0x76, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6a, 0x76, 0x6d, 0x4a, 0x61, 0x76, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x76, 0x6d, 0x5f, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6a, 0x76, 0x6d, + 0x4a, 0x61, 0x76, 0x61, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6a, + 0x76, 0x6d, 0x5f, 0x78, 0x6d, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x78, 0x6d, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x73, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x61, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x13, 0x6a, 0x76, 0x6d, 0x4d, 0x61, 0x78, 0x52, 0x61, 0x6d, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x19, 0x6a, 0x76, 0x6d, 0x5f, + 0x75, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x16, 0x6a, + 0x76, 0x6d, 0x55, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0e, 0x6a, 0x76, 0x6d, 0x5f, + 0x78, 0x6d, 0x78, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x78, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x43, + 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x22, 0x8a, 0x03, 0x0a, 0x0e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, + 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0c, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x34, 0x0a, 0x16, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x14, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x65, + 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xfa, + 0x03, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, + 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x42, 0x0a, 0x1d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x1b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6d, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x73, 0x6d, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xd6, 0x01, 0x0a, 0x1d, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x61, 0x77, 0x43, 0x6d, 0x64, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x0c, 0x0a, 0x17, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, + 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, + 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, + 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3a, - 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, - 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, - 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, - 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, - 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x18, 0x1d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, - 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x19, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3f, 0x0a, - 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x47, - 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0xe8, - 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, - 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x64, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, - 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, - 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, - 0x64, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x14, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf1, 0x0a, 0x0a, 0x0c, 0x57, 0x6f, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, + 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, + 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, + 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, + 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, + 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0xe8, 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, + 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x64, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x6f, + 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x16, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6f, + 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd2, 0x02, 0x0a, 0x12, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x13, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x26, + 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x76, + 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x56, 0x32, 0x12, 0x40, 0x0a, 0x0f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xdb, 0x0b, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, @@ -14762,1025 +16771,1242 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x69, 0x6e, 0x64, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x1a, 0x39, - 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x53, 0x0a, - 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xdb, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, - 0x0a, 0x0f, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, - 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x73, 0x70, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x57, 0x0a, 0x13, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xe5, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x1a, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9c, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 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, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, - 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, - 0x12, 0x4e, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x28, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x2c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0b, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, - 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, - 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, - 0x32, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x63, 0x70, 0x75, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, - 0x75, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, - 0x69, 0x62, 0x18, 0x34, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x35, 0x20, 0x01, 0x28, 0x01, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, - 0x75, 0x12, 0x1f, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x36, - 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, - 0x50, 0x0a, 0x1b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x65, 0x66, 0x66, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x3a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x45, - 0x66, 0x66, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, - 0x74, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x63, 0x70, 0x75, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, - 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x50, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, - 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x3a, 0x0a, 0x0f, - 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, - 0x43, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x65, - 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x53, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x54, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, - 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, - 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x56, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x75, - 0x72, 0x61, 0x63, 0x79, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, - 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, - 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x69, 0x64, 0x12, - 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x41, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x65, - 0x12, 0x41, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x18, 0x42, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, - 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x3d, 0x0a, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x47, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x49, 0x0a, 0x12, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x0e, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xae, - 0x03, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x22, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x52, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x50, + 0x0a, 0x13, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x02, 0x52, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, + 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x53, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xdb, 0x02, 0x0a, + 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, 0x5f, 0x64, + 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x6f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70, 0x6f, 0x74, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x70, 0x6f, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x0c, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, + 0x0a, 0x1a, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x18, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, + 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x9c, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, - 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, - 0x5c, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, - 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x75, 0x0a, - 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x22, 0xc8, 0x03, 0x0a, 0x0b, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x14, 0x63, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x68, 0x69, - 0x67, 0x68, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x70, 0x75, 0x48, 0x69, 0x67, 0x68, 0x57, 0x61, 0x74, 0x65, - 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, - 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x10, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x21, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1e, - 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, - 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x6f, - 0x75, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x6f, 0x75, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x26, 0x0a, - 0x0f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x10, 0x53, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, - 0x0c, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, - 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x83, 0x02, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x73, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x11, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4e, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, + 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x2b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x2c, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x32, 0x20, 0x01, 0x28, 0x01, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, + 0x72, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x12, 0x26, 0x0a, 0x0d, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x34, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, + 0x47, 0x69, 0x62, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x67, 0x70, 0x75, 0x18, 0x35, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x09, 0x63, + 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0c, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x37, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x67, 0x70, 0x75, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x50, 0x0a, 0x1b, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x5f, 0x65, 0x66, 0x66, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x45, 0x66, 0x66, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x14, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, + 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, + 0x47, 0x69, 0x62, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, + 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, + 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, 0x75, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x40, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, + 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, + 0x75, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, + 0x6e, 0x65, 0x79, 0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, + 0x69, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x18, 0x57, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, + 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, + 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x5f, 0x75, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x3f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, + 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x41, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x42, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x0f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x12, 0x37, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x48, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x45, 0x0a, 0x0e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xae, 0x03, 0x0a, 0x09, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x42, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, + 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, + 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x5c, 0x0a, 0x0d, 0x43, 0x6f, 0x73, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x75, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x89, + 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, + 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x0b, 0x53, + 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, - 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x7f, 0x0a, 0x18, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x05, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x94, 0x02, - 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x29, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, - 0x6c, 0x61, 0x67, 0x73, 0x22, 0xe0, 0x47, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x6f, 0x64, 0x5f, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x4a, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, - 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x64, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, - 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x6a, - 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x63, - 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, - 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, - 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x41, 0x0a, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x76, 0x63, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, - 0x00, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, - 0x0a, 0x70, 0x76, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x70, 0x76, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x63, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8e, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x3a, 0x0a, 0x0a, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8f, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, - 0x52, 0x09, 0x6e, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x90, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x48, 0x00, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, - 0x0a, 0x0b, 0x76, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x92, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x70, 0x61, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x93, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, - 0x00, 0x52, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0x58, 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0xe8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, - 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xe9, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x6f, - 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x14, 0x72, 0x6f, 0x6c, - 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x18, 0xea, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5f, 0x0a, 0x1a, 0x6b, 0x65, - 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xeb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x48, 0x00, 0x52, 0x17, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x61, 0x0a, 0x1a, 0x6b, - 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xec, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x48, 0x00, 0x52, 0x18, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x68, - 0x0a, 0x1d, 0x70, 0x6f, 0x64, 0x5f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, - 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x70, 0x6f, - 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0xee, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x4c, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, - 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x63, - 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5e, 0x0a, - 0x19, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf2, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x7a, 0x0a, - 0x23, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x70, 0x75, 0x53, + 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x77, 0x61, 0x74, + 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, + 0x70, 0x75, 0x48, 0x69, 0x67, 0x68, 0x57, 0x61, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x12, + 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x61, 0x63, 0x74, + 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, + 0x21, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1e, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x41, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0d, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, + 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x0b, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, + 0x83, 0x02, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x73, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3f, + 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x53, 0x61, + 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, + 0x33, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x7f, 0x0a, 0x18, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x94, 0x02, 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x4d, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, + 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, + 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0x93, + 0x4b, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x70, 0x6f, 0x64, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, + 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, + 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, + 0x00, 0x52, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x65, 0x6d, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, + 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, + 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x0b, + 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x6a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x69, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0e, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x48, 0x0a, + 0x0b, 0x70, 0x76, 0x63, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8c, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x76, 0x63, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x70, 0x76, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, + 0x09, 0x70, 0x76, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x73, 0x63, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, + 0x73, 0x63, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x6e, 0x73, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x36, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x70, + 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x76, 0x70, 0x61, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x70, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x58, + 0x0a, 0x17, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xe8, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, + 0x00, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xe9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x14, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xea, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, + 0x52, 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5f, 0x0a, 0x1a, 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0xeb, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, 0x6b, 0x65, + 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x61, 0x0a, 0x1a, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0xec, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x18, + 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x68, 0x0a, 0x1d, 0x70, 0x6f, 0x64, 0x5f, + 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, + 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xed, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x70, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x71, + 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xee, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, + 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x76, 0x6f, 0x6c, + 0x63, 0x61, 0x6e, 0x6f, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0xef, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x5e, 0x0a, 0x19, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, - 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, - 0x73, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, - 0x15, 0x0a, 0x06, 0x70, 0x6f, 0x64, 0x5f, 0x69, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x6f, 0x64, 0x49, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, - 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x70, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x71, 0x6f, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x71, 0x6f, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, - 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x17, + 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x7a, 0x0a, 0x23, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf3, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, + 0x00, 0x52, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, + 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf4, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x79, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x68, 0x0a, 0x1d, 0x6b, 0x79, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf5, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x79, 0x76, 0x65, + 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, + 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x26, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, + 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x5f, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0xf6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x23, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x6a, 0x0a, 0x1d, 0x67, 0x61, + 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf7, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1b, 0x67, 0x61, 0x74, 0x65, 0x6b, + 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, + 0x70, 0x6f, 0x64, 0x5f, 0x69, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, + 0x64, 0x49, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x1b, 0x0a, 0x09, 0x71, 0x6f, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x71, 0x6f, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x70, + 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, + 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x64, 0x42, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x29, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2a, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x2b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x2f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x30, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x70, 0x6f, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x76, 0x63, 0x5f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x40, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x63, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x47, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x49, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x73, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x4d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x50, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x6a, 0x6f, + 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6a, + 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x6a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, + 0x2a, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, 0x6f, 0x62, 0x42, + 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6a, + 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6a, + 0x6f, 0x62, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6a, 0x6f, 0x62, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, + 0x62, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x59, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, + 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x72, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, + 0x0a, 0x1a, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x60, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x16, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x61, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x72, 0x6f, + 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x62, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x70, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x66, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, + 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x1f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x6b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x4c, 0x0a, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, + 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x6e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, + 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x78, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x79, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x7a, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x7b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x73, 0x18, 0x7c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x54, 0x6c, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x7d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, + 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x72, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x7e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, + 0x49, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x5f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, + 0x81, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, + 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x70, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, + 0x13, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x76, 0x63, + 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x29, + 0x0a, 0x10, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0x85, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, 0x63, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x86, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, + 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x76, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x76, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x76, 0x63, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x89, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, + 0x0a, 0x19, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x8a, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x70, 0x76, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, + 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x65, 0x73, 0x18, 0x8b, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x70, 0x76, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x76, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x98, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x70, 0x76, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x99, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x76, + 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2a, 0x0a, + 0x11, 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x9a, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x9c, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x76, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x9d, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x76, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x76, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x76, 0x5f, 0x63, 0x73, 0x69, 0x5f, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x76, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x76, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0xa1, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x13, 0x70, 0x76, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5a, + 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x63, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0xab, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x63, 0x52, 0x65, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x63, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x3a, 0x0a, 0x19, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xad, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0d, 0x73, + 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0xae, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x15, + 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0xaf, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x73, 0x63, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x63, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb0, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x73, + 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0xb2, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, + 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, + 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0xb5, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x33, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0xb6, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x54, + 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0xb7, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb8, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, + 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xba, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xbb, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6f, 0x73, 0x18, 0xbc, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x4f, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0xbe, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, + 0x61, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc8, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x69, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc9, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x12, 0x68, 0x70, 0x61, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xcb, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xcc, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x68, 0x70, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x70, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xce, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x68, 0x70, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x55, 0x70, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, + 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x68, 0x70, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x70, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, + 0x70, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, + 0x76, 0x70, 0x61, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0xd3, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x70, 0x61, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x19, 0x76, + 0x70, 0x61, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x17, 0x76, 0x70, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x70, 0x61, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd5, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x43, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x2b, 0x0a, 0x11, 0x76, 0x70, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0xd6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x70, 0x61, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x76, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xd7, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x76, 0x70, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0xdd, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0xde, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x70, 0x75, 0x18, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xe1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, 0x6e, 0x43, 0x70, + 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe2, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, + 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x47, 0x0a, 0x20, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe4, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe5, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x22, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xe7, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf0, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0xf1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x63, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0xb0, 0x01, 0x0a, + 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, + 0x8b, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x02, + 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x1e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x20, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x44, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x29, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x2b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x70, 0x6f, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x76, 0x63, 0x5f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x63, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x46, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x47, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x49, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, - 0x6d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x18, 0x4d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x18, 0x50, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, - 0x19, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x17, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x52, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x6a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, - 0x73, 0x6d, 0x12, 0x2a, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, - 0x66, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, - 0x6f, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, - 0x0a, 0x13, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x6f, 0x62, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, - 0x55, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6a, 0x6f, 0x62, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6a, 0x6f, 0x62, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, - 0x18, 0x59, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x46, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, - 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x5b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x72, 0x6f, - 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, - 0x72, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, - 0x6f, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x72, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x60, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x66, 0x75, 0x6c, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, - 0x0a, 0x16, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6a, 0x6f, - 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x61, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, - 0x63, 0x72, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x62, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x63, 0x72, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, - 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x70, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, - 0x73, 0x18, 0x66, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x67, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, - 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x16, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4c, 0x0a, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x6c, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x6e, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, - 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x0a, 0x12, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x78, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x79, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, - 0x18, 0x7a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, - 0x61, 0x74, 0x68, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x7b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x18, 0x7c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x18, 0x7d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x69, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x7e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x72, 0x49, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x7f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x80, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, - 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x82, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, 0x63, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x70, 0x76, 0x63, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x85, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, - 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x86, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x76, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x76, 0x63, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x89, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x8a, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x76, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x0a, - 0x16, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0x8b, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, - 0x70, 0x76, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x96, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x70, 0x76, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x98, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, - 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x99, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x76, 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x9a, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, - 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, - 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, - 0x76, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x9c, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, - 0x9d, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x76, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x76, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x76, 0x5f, 0x63, - 0x73, 0x69, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x76, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x32, 0x0a, - 0x15, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, - 0x76, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0xa1, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x63, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x63, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, - 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0xab, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x63, 0x52, - 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x16, - 0x73, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, - 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0xad, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, - 0x0a, 0x0d, 0x73, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0xae, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, - 0x53, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x73, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x33, 0x0a, 0x15, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0xaf, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x13, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x63, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb0, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x63, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xb1, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, - 0x0d, 0x6e, 0x73, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0xb2, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x31, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0xb5, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x33, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0xb6, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6e, 0x6f, - 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0xb7, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb8, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x70, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x12, 0x22, - 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xba, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xbb, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6f, 0x73, 0x18, 0xbc, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x4f, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xbe, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, - 0x10, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x69, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x5f, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc9, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xca, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xcb, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x70, 0x61, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xcc, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x70, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x70, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xce, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x68, 0x70, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x68, 0x70, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x70, 0x61, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x76, 0x70, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x2d, 0x0a, 0x12, 0x76, 0x70, 0x61, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd3, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x70, - 0x61, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x19, 0x76, 0x70, 0x61, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x17, 0x76, 0x70, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x76, - 0x70, 0x61, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd5, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x43, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x70, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x76, 0x70, 0x61, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x76, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xd7, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x70, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x36, 0x0a, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0xdd, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0xde, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2e, - 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x34, - 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xe1, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, - 0x6e, 0x43, 0x70, 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe2, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x4d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe3, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x47, 0x0a, - 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0xe4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x70, - 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe5, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, - 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0xe7, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf0, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, - 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, - 0xb0, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x9d, 0x01, + 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc0, 0x01, + 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x51, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x14, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x22, 0xc2, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x12, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x74, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, + 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8d, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x22, 0xc0, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x51, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xc6, 0x01, 0x0a, + 0x0c, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, + 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, - 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, 0x01, 0x0a, - 0x0a, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x08, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0xc6, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x36, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x6a, 0x6f, 0x62, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x12, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x6f, + 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x27, 0x0a, 0x0f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x11, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xdc, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x61, 0x70, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x22, 0x70, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x70, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x70, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x24, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, + 0x53, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4c, 0x0a, 0x0b, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x70, + 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x70, 0x0a, 0x0b, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, + 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x0a, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, 0x53, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd0, + 0x02, 0x0a, 0x1c, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, + 0x51, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x52, + 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x79, 0x50, 0x6f, 0x64, + 0x73, 0x22, 0x98, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, + 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x3d, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, + 0xc6, 0x01, 0x0a, 0x0c, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, @@ -15792,933 +18018,571 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x62, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, - 0x6f, 0x62, 0x73, 0x12, 0x36, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0b, - 0x6a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x12, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0b, 0x4a, - 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x61, - 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x27, - 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, - 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x70, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x22, 0x70, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, - 0x69, 0x70, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, - 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x4c, 0x53, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4c, 0x0a, 0x0b, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x70, 0x0a, 0x0b, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x0e, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x70, 0x69, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x0a, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, 0x53, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xd0, 0x02, 0x0a, 0x1c, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x50, 0x6f, 0x64, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x46, 0x0a, - 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x90, 0x01, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x0c, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, - 0x50, 0x72, 0x6f, 0x62, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf5, 0x02, 0x0a, 0x17, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf5, 0x02, 0x0a, 0x17, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x35, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x3b, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, - 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa2, 0x01, 0x0a, 0x10, 0x50, 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, - 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x0e, 0x50, 0x56, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x29, 0x0a, 0x03, 0x63, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x63, 0x73, 0x69, 0x12, 0x39, 0x0a, 0x09, 0x68, 0x6f, - 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x29, 0x0a, 0x03, 0x6e, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x46, 0x53, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x6e, 0x66, 0x73, - 0x12, 0x59, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x3b, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xa5, 0x02, 0x0a, 0x0f, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5a, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x22, 0xa2, 0x01, 0x0a, 0x10, 0x50, 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x0e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x03, + 0x63, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x03, 0x63, 0x73, 0x69, 0x12, 0x39, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x29, 0x0a, 0x03, 0x6e, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x46, 0x53, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x6e, 0x66, 0x73, 0x12, 0x59, 0x0a, + 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x14, 0x48, 0x6f, 0x73, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5a, 0x0a, 0x0f, 0x4e, 0x46, 0x53, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xbe, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, - 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa5, 0x02, + 0x0a, 0x0f, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5a, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, - 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x14, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, + 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5a, 0x0a, 0x0f, 0x4e, 0x46, 0x53, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x22, 0xbe, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, + 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb7, 0x04, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x37, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, + 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x69, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6a, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdf, 0x03, 0x0a, 0x0b, 0x4e, 0x6f, - 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x08, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x0b, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x09, 0x4e, - 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x22, 0x3b, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, - 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8d, 0x03, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6f, 0x6f, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6f, 0x6f, 0x74, - 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x73, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x73, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x6c, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x75, 0x62, - 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x75, 0x62, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x40, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, - 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x68, 0x0a, 0x10, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x17, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x15, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x50, 0x0a, 0x0c, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3e, 0x0a, - 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, - 0x0a, 0x0e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x12, - 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x0c, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x54, 0x65, 0x72, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x10, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, - 0x12, 0x4c, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, - 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x0a, 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, - 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x59, 0x0a, 0x0e, 0x53, - 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe9, 0x01, 0x0a, 0x09, 0x48, 0x50, 0x41, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x29, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x22, 0x6b, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x86, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x45, 0x0a, 0x10, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x11, 0x48, - 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x7b, 0x0a, 0x12, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x22, 0x3b, 0x0a, 0x0b, + 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8d, 0x03, 0x0a, 0x0e, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x6f, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, + 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x75, 0x62, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x40, 0x0a, 0x09, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x68, 0x0a, + 0x10, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x54, 0x0a, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x52, 0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x12, 0x50, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x22, 0x3e, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x22, 0xa4, 0x01, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x4c, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x0a, 0x48, 0x50, 0x41, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x08, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x41, 0x0a, + 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x22, 0x59, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, + 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe9, 0x01, 0x0a, 0x09, + 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x50, + 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, + 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x35, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x6b, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, - 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x16, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, - 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa6, - 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x01, + 0x0a, 0x0f, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x12, 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8a, 0x01, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa9, 0x01, 0x0a, + 0x11, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7b, 0x0a, 0x12, 0x48, 0x50, 0x41, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x04, + 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, + 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x36, + 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x48, 0x50, + 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x16, 0x48, 0x50, + 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x12, 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x48, 0x50, 0x41, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x79, 0x0a, 0x0b, 0x48, 0x50, 0x41, 0x42, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x5f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x07, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x12, 0x36, 0x0a, 0x0a, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, - 0x6f, 0x77, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x73, 0x74, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x73, - 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, - 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0a, 0x56, 0x50, - 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x66, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x3c, 0x0a, - 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x42, 0x0a, 0x0f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x57, 0x0a, 0x0c, 0x56, 0x50, 0x41, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x55, 0x0a, 0x0f, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x66, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x51, 0x0a, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x22, 0xdf, 0x03, 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x53, 0x0a, 0x0b, 0x6d, 0x69, - 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, - 0x53, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x74, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x05, 0x0a, 0x1a, 0x56, 0x50, 0x41, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e, 0x01, 0x0a, + 0x0c, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x79, 0x0a, + 0x0b, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x07, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, + 0x12, 0x36, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, + 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, + 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x48, 0x50, 0x41, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xbc, + 0x02, 0x0a, 0x0a, 0x56, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x33, 0x0a, + 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x66, 0x12, 0x3c, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x57, 0x0a, + 0x0c, 0x56, 0x50, 0x41, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0f, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x66, 0x0a, + 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x51, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x53, 0x0a, 0x0b, 0x75, - 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x5f, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x6e, - 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, - 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, - 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x6e, - 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, - 0x0a, 0x0c, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x43, - 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x22, 0xd8, 0x05, 0x0a, 0x0e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a, 0x0e, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x03, 0x6d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x69, 0x6e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x67, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, - 0x2e, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, - 0x1a, 0x40, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xdf, 0x03, 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x53, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x61, + 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, + 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x74, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x19, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x05, + 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0b, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x53, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x5f, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x55, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x41, 0x0a, 0x13, 0x55, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, - 0x08, 0x4d, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x47, 0x0a, 0x19, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, - 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x1f, 0x61, 0x75, 0x74, 0x6f, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1c, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x75, 0x6c, 0x6c, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x70, 0x69, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x7e, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x30, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, - 0x22, 0x77, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x0d, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, - 0xe4, 0x02, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x3b, - 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, - 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, - 0x01, 0x0a, 0x19, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x85, 0x04, 0x0a, - 0x18, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x1a, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, @@ -16728,140 +18592,181 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x11, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2e, 0x4f, 0x74, - 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x1a, - 0x38, 0x0a, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x14, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xc5, 0x04, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, - 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x94, 0x04, 0x0a, 0x1a, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, - 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x2f, - 0x0a, 0x13, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, 0x69, 0x73, - 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x50, 0x6f, 0x64, 0x73, 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, 0x5f, 0x0a, 0x0f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x44, 0x0a, - 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x69, - 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x01, 0x0a, 0x1c, 0x50, 0x6f, 0x64, 0x44, 0x69, - 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa3, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x4d, 0x0a, 0x0b, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, - 0x3a, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, - 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, - 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x69, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xd8, 0x05, 0x0a, 0x0e, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x50, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x53, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x69, 0x6e, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, + 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x67, 0x0a, 0x17, + 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x14, 0x6d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x61, 0x74, 0x69, 0x6f, 0x1a, 0x40, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 0x61, + 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa8, 0x01, - 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x43, + 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x47, 0x0a, 0x19, 0x4d, 0x61, + 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, + 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, + 0x1f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x2c, + 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x50, 0x75, 0x6c, 0x6c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x84, + 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x65, 0x72, 0x62, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x7e, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x72, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x22, 0x77, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, + 0x0a, 0x0d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x22, 0xe4, 0x02, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x41, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, + 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x17, + 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xab, 0x01, 0x0a, 0x19, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, + 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x85, 0x04, 0x0a, 0x18, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x35, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x65, 0x66, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x39, + 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x1a, 0x4b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, @@ -16871,461 +18776,784 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc1, 0x02, 0x0a, 0x11, 0x56, 0x6f, 0x6c, - 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, - 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, - 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, - 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xa5, 0x01, 0x0a, - 0x13, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x54, - 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x8f, - 0x06, 0x0a, 0x17, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x70, - 0x61, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x69, 0x6e, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x11, 0x73, 0x70, 0x61, 0x72, 0x6b, - 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, - 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x73, 0x70, 0x61, - 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x12, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x61, 0x64, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x73, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x73, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x51, 0x0a, - 0x12, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x64, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xdc, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x65, - 0x62, 0x55, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, - 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x55, 0x69, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x77, 0x65, 0x62, 0x55, 0x69, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x69, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x69, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xa8, 0x02, 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, - 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x6e, 0x46, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, - 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, - 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x16, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x79, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x6f, 0x6e, 0x5f, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, - 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, 0x6f, 0x6e, - 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, - 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa1, 0x02, 0x0a, 0x1a, 0x53, - 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x61, - 0x78, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, - 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x68, - 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, - 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xad, - 0x05, 0x0a, 0x20, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, - 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x75, 0x6e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, 0x18, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x6c, 0x61, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, 0x0a, 0x19, - 0x70, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x16, 0x70, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, - 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x70, 0x61, 0x73, 0x74, 0x5f, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0f, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xab, - 0x0a, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, - 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, - 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, - 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x18, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x11, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x2e, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, + 0x0a, 0x14, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x22, 0x7e, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x22, 0xad, 0x06, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, + 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x27, + 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0x94, 0x04, 0x0a, 0x1a, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, + 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, + 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 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, 0x5f, + 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, + 0x64, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x44, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, + 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x01, 0x0a, 0x1c, 0x50, 0x6f, 0x64, + 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa3, 0x04, 0x0a, 0x14, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x0b, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x3a, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x55, 0x73, + 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, + 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, + 0x12, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xa8, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, + 0x61, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc1, 0x02, 0x0a, 0x11, 0x56, + 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, + 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x25, 0x0a, 0x0e, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x63, + 0x61, 0x6e, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xa5, + 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x63, 0x61, 0x6e, + 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x22, 0x8f, 0x06, 0x0a, 0x17, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x73, 0x70, 0x61, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, + 0x69, 0x6e, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x11, 0x73, 0x70, 0x61, + 0x72, 0x6b, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, + 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x73, + 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, + 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x5f, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x73, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, + 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x51, 0x0a, 0x12, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xdc, 0x02, 0x0a, 0x0f, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x77, 0x65, 0x62, 0x55, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x24, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x55, 0x69, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x77, 0x65, 0x62, + 0x55, 0x69, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, + 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x77, 0x65, 0x62, 0x5f, 0x75, 0x69, 0x5f, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x65, 0x62, 0x55, 0x69, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xa8, 0x02, 0x0a, 0x16, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x6e, + 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x39, + 0x0a, 0x19, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, + 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x16, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x1d, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x1a, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x24, + 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x20, 0x6f, 0x6e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, + 0x65, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xa1, 0x02, 0x0a, + 0x1a, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6d, 0x61, 0x78, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, + 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, + 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, + 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x73, 0x68, 0x75, 0x66, 0x66, 0x6c, + 0x65, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0xad, 0x05, 0x0a, 0x20, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, + 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x75, 0x6e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, 0x18, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x72, 0x75, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, + 0x0a, 0x19, 0x70, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x16, 0x70, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x70, 0x61, 0x73, + 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x73, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, + 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0xe1, 0x01, 0x0a, 0x14, 0x4b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, + 0x19, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x75, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, + 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, + 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x87, 0x02, 0x0a, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd8, + 0x02, 0x0a, 0x1a, 0x4b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x73, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x66, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x66, 0x61, 0x69, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x72, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x77, 0x61, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, + 0x69, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x34, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x23, 0x47, 0x61, + 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x72, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0xd7, 0x01, + 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x1b, 0x47, 0x61, 0x74, 0x65, + 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x65, + 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x4a, 0x73, + 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, + 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, - 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, - 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, - 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, - 0x61, 0x67, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x41, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, - 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, 0x0e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, - 0x74, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, - 0x74, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x77, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x69, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x5c, 0x0a, 0x0e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0xe9, 0x02, - 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6d, 0x70, 0x52, 0x0e, 0x61, 0x75, 0x64, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x3b, 0x0a, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x8d, 0x0c, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, + 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, + 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 0x12, 0x55, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x15, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x2f, 0x0a, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x64, 0x62, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, - 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0xc5, 0x0a, 0x0a, 0x0d, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, - 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, - 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x65, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, + 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, + 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x41, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x67, 0x65, 0x12, + 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x10, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x50, + 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x70, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xc9, 0x01, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, 0x0e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x75, 0x74, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x75, 0x74, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x32, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x0e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x22, 0xe9, 0x02, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, + 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, + 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0xf3, 0x0b, 0x0a, + 0x0d, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1f, + 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, - 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x52, 0x4f, 0x4e, - 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x52, - 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x08, 0x12, 0x1d, 0x0a, 0x19, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, - 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x09, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, - 0x44, 0x45, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, - 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0c, - 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x0d, 0x12, 0x1e, 0x0a, - 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x0e, 0x12, 0x25, 0x0a, - 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, - 0x4d, 0x45, 0x10, 0x0f, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, - 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, - 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x43, 0x4c, 0x41, - 0x53, 0x53, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x4f, 0x5f, 0x52, 0x4f, 0x4c, - 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, - 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, - 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, - 0x4c, 0x45, 0x52, 0x10, 0x13, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x49, 0x43, 0x41, - 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, - 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, 0x41, 0x4e, 0x47, - 0x45, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x41, - 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x16, 0x12, 0x18, 0x0a, 0x14, 0x4b, 0x38, 0x53, 0x5f, - 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, - 0x10, 0x17, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x5f, 0x53, 0x43, 0x41, - 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x19, 0x12, 0x26, 0x0a, 0x22, + 0x4e, 0x44, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, + 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x02, + 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x5f, 0x53, 0x45, 0x54, + 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, + 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, + 0x52, 0x4f, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x4b, 0x38, 0x53, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x50, + 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, + 0x4c, 0x45, 0x52, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x08, 0x12, 0x1d, + 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x09, 0x12, 0x18, 0x0a, + 0x14, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x0a, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x10, 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, + 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x0d, + 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x0e, + 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, + 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0f, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, + 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4c, 0x41, + 0x49, 0x4d, 0x10, 0x10, 0x12, 0x21, 0x0a, 0x1d, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, + 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x4f, 0x5f, + 0x52, 0x4f, 0x4c, 0x4c, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x4b, 0x38, 0x53, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x4f, 0x52, + 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, + 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x10, 0x13, 0x12, 0x2b, 0x0a, 0x27, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x45, 0x52, 0x54, + 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x53, 0x43, 0x41, + 0x4c, 0x45, 0x52, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x52, + 0x41, 0x4e, 0x47, 0x45, 0x10, 0x15, 0x12, 0x23, 0x0a, 0x1f, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x16, 0x12, 0x18, 0x0a, 0x14, 0x4b, + 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x17, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x45, 0x44, 0x41, 0x5f, + 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x19, 0x12, + 0x26, 0x0a, 0x22, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x44, + 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, + 0x10, 0x1b, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x51, + 0x55, 0x4f, 0x54, 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x46, 0x4c, + 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x1d, 0x12, 0x1f, 0x0a, + 0x1b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x56, 0x4f, 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x1e, 0x12, 0x1a, + 0x0a, 0x16, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, + 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, + 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x21, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x22, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4e, + 0x50, 0x47, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x23, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, - 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x52, - 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x10, 0x1b, 0x12, - 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x51, 0x55, 0x4f, 0x54, - 0x41, 0x10, 0x1c, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x46, 0x4c, 0x4f, 0x57, 0x5f, - 0x4e, 0x4f, 0x54, 0x45, 0x42, 0x4f, 0x4f, 0x4b, 0x10, 0x1d, 0x12, 0x1f, 0x0a, 0x1b, 0x4b, 0x38, - 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x56, 0x4f, - 0x4c, 0x43, 0x41, 0x4e, 0x4f, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x1e, 0x12, 0x1a, 0x0a, 0x16, 0x4b, - 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, - 0x45, 0x43, 0x52, 0x45, 0x54, 0x10, 0x1f, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, - 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x55, - 0x53, 0x54, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x21, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, - 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x22, 0x12, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4e, 0x50, 0x47, 0x5f, - 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x23, 0x12, 0x25, 0x0a, 0x21, 0x4b, 0x38, 0x53, - 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x50, 0x41, - 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, - 0x12, 0x2f, 0x0a, 0x2b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x50, - 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x25, 0x2a, 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, 0x75, 0x6d, - 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, 0x4e, 0x55, - 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, - 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, 0x0a, 0x15, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, - 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, - 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x22, - 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, - 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x58, - 0x49, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, + 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x24, 0x12, 0x2f, 0x0a, 0x2b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, + 0x5f, 0x53, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x59, 0x56, 0x45, 0x52, 0x4e, 0x4f, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x26, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x59, 0x56, 0x45, + 0x52, 0x4e, 0x4f, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, + 0x54, 0x10, 0x27, 0x12, 0x32, 0x0a, 0x2e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x4b, 0x45, 0x45, 0x50, 0x45, + 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x54, 0x45, 0x4d, + 0x50, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x28, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x4b, + 0x45, 0x45, 0x50, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, + 0x10, 0x29, 0x2a, 0x48, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x45, 0x6e, 0x75, + 0x6d, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, 0x59, 0x5f, 0x45, 0x4e, + 0x55, 0x4d, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x42, + 0x59, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x94, 0x02, 0x0a, + 0x15, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x23, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, - 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, - 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x47, 0x54, - 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4c, 0x54, - 0x10, 0x06, 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x22, 0x57, + 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, + 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, + 0x4e, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x45, + 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4c, 0x41, 0x42, 0x45, 0x4c, + 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x4f, 0x52, 0x5f, 0x44, 0x4f, 0x45, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x53, + 0x54, 0x10, 0x04, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x47, + 0x54, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x45, 0x4c, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4c, + 0x54, 0x10, 0x06, 0x2a, 0xa6, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x22, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, + 0x52, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, - 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, - 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x42, 0x89, 0x01, 0x0a, 0x0a, - 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, - 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 0x72, 0x2f, - 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, - 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, - 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x2a, 0xea, 0x03, 0x0a, + 0x15, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x29, 0x0a, 0x25, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x44, 0x42, 0x5f, 0x56, + 0x49, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x35, 0x0a, 0x31, 0x44, 0x49, + 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x49, 0x53, + 0x52, 0x55, 0x50, 0x54, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x02, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, + 0x0a, 0x1d, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x55, 0x4e, 0x4e, 0x45, 0x45, 0x44, 0x45, 0x44, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x45, + 0x4e, 0x4f, 0x55, 0x47, 0x48, 0x10, 0x05, 0x12, 0x31, 0x0a, 0x2d, 0x44, 0x49, 0x53, 0x52, 0x55, + 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x4d, + 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x53, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x44, 0x49, + 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x4d, 0x49, 0x4e, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x07, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, + 0x45, 0x54, 0x10, 0x08, 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x50, 0x4f, 0x44, 0x53, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, + 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x09, 0x42, 0x89, 0x01, 0x0a, 0x0a, 0x63, 0x6f, + 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, + 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, + 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, + 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -17340,455 +19568,485 @@ func file_api_v1_common_proto_rawDescGZIP() []byte { return file_api_v1_common_proto_rawDescData } -var file_api_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 172) +var file_api_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 186) var file_api_v1_common_proto_goTypes = []interface{}{ - (K8SObjectKind)(0), // 0: api.v1.K8sObjectKind - (OrderByEnum)(0), // 1: api.v1.OrderByEnum - (LabelSelectorOperator)(0), // 2: api.v1.LabelSelectorOperator - (WorkloadStatusFilter)(0), // 3: api.v1.WorkloadStatusFilter - (*AuditLogEntry)(nil), // 4: api.v1.AuditLogEntry - (*Pagination)(nil), // 5: api.v1.Pagination - (*CostInfo)(nil), // 6: api.v1.CostInfo - (*ResourceMetrics)(nil), // 7: api.v1.ResourceMetrics - (*MetricPercentiles)(nil), // 8: api.v1.MetricPercentiles - (*ContainerPercentileSummary)(nil), // 9: api.v1.ContainerPercentileSummary - (*ContainerRequestLimits)(nil), // 10: api.v1.ContainerRequestLimits - (*ForecastResourceMetrics)(nil), // 11: api.v1.ForecastResourceMetrics - (*ResourceSummary)(nil), // 12: api.v1.ResourceSummary - (*WorkloadItem)(nil), // 13: api.v1.WorkloadItem - (*ContainerRuntimeInfo)(nil), // 14: api.v1.ContainerRuntimeInfo - (*NodeInfo)(nil), // 15: api.v1.NodeInfo - (*ResourceInfo)(nil), // 16: api.v1.ResourceInfo - (*Node)(nil), // 17: api.v1.Node - (*AttachedVolume)(nil), // 18: api.v1.AttachedVolume - (*NodeGroup)(nil), // 19: api.v1.NodeGroup - (*CostDataPoint)(nil), // 20: api.v1.CostDataPoint - (*ResourceDataPoint)(nil), // 21: api.v1.ResourceDataPoint - (*ContainerTimeSeries)(nil), // 22: api.v1.ContainerTimeSeries - (*SavingsData)(nil), // 23: api.v1.SavingsData - (*SavingsDataPoint)(nil), // 24: api.v1.SavingsDataPoint - (*SavingsTimeSeries)(nil), // 25: api.v1.SavingsTimeSeries - (*LabelSelectorRequirement)(nil), // 26: api.v1.LabelSelectorRequirement - (*Label)(nil), // 27: api.v1.Label - (*LabelSelector)(nil), // 28: api.v1.LabelSelector - (*RegexPattern)(nil), // 29: api.v1.RegexPattern - (*ResourceDetails)(nil), // 30: api.v1.ResourceDetails - (*PodDetails)(nil), // 31: api.v1.PodDetails - (*ContainerSummary)(nil), // 32: api.v1.ContainerSummary - (*DeploymentDetails)(nil), // 33: api.v1.DeploymentDetails - (*ContainerTemplate)(nil), // 34: api.v1.ContainerTemplate - (*DeploymentCondition)(nil), // 35: api.v1.DeploymentCondition - (*StatefulSetDetails)(nil), // 36: api.v1.StatefulSetDetails - (*VolumeClaimTemplate)(nil), // 37: api.v1.VolumeClaimTemplate - (*DaemonSetDetails)(nil), // 38: api.v1.DaemonSetDetails - (*ReplicaSetDetails)(nil), // 39: api.v1.ReplicaSetDetails - (*JobDetails)(nil), // 40: api.v1.JobDetails - (*JobCondition)(nil), // 41: api.v1.JobCondition - (*CronJobDetails)(nil), // 42: api.v1.CronJobDetails - (*ActiveJobReference)(nil), // 43: api.v1.ActiveJobReference - (*JobTemplate)(nil), // 44: api.v1.JobTemplate - (*ServiceDetails)(nil), // 45: api.v1.ServiceDetails - (*ServicePort)(nil), // 46: api.v1.ServicePort - (*LoadBalancerIngress)(nil), // 47: api.v1.LoadBalancerIngress - (*IngressDetails)(nil), // 48: api.v1.IngressDetails - (*IngressRule)(nil), // 49: api.v1.IngressRule - (*IngressPath)(nil), // 50: api.v1.IngressPath - (*IngressBackend)(nil), // 51: api.v1.IngressBackend - (*IngressTLS)(nil), // 52: api.v1.IngressTLS - (*PersistentVolumeClaimDetails)(nil), // 53: api.v1.PersistentVolumeClaimDetails - (*ResourceRequirements)(nil), // 54: api.v1.ResourceRequirements - (*VolumeNodeAffinity)(nil), // 55: api.v1.VolumeNodeAffinity - (*PVCCondition)(nil), // 56: api.v1.PVCCondition - (*PersistentVolumeDetails)(nil), // 57: api.v1.PersistentVolumeDetails - (*PVClaimReference)(nil), // 58: api.v1.PVClaimReference - (*PVVolumeSource)(nil), // 59: api.v1.PVVolumeSource - (*CSIVolumeSource)(nil), // 60: api.v1.CSIVolumeSource - (*HostPathVolumeSource)(nil), // 61: api.v1.HostPathVolumeSource - (*NFSVolumeSource)(nil), // 62: api.v1.NFSVolumeSource - (*StorageClassDetails)(nil), // 63: api.v1.StorageClassDetails - (*NamespaceDetails)(nil), // 64: api.v1.NamespaceDetails - (*NodeDetails)(nil), // 65: api.v1.NodeDetails - (*NodeTaint)(nil), // 66: api.v1.NodeTaint - (*NodeAddress)(nil), // 67: api.v1.NodeAddress - (*NodeCondition)(nil), // 68: api.v1.NodeCondition - (*NodeSystemInfo)(nil), // 69: api.v1.NodeSystemInfo - (*NodeImage)(nil), // 70: api.v1.NodeImage - (*TopologySelector)(nil), // 71: api.v1.TopologySelector - (*TopologySelectorTerm)(nil), // 72: api.v1.TopologySelectorTerm - (*TolerationInfo)(nil), // 73: api.v1.TolerationInfo - (*NodeSelector)(nil), // 74: api.v1.NodeSelector - (*NodeSelectorTerm)(nil), // 75: api.v1.NodeSelectorTerm - (*NodeSelectorRequirement)(nil), // 76: api.v1.NodeSelectorRequirement - (*HPADetails)(nil), // 77: api.v1.HPADetails - (*ScaleTargetRef)(nil), // 78: api.v1.ScaleTargetRef - (*HPAMetric)(nil), // 79: api.v1.HPAMetric - (*HPAResourceMetric)(nil), // 80: api.v1.HPAResourceMetric - (*HPAPodsMetric)(nil), // 81: api.v1.HPAPodsMetric - (*HPAObjectMetric)(nil), // 82: api.v1.HPAObjectMetric - (*HPAExternalMetric)(nil), // 83: api.v1.HPAExternalMetric - (*HPAMetricSelector)(nil), // 84: api.v1.HPAMetricSelector - (*HPAObjectReference)(nil), // 85: api.v1.HPAObjectReference - (*HPACurrentMetric)(nil), // 86: api.v1.HPACurrentMetric - (*HPACurrentResourceMetric)(nil), // 87: api.v1.HPACurrentResourceMetric - (*HPACurrentPodsMetric)(nil), // 88: api.v1.HPACurrentPodsMetric - (*HPACurrentObjectMetric)(nil), // 89: api.v1.HPACurrentObjectMetric - (*HPACurrentExternalMetric)(nil), // 90: api.v1.HPACurrentExternalMetric - (*HPACondition)(nil), // 91: api.v1.HPACondition - (*HPABehavior)(nil), // 92: api.v1.HPABehavior - (*HPAScalingRules)(nil), // 93: api.v1.HPAScalingRules - (*HPAScalingPolicy)(nil), // 94: api.v1.HPAScalingPolicy - (*VPADetails)(nil), // 95: api.v1.VPADetails - (*VPATargetRef)(nil), // 96: api.v1.VPATargetRef - (*VPAUpdatePolicy)(nil), // 97: api.v1.VPAUpdatePolicy - (*VPAResourcePolicy)(nil), // 98: api.v1.VPAResourcePolicy - (*VPAContainerResourcePolicy)(nil), // 99: api.v1.VPAContainerResourcePolicy - (*VPARecommendation)(nil), // 100: api.v1.VPARecommendation - (*VPAContainerRecommendation)(nil), // 101: api.v1.VPAContainerRecommendation - (*VPACondition)(nil), // 102: api.v1.VPACondition - (*LimitRangeDetails)(nil), // 103: api.v1.LimitRangeDetails - (*LimitRangeItem)(nil), // 104: api.v1.LimitRangeItem - (*ServiceAccountDetails)(nil), // 105: api.v1.ServiceAccountDetails - (*RoleDetails)(nil), // 106: api.v1.RoleDetails - (*RoleRule)(nil), // 107: api.v1.RoleRule - (*RoleBindingDetails)(nil), // 108: api.v1.RoleBindingDetails - (*RoleBindingSubject)(nil), // 109: api.v1.RoleBindingSubject - (*RoleReference)(nil), // 110: api.v1.RoleReference - (*KedaScaledObjectDetails)(nil), // 111: api.v1.KedaScaledObjectDetails - (*KedaScaledObjectTrigger)(nil), // 112: api.v1.KedaScaledObjectTrigger - (*KedaScaledObjectCondition)(nil), // 113: api.v1.KedaScaledObjectCondition - (*KarpenterResourceDetails)(nil), // 114: api.v1.KarpenterResourceDetails - (*KarpenterResourceCondition)(nil), // 115: api.v1.KarpenterResourceCondition - (*KarpenterCapacity)(nil), // 116: api.v1.KarpenterCapacity - (*KarpenterRequirement)(nil), // 117: api.v1.KarpenterRequirement - (*WorkloadFilters)(nil), // 118: api.v1.WorkloadFilters - (*PodDisruptionBudgetDetails)(nil), // 119: api.v1.PodDisruptionBudgetDetails - (*PodDisruptionBudgetCondition)(nil), // 120: api.v1.PodDisruptionBudgetCondition - (*ResourceQuotaDetails)(nil), // 121: api.v1.ResourceQuotaDetails - (*ResourceQuotaCondition)(nil), // 122: api.v1.ResourceQuotaCondition - (*VolcanoJobDetails)(nil), // 123: api.v1.VolcanoJobDetails - (*VolcanoJobCondition)(nil), // 124: api.v1.VolcanoJobCondition - (*VolcanoTask)(nil), // 125: api.v1.VolcanoTask - (*SparkApplicationDetails)(nil), // 126: api.v1.SparkApplicationDetails - (*SparkDriverInfo)(nil), // 127: api.v1.SparkDriverInfo - (*SparkRestartPolicyInfo)(nil), // 128: api.v1.SparkRestartPolicyInfo - (*SparkDynamicAllocationInfo)(nil), // 129: api.v1.SparkDynamicAllocationInfo - (*ScheduledSparkApplicationDetails)(nil), // 130: api.v1.ScheduledSparkApplicationDetails - (*Event)(nil), // 131: api.v1.Event - (*EventDatapointInfo)(nil), // 132: api.v1.EventDatapointInfo - (*EventDatapoint)(nil), // 133: api.v1.EventDatapoint - (*DimensionCount)(nil), // 134: api.v1.DimensionCount - (*EventGroup)(nil), // 135: api.v1.EventGroup - nil, // 136: api.v1.WorkloadItem.LabelsEntry - nil, // 137: api.v1.WorkloadItem.AnnotationsEntry - nil, // 138: api.v1.NodeInfo.PriceSourceCountsEntry - nil, // 139: api.v1.Node.LabelsEntry - nil, // 140: api.v1.Node.AnnotationsEntry - nil, // 141: api.v1.LabelSelector.MatchLabelsEntry - nil, // 142: api.v1.ResourceDetails.ServiceSelectorEntry - nil, // 143: api.v1.ResourceDetails.ScParametersEntry - nil, // 144: api.v1.ServiceDetails.SelectorEntry - nil, // 145: api.v1.ResourceRequirements.RequestsEntry - nil, // 146: api.v1.ResourceRequirements.LimitsEntry - nil, // 147: api.v1.PersistentVolumeDetails.CapacityEntry - nil, // 148: api.v1.PVVolumeSource.VolumeAttributesEntry - nil, // 149: api.v1.CSIVolumeSource.VolumeAttributesEntry - nil, // 150: api.v1.StorageClassDetails.ParametersEntry - nil, // 151: api.v1.NamespaceDetails.ConditionsEntry - nil, // 152: api.v1.NodeDetails.CapacityEntry - nil, // 153: api.v1.NodeDetails.AllocatableEntry - nil, // 154: api.v1.TopologySelectorTerm.MatchLabelsEntry - nil, // 155: api.v1.HPAMetricSelector.SelectorEntry - nil, // 156: api.v1.VPAContainerResourcePolicy.MinAllowedEntry - nil, // 157: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - nil, // 158: api.v1.VPAContainerRecommendation.TargetEntry - nil, // 159: api.v1.VPAContainerRecommendation.LowerBoundEntry - nil, // 160: api.v1.VPAContainerRecommendation.UpperBoundEntry - nil, // 161: api.v1.VPAContainerRecommendation.UncappedTargetEntry - nil, // 162: api.v1.LimitRangeItem.DefaultLimitsEntry - nil, // 163: api.v1.LimitRangeItem.DefaultRequestEntry - nil, // 164: api.v1.LimitRangeItem.MaxEntry - nil, // 165: api.v1.LimitRangeItem.MinEntry - nil, // 166: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - nil, // 167: api.v1.KedaScaledObjectTrigger.MetadataEntry - nil, // 168: api.v1.KarpenterResourceDetails.LimitsEntry - nil, // 169: api.v1.KarpenterCapacity.OtherEntry - nil, // 170: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - nil, // 171: api.v1.ResourceQuotaDetails.HardLimitsEntry - nil, // 172: api.v1.ResourceQuotaDetails.UsedEntry - nil, // 173: api.v1.ResourceQuotaDetails.ScopeSelectorEntry - nil, // 174: api.v1.Event.AnnotationsEntry - nil, // 175: api.v1.Event.LabelsEntry - (*timestamppb.Timestamp)(nil), // 176: google.protobuf.Timestamp - (*money.Money)(nil), // 177: google.type.Money + (K8SObjectKind)(0), // 0: api.v1.K8sObjectKind + (OrderByEnum)(0), // 1: api.v1.OrderByEnum + (LabelSelectorOperator)(0), // 2: api.v1.LabelSelectorOperator + (WorkloadStatusFilter)(0), // 3: api.v1.WorkloadStatusFilter + (DisruptionBlockReason)(0), // 4: api.v1.DisruptionBlockReason + (*AuditLogEntry)(nil), // 5: api.v1.AuditLogEntry + (*Pagination)(nil), // 6: api.v1.Pagination + (*CostInfo)(nil), // 7: api.v1.CostInfo + (*ResourceMetrics)(nil), // 8: api.v1.ResourceMetrics + (*MetricPercentiles)(nil), // 9: api.v1.MetricPercentiles + (*ContainerPercentileSummary)(nil), // 10: api.v1.ContainerPercentileSummary + (*ContainerRequestLimits)(nil), // 11: api.v1.ContainerRequestLimits + (*GPUMigInstance)(nil), // 12: api.v1.GPUMigInstance + (*IndividualGPUMetric)(nil), // 13: api.v1.IndividualGPUMetric + (*ContainerIndividualGPUMetrics)(nil), // 14: api.v1.ContainerIndividualGPUMetrics + (*RuntimeProcess)(nil), // 15: api.v1.RuntimeProcess + (*ForecastResourceMetrics)(nil), // 16: api.v1.ForecastResourceMetrics + (*ResourceSummary)(nil), // 17: api.v1.ResourceSummary + (*LegacyPolicyRef)(nil), // 18: api.v1.LegacyPolicyRef + (*OptimizationStatus)(nil), // 19: api.v1.OptimizationStatus + (*WorkloadItem)(nil), // 20: api.v1.WorkloadItem + (*ContainerRuntimeInfo)(nil), // 21: api.v1.ContainerRuntimeInfo + (*NodeInfo)(nil), // 22: api.v1.NodeInfo + (*ResourceInfo)(nil), // 23: api.v1.ResourceInfo + (*Node)(nil), // 24: api.v1.Node + (*AttachedVolume)(nil), // 25: api.v1.AttachedVolume + (*NodeGroup)(nil), // 26: api.v1.NodeGroup + (*CostDataPoint)(nil), // 27: api.v1.CostDataPoint + (*ResourceDataPoint)(nil), // 28: api.v1.ResourceDataPoint + (*ContainerTimeSeries)(nil), // 29: api.v1.ContainerTimeSeries + (*SavingsData)(nil), // 30: api.v1.SavingsData + (*SavingsDataPoint)(nil), // 31: api.v1.SavingsDataPoint + (*SavingsTimeSeries)(nil), // 32: api.v1.SavingsTimeSeries + (*LabelSelectorRequirement)(nil), // 33: api.v1.LabelSelectorRequirement + (*Label)(nil), // 34: api.v1.Label + (*LabelSelector)(nil), // 35: api.v1.LabelSelector + (*RegexPattern)(nil), // 36: api.v1.RegexPattern + (*ResourceDetails)(nil), // 37: api.v1.ResourceDetails + (*PodDetails)(nil), // 38: api.v1.PodDetails + (*ContainerSummary)(nil), // 39: api.v1.ContainerSummary + (*DeploymentDetails)(nil), // 40: api.v1.DeploymentDetails + (*ContainerTemplate)(nil), // 41: api.v1.ContainerTemplate + (*DeploymentCondition)(nil), // 42: api.v1.DeploymentCondition + (*StatefulSetDetails)(nil), // 43: api.v1.StatefulSetDetails + (*VolumeClaimTemplate)(nil), // 44: api.v1.VolumeClaimTemplate + (*DaemonSetDetails)(nil), // 45: api.v1.DaemonSetDetails + (*ReplicaSetDetails)(nil), // 46: api.v1.ReplicaSetDetails + (*JobDetails)(nil), // 47: api.v1.JobDetails + (*JobCondition)(nil), // 48: api.v1.JobCondition + (*CronJobDetails)(nil), // 49: api.v1.CronJobDetails + (*ActiveJobReference)(nil), // 50: api.v1.ActiveJobReference + (*JobTemplate)(nil), // 51: api.v1.JobTemplate + (*ServiceDetails)(nil), // 52: api.v1.ServiceDetails + (*ServicePort)(nil), // 53: api.v1.ServicePort + (*LoadBalancerIngress)(nil), // 54: api.v1.LoadBalancerIngress + (*IngressDetails)(nil), // 55: api.v1.IngressDetails + (*IngressRule)(nil), // 56: api.v1.IngressRule + (*IngressPath)(nil), // 57: api.v1.IngressPath + (*IngressBackend)(nil), // 58: api.v1.IngressBackend + (*IngressTLS)(nil), // 59: api.v1.IngressTLS + (*PersistentVolumeClaimDetails)(nil), // 60: api.v1.PersistentVolumeClaimDetails + (*ResourceRequirements)(nil), // 61: api.v1.ResourceRequirements + (*VolumeNodeAffinity)(nil), // 62: api.v1.VolumeNodeAffinity + (*PVCCondition)(nil), // 63: api.v1.PVCCondition + (*PersistentVolumeDetails)(nil), // 64: api.v1.PersistentVolumeDetails + (*PVClaimReference)(nil), // 65: api.v1.PVClaimReference + (*PVVolumeSource)(nil), // 66: api.v1.PVVolumeSource + (*CSIVolumeSource)(nil), // 67: api.v1.CSIVolumeSource + (*HostPathVolumeSource)(nil), // 68: api.v1.HostPathVolumeSource + (*NFSVolumeSource)(nil), // 69: api.v1.NFSVolumeSource + (*StorageClassDetails)(nil), // 70: api.v1.StorageClassDetails + (*NamespaceDetails)(nil), // 71: api.v1.NamespaceDetails + (*NodeDetails)(nil), // 72: api.v1.NodeDetails + (*NodeTaint)(nil), // 73: api.v1.NodeTaint + (*NodeAddress)(nil), // 74: api.v1.NodeAddress + (*NodeCondition)(nil), // 75: api.v1.NodeCondition + (*NodeSystemInfo)(nil), // 76: api.v1.NodeSystemInfo + (*NodeImage)(nil), // 77: api.v1.NodeImage + (*TopologySelector)(nil), // 78: api.v1.TopologySelector + (*TopologySelectorTerm)(nil), // 79: api.v1.TopologySelectorTerm + (*TolerationInfo)(nil), // 80: api.v1.TolerationInfo + (*NodeSelector)(nil), // 81: api.v1.NodeSelector + (*NodeSelectorTerm)(nil), // 82: api.v1.NodeSelectorTerm + (*NodeSelectorRequirement)(nil), // 83: api.v1.NodeSelectorRequirement + (*HPADetails)(nil), // 84: api.v1.HPADetails + (*ScaleTargetRef)(nil), // 85: api.v1.ScaleTargetRef + (*HPAMetric)(nil), // 86: api.v1.HPAMetric + (*HPAResourceMetric)(nil), // 87: api.v1.HPAResourceMetric + (*HPAPodsMetric)(nil), // 88: api.v1.HPAPodsMetric + (*HPAObjectMetric)(nil), // 89: api.v1.HPAObjectMetric + (*HPAExternalMetric)(nil), // 90: api.v1.HPAExternalMetric + (*HPAMetricSelector)(nil), // 91: api.v1.HPAMetricSelector + (*HPAObjectReference)(nil), // 92: api.v1.HPAObjectReference + (*HPACurrentMetric)(nil), // 93: api.v1.HPACurrentMetric + (*HPACurrentResourceMetric)(nil), // 94: api.v1.HPACurrentResourceMetric + (*HPACurrentPodsMetric)(nil), // 95: api.v1.HPACurrentPodsMetric + (*HPACurrentObjectMetric)(nil), // 96: api.v1.HPACurrentObjectMetric + (*HPACurrentExternalMetric)(nil), // 97: api.v1.HPACurrentExternalMetric + (*HPACondition)(nil), // 98: api.v1.HPACondition + (*HPABehavior)(nil), // 99: api.v1.HPABehavior + (*HPAScalingRules)(nil), // 100: api.v1.HPAScalingRules + (*HPAScalingPolicy)(nil), // 101: api.v1.HPAScalingPolicy + (*VPADetails)(nil), // 102: api.v1.VPADetails + (*VPATargetRef)(nil), // 103: api.v1.VPATargetRef + (*VPAUpdatePolicy)(nil), // 104: api.v1.VPAUpdatePolicy + (*VPAResourcePolicy)(nil), // 105: api.v1.VPAResourcePolicy + (*VPAContainerResourcePolicy)(nil), // 106: api.v1.VPAContainerResourcePolicy + (*VPARecommendation)(nil), // 107: api.v1.VPARecommendation + (*VPAContainerRecommendation)(nil), // 108: api.v1.VPAContainerRecommendation + (*VPACondition)(nil), // 109: api.v1.VPACondition + (*LimitRangeDetails)(nil), // 110: api.v1.LimitRangeDetails + (*LimitRangeItem)(nil), // 111: api.v1.LimitRangeItem + (*ServiceAccountDetails)(nil), // 112: api.v1.ServiceAccountDetails + (*RoleDetails)(nil), // 113: api.v1.RoleDetails + (*RoleRule)(nil), // 114: api.v1.RoleRule + (*RoleBindingDetails)(nil), // 115: api.v1.RoleBindingDetails + (*RoleBindingSubject)(nil), // 116: api.v1.RoleBindingSubject + (*RoleReference)(nil), // 117: api.v1.RoleReference + (*KedaScaledObjectDetails)(nil), // 118: api.v1.KedaScaledObjectDetails + (*KedaScaledObjectTrigger)(nil), // 119: api.v1.KedaScaledObjectTrigger + (*KedaScaledObjectCondition)(nil), // 120: api.v1.KedaScaledObjectCondition + (*KarpenterResourceDetails)(nil), // 121: api.v1.KarpenterResourceDetails + (*KarpenterResourceCondition)(nil), // 122: api.v1.KarpenterResourceCondition + (*KarpenterCapacity)(nil), // 123: api.v1.KarpenterCapacity + (*KarpenterRequirement)(nil), // 124: api.v1.KarpenterRequirement + (*ResourceFieldFilter)(nil), // 125: api.v1.ResourceFieldFilter + (*ResourceFilterFieldOptions)(nil), // 126: api.v1.ResourceFilterFieldOptions + (*WorkloadFilters)(nil), // 127: api.v1.WorkloadFilters + (*PodDisruptionBudgetDetails)(nil), // 128: api.v1.PodDisruptionBudgetDetails + (*PodDisruptionBudgetCondition)(nil), // 129: api.v1.PodDisruptionBudgetCondition + (*ResourceQuotaDetails)(nil), // 130: api.v1.ResourceQuotaDetails + (*ResourceQuotaCondition)(nil), // 131: api.v1.ResourceQuotaCondition + (*VolcanoJobDetails)(nil), // 132: api.v1.VolcanoJobDetails + (*VolcanoJobCondition)(nil), // 133: api.v1.VolcanoJobCondition + (*VolcanoTask)(nil), // 134: api.v1.VolcanoTask + (*SparkApplicationDetails)(nil), // 135: api.v1.SparkApplicationDetails + (*SparkDriverInfo)(nil), // 136: api.v1.SparkDriverInfo + (*SparkRestartPolicyInfo)(nil), // 137: api.v1.SparkRestartPolicyInfo + (*SparkDynamicAllocationInfo)(nil), // 138: api.v1.SparkDynamicAllocationInfo + (*ScheduledSparkApplicationDetails)(nil), // 139: api.v1.ScheduledSparkApplicationDetails + (*KyvernoPolicyDetails)(nil), // 140: api.v1.KyvernoPolicyDetails + (*PolicyReportResult)(nil), // 141: api.v1.PolicyReportResult + (*KyvernoPolicyReportDetails)(nil), // 142: api.v1.KyvernoPolicyReportDetails + (*GatekeeperConstraintTemplateDetails)(nil), // 143: api.v1.GatekeeperConstraintTemplateDetails + (*ConstraintViolation)(nil), // 144: api.v1.ConstraintViolation + (*GatekeeperConstraintDetails)(nil), // 145: api.v1.GatekeeperConstraintDetails + (*Event)(nil), // 146: api.v1.Event + (*EventDatapointInfo)(nil), // 147: api.v1.EventDatapointInfo + (*EventDatapoint)(nil), // 148: api.v1.EventDatapoint + (*DimensionCount)(nil), // 149: api.v1.DimensionCount + (*EventGroup)(nil), // 150: api.v1.EventGroup + nil, // 151: api.v1.WorkloadItem.LabelsEntry + nil, // 152: api.v1.WorkloadItem.AnnotationsEntry + nil, // 153: api.v1.NodeInfo.PriceSourceCountsEntry + nil, // 154: api.v1.Node.LabelsEntry + nil, // 155: api.v1.Node.AnnotationsEntry + nil, // 156: api.v1.LabelSelector.MatchLabelsEntry + nil, // 157: api.v1.ResourceDetails.ServiceSelectorEntry + nil, // 158: api.v1.ResourceDetails.ScParametersEntry + nil, // 159: api.v1.ServiceDetails.SelectorEntry + nil, // 160: api.v1.ResourceRequirements.RequestsEntry + nil, // 161: api.v1.ResourceRequirements.LimitsEntry + nil, // 162: api.v1.PersistentVolumeDetails.CapacityEntry + nil, // 163: api.v1.PVVolumeSource.VolumeAttributesEntry + nil, // 164: api.v1.CSIVolumeSource.VolumeAttributesEntry + nil, // 165: api.v1.StorageClassDetails.ParametersEntry + nil, // 166: api.v1.NamespaceDetails.ConditionsEntry + nil, // 167: api.v1.NodeDetails.CapacityEntry + nil, // 168: api.v1.NodeDetails.AllocatableEntry + nil, // 169: api.v1.TopologySelectorTerm.MatchLabelsEntry + nil, // 170: api.v1.HPAMetricSelector.SelectorEntry + nil, // 171: api.v1.VPAContainerResourcePolicy.MinAllowedEntry + nil, // 172: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + nil, // 173: api.v1.VPAContainerRecommendation.TargetEntry + nil, // 174: api.v1.VPAContainerRecommendation.LowerBoundEntry + nil, // 175: api.v1.VPAContainerRecommendation.UpperBoundEntry + nil, // 176: api.v1.VPAContainerRecommendation.UncappedTargetEntry + nil, // 177: api.v1.LimitRangeItem.DefaultLimitsEntry + nil, // 178: api.v1.LimitRangeItem.DefaultRequestEntry + nil, // 179: api.v1.LimitRangeItem.MaxEntry + nil, // 180: api.v1.LimitRangeItem.MinEntry + nil, // 181: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + nil, // 182: api.v1.KedaScaledObjectTrigger.MetadataEntry + nil, // 183: api.v1.KarpenterResourceDetails.LimitsEntry + nil, // 184: api.v1.KarpenterCapacity.OtherEntry + nil, // 185: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + nil, // 186: api.v1.ResourceQuotaDetails.HardLimitsEntry + nil, // 187: api.v1.ResourceQuotaDetails.UsedEntry + nil, // 188: api.v1.ResourceQuotaDetails.ScopeSelectorEntry + nil, // 189: api.v1.Event.AnnotationsEntry + nil, // 190: api.v1.Event.LabelsEntry + (*timestamppb.Timestamp)(nil), // 191: google.protobuf.Timestamp + (*money.Money)(nil), // 192: google.type.Money } var file_api_v1_common_proto_depIdxs = []int32{ 0, // 0: api.v1.AuditLogEntry.workload_type:type_name -> api.v1.K8sObjectKind - 176, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp - 176, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp + 191, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp + 191, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp 1, // 3: api.v1.Pagination.order_by:type_name -> api.v1.OrderByEnum - 177, // 4: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money - 177, // 5: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money - 177, // 6: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money - 177, // 7: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money - 177, // 8: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money - 177, // 9: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money - 177, // 10: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money - 177, // 11: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money - 177, // 12: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money - 177, // 13: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money - 177, // 14: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money - 177, // 15: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money - 177, // 16: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money - 177, // 17: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money - 177, // 18: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money - 177, // 19: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money - 177, // 20: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money - 177, // 21: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money - 177, // 22: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money - 177, // 23: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money - 177, // 24: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money - 177, // 25: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money - 8, // 26: api.v1.ContainerPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles - 8, // 27: api.v1.ContainerPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles - 8, // 28: api.v1.ContainerPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles - 8, // 29: api.v1.ContainerPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles - 8, // 30: api.v1.ContainerPercentileSummary.cpu_limit:type_name -> api.v1.MetricPercentiles - 8, // 31: api.v1.ContainerPercentileSummary.memory_limit:type_name -> api.v1.MetricPercentiles - 8, // 32: api.v1.ContainerPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles - 8, // 33: api.v1.ContainerPercentileSummary.gpu_vram_usage:type_name -> api.v1.MetricPercentiles - 8, // 34: api.v1.ContainerPercentileSummary.network_receive_bytes:type_name -> api.v1.MetricPercentiles - 8, // 35: api.v1.ContainerPercentileSummary.network_transmit_bytes:type_name -> api.v1.MetricPercentiles - 8, // 36: api.v1.ContainerPercentileSummary.fs_read_bytes:type_name -> api.v1.MetricPercentiles - 8, // 37: api.v1.ContainerPercentileSummary.fs_write_bytes:type_name -> api.v1.MetricPercentiles - 176, // 38: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp - 13, // 39: api.v1.WorkloadItem.children:type_name -> api.v1.WorkloadItem - 136, // 40: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry - 137, // 41: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry - 7, // 42: api.v1.WorkloadItem.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 43: api.v1.WorkloadItem.cost_info:type_name -> api.v1.CostInfo - 20, // 44: api.v1.WorkloadItem.cost_data_points:type_name -> api.v1.CostDataPoint - 21, // 45: api.v1.WorkloadItem.resource_data_points:type_name -> api.v1.ResourceDataPoint - 176, // 46: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp - 176, // 47: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp - 30, // 48: api.v1.WorkloadItem.resource_details:type_name -> api.v1.ResourceDetails - 138, // 49: api.v1.NodeInfo.price_source_counts:type_name -> api.v1.NodeInfo.PriceSourceCountsEntry - 7, // 50: api.v1.Node.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 51: api.v1.Node.cost_info:type_name -> api.v1.CostInfo - 14, // 52: api.v1.Node.container_runtime:type_name -> api.v1.ContainerRuntimeInfo - 30, // 53: api.v1.Node.resource_details:type_name -> api.v1.ResourceDetails - 13, // 54: api.v1.Node.children:type_name -> api.v1.WorkloadItem - 139, // 55: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry - 140, // 56: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry - 177, // 57: api.v1.Node.money_price_per_hour:type_name -> google.type.Money - 177, // 58: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money - 177, // 59: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money - 177, // 60: api.v1.Node.money_price_per_gib:type_name -> google.type.Money - 177, // 61: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money - 177, // 62: api.v1.Node.money_cpu_price:type_name -> google.type.Money - 177, // 63: api.v1.Node.money_memory_price:type_name -> google.type.Money - 177, // 64: api.v1.Node.money_gpu_price:type_name -> google.type.Money - 177, // 65: api.v1.Node.money_on_demand_price_per_hour:type_name -> google.type.Money - 18, // 66: api.v1.Node.volumes_attached:type_name -> api.v1.AttachedVolume - 176, // 67: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp - 176, // 68: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp - 176, // 69: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp - 17, // 70: api.v1.NodeGroup.nodes:type_name -> api.v1.Node - 7, // 71: api.v1.NodeGroup.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 72: api.v1.NodeGroup.cost_info:type_name -> api.v1.CostInfo - 15, // 73: api.v1.NodeGroup.node_info:type_name -> api.v1.NodeInfo - 16, // 74: api.v1.NodeGroup.resource_info:type_name -> api.v1.ResourceInfo - 20, // 75: api.v1.NodeGroup.cost_data_points:type_name -> api.v1.CostDataPoint - 21, // 76: api.v1.NodeGroup.resource_data_points:type_name -> api.v1.ResourceDataPoint - 6, // 77: api.v1.CostDataPoint.cost_info:type_name -> api.v1.CostInfo - 7, // 78: api.v1.ResourceDataPoint.resource_metrics:type_name -> api.v1.ResourceMetrics - 21, // 79: api.v1.ContainerTimeSeries.resource_data_points:type_name -> api.v1.ResourceDataPoint - 23, // 80: api.v1.SavingsDataPoint.savings_data:type_name -> api.v1.SavingsData - 24, // 81: api.v1.SavingsTimeSeries.savings_datapoints:type_name -> api.v1.SavingsDataPoint - 2, // 82: api.v1.LabelSelectorRequirement.operator:type_name -> api.v1.LabelSelectorOperator - 27, // 83: api.v1.LabelSelector.labels:type_name -> api.v1.Label - 141, // 84: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry - 26, // 85: api.v1.LabelSelector.match_expressions:type_name -> api.v1.LabelSelectorRequirement - 31, // 86: api.v1.ResourceDetails.pod_details:type_name -> api.v1.PodDetails - 33, // 87: api.v1.ResourceDetails.deployment_details:type_name -> api.v1.DeploymentDetails - 36, // 88: api.v1.ResourceDetails.stateful_set_details:type_name -> api.v1.StatefulSetDetails - 38, // 89: api.v1.ResourceDetails.daemon_set_details:type_name -> api.v1.DaemonSetDetails - 39, // 90: api.v1.ResourceDetails.replica_set_details:type_name -> api.v1.ReplicaSetDetails - 40, // 91: api.v1.ResourceDetails.job_details:type_name -> api.v1.JobDetails - 42, // 92: api.v1.ResourceDetails.cron_job_details:type_name -> api.v1.CronJobDetails - 45, // 93: api.v1.ResourceDetails.service_details:type_name -> api.v1.ServiceDetails - 48, // 94: api.v1.ResourceDetails.ingress_details:type_name -> api.v1.IngressDetails - 53, // 95: api.v1.ResourceDetails.pvc_details:type_name -> api.v1.PersistentVolumeClaimDetails - 57, // 96: api.v1.ResourceDetails.pv_details:type_name -> api.v1.PersistentVolumeDetails - 63, // 97: api.v1.ResourceDetails.sc_details:type_name -> api.v1.StorageClassDetails - 64, // 98: api.v1.ResourceDetails.ns_details:type_name -> api.v1.NamespaceDetails - 65, // 99: api.v1.ResourceDetails.node_details:type_name -> api.v1.NodeDetails - 77, // 100: api.v1.ResourceDetails.hpa_details:type_name -> api.v1.HPADetails - 95, // 101: api.v1.ResourceDetails.vpa_details:type_name -> api.v1.VPADetails - 103, // 102: api.v1.ResourceDetails.limit_range_details:type_name -> api.v1.LimitRangeDetails - 105, // 103: api.v1.ResourceDetails.service_account_details:type_name -> api.v1.ServiceAccountDetails - 106, // 104: api.v1.ResourceDetails.role_details:type_name -> api.v1.RoleDetails - 108, // 105: api.v1.ResourceDetails.role_binding_details:type_name -> api.v1.RoleBindingDetails - 111, // 106: api.v1.ResourceDetails.keda_scaled_object_details:type_name -> api.v1.KedaScaledObjectDetails - 114, // 107: api.v1.ResourceDetails.karpenter_resource_details:type_name -> api.v1.KarpenterResourceDetails - 119, // 108: api.v1.ResourceDetails.pod_disruption_budget_details:type_name -> api.v1.PodDisruptionBudgetDetails - 121, // 109: api.v1.ResourceDetails.resource_quota_details:type_name -> api.v1.ResourceQuotaDetails - 123, // 110: api.v1.ResourceDetails.volcano_job_details:type_name -> api.v1.VolcanoJobDetails - 126, // 111: api.v1.ResourceDetails.spark_application_details:type_name -> api.v1.SparkApplicationDetails - 130, // 112: api.v1.ResourceDetails.scheduled_spark_application_details:type_name -> api.v1.ScheduledSparkApplicationDetails - 46, // 113: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort - 142, // 114: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry - 143, // 115: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry - 66, // 116: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint - 32, // 117: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary - 34, // 118: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate - 35, // 119: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition - 34, // 120: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate - 37, // 121: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate - 34, // 122: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate - 73, // 123: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo - 74, // 124: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector - 34, // 125: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate - 28, // 126: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector - 34, // 127: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate - 41, // 128: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition - 28, // 129: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector - 34, // 130: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate - 43, // 131: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference - 44, // 132: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate - 34, // 133: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate - 46, // 134: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort - 144, // 135: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry - 47, // 136: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 49, // 137: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule - 52, // 138: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS - 51, // 139: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend - 47, // 140: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 50, // 141: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath - 51, // 142: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend - 54, // 143: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements - 28, // 144: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector - 55, // 145: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity - 56, // 146: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition - 145, // 147: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry - 146, // 148: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry - 76, // 149: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement - 76, // 150: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement - 147, // 151: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry - 58, // 152: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference - 59, // 153: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource - 74, // 154: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector - 60, // 155: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource - 61, // 156: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource - 62, // 157: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource - 148, // 158: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry - 149, // 159: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry - 150, // 160: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry - 71, // 161: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector - 151, // 162: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry - 67, // 163: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress - 68, // 164: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition - 69, // 165: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo - 152, // 166: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry - 153, // 167: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry - 70, // 168: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage - 72, // 169: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm - 154, // 170: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry - 75, // 171: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm - 76, // 172: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement - 76, // 173: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement - 78, // 174: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef - 79, // 175: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric - 91, // 176: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition - 92, // 177: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior - 86, // 178: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric - 80, // 179: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric - 81, // 180: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric - 82, // 181: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric - 83, // 182: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric - 84, // 183: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 85, // 184: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 84, // 185: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 84, // 186: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 155, // 187: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry - 87, // 188: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric - 88, // 189: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric - 89, // 190: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric - 90, // 191: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric - 84, // 192: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 85, // 193: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 84, // 194: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 84, // 195: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 93, // 196: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules - 93, // 197: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules - 94, // 198: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy - 96, // 199: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef - 97, // 200: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy - 98, // 201: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy - 100, // 202: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation - 102, // 203: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition - 99, // 204: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy - 156, // 205: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry - 157, // 206: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - 101, // 207: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation - 158, // 208: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry - 159, // 209: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry - 160, // 210: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry - 161, // 211: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry - 104, // 212: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem - 162, // 213: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry - 163, // 214: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry - 164, // 215: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry - 165, // 216: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry - 166, // 217: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - 107, // 218: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule - 109, // 219: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject - 110, // 220: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference - 112, // 221: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger - 113, // 222: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition - 167, // 223: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry - 115, // 224: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition - 116, // 225: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity - 117, // 226: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement - 168, // 227: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry - 169, // 228: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry - 28, // 229: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector - 28, // 230: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector - 0, // 231: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 29, // 232: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern - 28, // 233: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector - 3, // 234: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter - 170, // 235: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - 120, // 236: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition - 171, // 237: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry - 172, // 238: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry - 173, // 239: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry - 122, // 240: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition - 34, // 241: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate - 124, // 242: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition - 125, // 243: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask - 34, // 244: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate - 34, // 245: api.v1.SparkApplicationDetails.containers:type_name -> api.v1.ContainerTemplate - 127, // 246: api.v1.SparkApplicationDetails.spark_driver_info:type_name -> api.v1.SparkDriverInfo - 128, // 247: api.v1.SparkApplicationDetails.restart_policy:type_name -> api.v1.SparkRestartPolicyInfo - 129, // 248: api.v1.SparkApplicationDetails.dynamic_allocation:type_name -> api.v1.SparkDynamicAllocationInfo - 176, // 249: api.v1.ScheduledSparkApplicationDetails.last_run:type_name -> google.protobuf.Timestamp - 176, // 250: api.v1.ScheduledSparkApplicationDetails.next_run:type_name -> google.protobuf.Timestamp - 126, // 251: api.v1.ScheduledSparkApplicationDetails.template_details:type_name -> api.v1.SparkApplicationDetails - 174, // 252: api.v1.Event.annotations:type_name -> api.v1.Event.AnnotationsEntry - 175, // 253: api.v1.Event.labels:type_name -> api.v1.Event.LabelsEntry - 176, // 254: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp - 176, // 255: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp - 176, // 256: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp - 176, // 257: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp - 132, // 258: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo - 176, // 259: api.v1.EventGroup.first_seen:type_name -> google.protobuf.Timestamp - 176, // 260: api.v1.EventGroup.last_seen:type_name -> google.protobuf.Timestamp - 261, // [261:261] is the sub-list for method output_type - 261, // [261:261] is the sub-list for method input_type - 261, // [261:261] is the sub-list for extension type_name - 261, // [261:261] is the sub-list for extension extendee - 0, // [0:261] is the sub-list for field type_name + 192, // 4: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money + 192, // 5: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money + 192, // 6: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money + 192, // 7: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money + 192, // 8: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money + 192, // 9: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money + 192, // 10: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money + 192, // 11: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money + 192, // 12: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money + 192, // 13: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money + 192, // 14: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money + 192, // 15: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money + 192, // 16: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money + 192, // 17: api.v1.CostInfo.money_network_cost_for_time_period:type_name -> google.type.Money + 192, // 18: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money + 192, // 19: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money + 192, // 20: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money + 192, // 21: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money + 192, // 22: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money + 192, // 23: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money + 192, // 24: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money + 192, // 25: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money + 192, // 26: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money + 9, // 27: api.v1.ContainerPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles + 9, // 28: api.v1.ContainerPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles + 9, // 29: api.v1.ContainerPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles + 9, // 30: api.v1.ContainerPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles + 9, // 31: api.v1.ContainerPercentileSummary.cpu_limit:type_name -> api.v1.MetricPercentiles + 9, // 32: api.v1.ContainerPercentileSummary.memory_limit:type_name -> api.v1.MetricPercentiles + 9, // 33: api.v1.ContainerPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles + 9, // 34: api.v1.ContainerPercentileSummary.gpu_vram_usage:type_name -> api.v1.MetricPercentiles + 9, // 35: api.v1.ContainerPercentileSummary.network_receive_bytes:type_name -> api.v1.MetricPercentiles + 9, // 36: api.v1.ContainerPercentileSummary.network_transmit_bytes:type_name -> api.v1.MetricPercentiles + 9, // 37: api.v1.ContainerPercentileSummary.fs_read_bytes:type_name -> api.v1.MetricPercentiles + 9, // 38: api.v1.ContainerPercentileSummary.fs_write_bytes:type_name -> api.v1.MetricPercentiles + 15, // 39: api.v1.ContainerRequestLimits.runtime_processes:type_name -> api.v1.RuntimeProcess + 13, // 40: api.v1.ContainerIndividualGPUMetrics.instances:type_name -> api.v1.IndividualGPUMetric + 191, // 41: api.v1.ContainerIndividualGPUMetrics.collected_at:type_name -> google.protobuf.Timestamp + 191, // 42: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp + 18, // 43: api.v1.OptimizationStatus.legacy_policies:type_name -> api.v1.LegacyPolicyRef + 20, // 44: api.v1.WorkloadItem.children:type_name -> api.v1.WorkloadItem + 151, // 45: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry + 152, // 46: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry + 8, // 47: api.v1.WorkloadItem.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 48: api.v1.WorkloadItem.cost_info:type_name -> api.v1.CostInfo + 27, // 49: api.v1.WorkloadItem.cost_data_points:type_name -> api.v1.CostDataPoint + 28, // 50: api.v1.WorkloadItem.resource_data_points:type_name -> api.v1.ResourceDataPoint + 191, // 51: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp + 191, // 52: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp + 37, // 53: api.v1.WorkloadItem.resource_details:type_name -> api.v1.ResourceDetails + 19, // 54: api.v1.WorkloadItem.optimization_status:type_name -> api.v1.OptimizationStatus + 153, // 55: api.v1.NodeInfo.price_source_counts:type_name -> api.v1.NodeInfo.PriceSourceCountsEntry + 8, // 56: api.v1.Node.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 57: api.v1.Node.cost_info:type_name -> api.v1.CostInfo + 21, // 58: api.v1.Node.container_runtime:type_name -> api.v1.ContainerRuntimeInfo + 37, // 59: api.v1.Node.resource_details:type_name -> api.v1.ResourceDetails + 20, // 60: api.v1.Node.children:type_name -> api.v1.WorkloadItem + 154, // 61: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry + 155, // 62: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry + 192, // 63: api.v1.Node.money_price_per_hour:type_name -> google.type.Money + 192, // 64: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money + 192, // 65: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money + 192, // 66: api.v1.Node.money_price_per_gib:type_name -> google.type.Money + 192, // 67: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money + 192, // 68: api.v1.Node.money_cpu_price:type_name -> google.type.Money + 192, // 69: api.v1.Node.money_memory_price:type_name -> google.type.Money + 192, // 70: api.v1.Node.money_gpu_price:type_name -> google.type.Money + 192, // 71: api.v1.Node.money_on_demand_price_per_hour:type_name -> google.type.Money + 25, // 72: api.v1.Node.volumes_attached:type_name -> api.v1.AttachedVolume + 191, // 73: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp + 191, // 74: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp + 191, // 75: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp + 24, // 76: api.v1.NodeGroup.nodes:type_name -> api.v1.Node + 8, // 77: api.v1.NodeGroup.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 78: api.v1.NodeGroup.cost_info:type_name -> api.v1.CostInfo + 22, // 79: api.v1.NodeGroup.node_info:type_name -> api.v1.NodeInfo + 23, // 80: api.v1.NodeGroup.resource_info:type_name -> api.v1.ResourceInfo + 27, // 81: api.v1.NodeGroup.cost_data_points:type_name -> api.v1.CostDataPoint + 28, // 82: api.v1.NodeGroup.resource_data_points:type_name -> api.v1.ResourceDataPoint + 7, // 83: api.v1.CostDataPoint.cost_info:type_name -> api.v1.CostInfo + 8, // 84: api.v1.ResourceDataPoint.resource_metrics:type_name -> api.v1.ResourceMetrics + 28, // 85: api.v1.ContainerTimeSeries.resource_data_points:type_name -> api.v1.ResourceDataPoint + 30, // 86: api.v1.SavingsDataPoint.savings_data:type_name -> api.v1.SavingsData + 31, // 87: api.v1.SavingsTimeSeries.savings_datapoints:type_name -> api.v1.SavingsDataPoint + 2, // 88: api.v1.LabelSelectorRequirement.operator:type_name -> api.v1.LabelSelectorOperator + 34, // 89: api.v1.LabelSelector.labels:type_name -> api.v1.Label + 156, // 90: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry + 33, // 91: api.v1.LabelSelector.match_expressions:type_name -> api.v1.LabelSelectorRequirement + 38, // 92: api.v1.ResourceDetails.pod_details:type_name -> api.v1.PodDetails + 40, // 93: api.v1.ResourceDetails.deployment_details:type_name -> api.v1.DeploymentDetails + 43, // 94: api.v1.ResourceDetails.stateful_set_details:type_name -> api.v1.StatefulSetDetails + 45, // 95: api.v1.ResourceDetails.daemon_set_details:type_name -> api.v1.DaemonSetDetails + 46, // 96: api.v1.ResourceDetails.replica_set_details:type_name -> api.v1.ReplicaSetDetails + 47, // 97: api.v1.ResourceDetails.job_details:type_name -> api.v1.JobDetails + 49, // 98: api.v1.ResourceDetails.cron_job_details:type_name -> api.v1.CronJobDetails + 52, // 99: api.v1.ResourceDetails.service_details:type_name -> api.v1.ServiceDetails + 55, // 100: api.v1.ResourceDetails.ingress_details:type_name -> api.v1.IngressDetails + 60, // 101: api.v1.ResourceDetails.pvc_details:type_name -> api.v1.PersistentVolumeClaimDetails + 64, // 102: api.v1.ResourceDetails.pv_details:type_name -> api.v1.PersistentVolumeDetails + 70, // 103: api.v1.ResourceDetails.sc_details:type_name -> api.v1.StorageClassDetails + 71, // 104: api.v1.ResourceDetails.ns_details:type_name -> api.v1.NamespaceDetails + 72, // 105: api.v1.ResourceDetails.node_details:type_name -> api.v1.NodeDetails + 84, // 106: api.v1.ResourceDetails.hpa_details:type_name -> api.v1.HPADetails + 102, // 107: api.v1.ResourceDetails.vpa_details:type_name -> api.v1.VPADetails + 110, // 108: api.v1.ResourceDetails.limit_range_details:type_name -> api.v1.LimitRangeDetails + 112, // 109: api.v1.ResourceDetails.service_account_details:type_name -> api.v1.ServiceAccountDetails + 113, // 110: api.v1.ResourceDetails.role_details:type_name -> api.v1.RoleDetails + 115, // 111: api.v1.ResourceDetails.role_binding_details:type_name -> api.v1.RoleBindingDetails + 118, // 112: api.v1.ResourceDetails.keda_scaled_object_details:type_name -> api.v1.KedaScaledObjectDetails + 121, // 113: api.v1.ResourceDetails.karpenter_resource_details:type_name -> api.v1.KarpenterResourceDetails + 128, // 114: api.v1.ResourceDetails.pod_disruption_budget_details:type_name -> api.v1.PodDisruptionBudgetDetails + 130, // 115: api.v1.ResourceDetails.resource_quota_details:type_name -> api.v1.ResourceQuotaDetails + 132, // 116: api.v1.ResourceDetails.volcano_job_details:type_name -> api.v1.VolcanoJobDetails + 135, // 117: api.v1.ResourceDetails.spark_application_details:type_name -> api.v1.SparkApplicationDetails + 139, // 118: api.v1.ResourceDetails.scheduled_spark_application_details:type_name -> api.v1.ScheduledSparkApplicationDetails + 140, // 119: api.v1.ResourceDetails.kyverno_policy_details:type_name -> api.v1.KyvernoPolicyDetails + 142, // 120: api.v1.ResourceDetails.kyverno_policy_report_details:type_name -> api.v1.KyvernoPolicyReportDetails + 143, // 121: api.v1.ResourceDetails.gatekeeper_constraint_template_details:type_name -> api.v1.GatekeeperConstraintTemplateDetails + 145, // 122: api.v1.ResourceDetails.gatekeeper_constraint_details:type_name -> api.v1.GatekeeperConstraintDetails + 53, // 123: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort + 157, // 124: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry + 158, // 125: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry + 73, // 126: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint + 39, // 127: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary + 41, // 128: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate + 42, // 129: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition + 41, // 130: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate + 44, // 131: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate + 41, // 132: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate + 80, // 133: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo + 81, // 134: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector + 41, // 135: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate + 35, // 136: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector + 41, // 137: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate + 48, // 138: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition + 35, // 139: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector + 41, // 140: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate + 50, // 141: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference + 51, // 142: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate + 41, // 143: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate + 53, // 144: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort + 159, // 145: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry + 54, // 146: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 56, // 147: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule + 59, // 148: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS + 58, // 149: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend + 54, // 150: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 57, // 151: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath + 58, // 152: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend + 61, // 153: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements + 35, // 154: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector + 62, // 155: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity + 63, // 156: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition + 160, // 157: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry + 161, // 158: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry + 83, // 159: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement + 83, // 160: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement + 162, // 161: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry + 65, // 162: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference + 66, // 163: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource + 81, // 164: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector + 67, // 165: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource + 68, // 166: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource + 69, // 167: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource + 163, // 168: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry + 164, // 169: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry + 165, // 170: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry + 78, // 171: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector + 166, // 172: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry + 74, // 173: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress + 75, // 174: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition + 76, // 175: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo + 167, // 176: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry + 168, // 177: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry + 77, // 178: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage + 79, // 179: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm + 169, // 180: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry + 82, // 181: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm + 83, // 182: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement + 83, // 183: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement + 85, // 184: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef + 86, // 185: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric + 98, // 186: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition + 99, // 187: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior + 93, // 188: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric + 87, // 189: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric + 88, // 190: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric + 89, // 191: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric + 90, // 192: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric + 91, // 193: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 92, // 194: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 91, // 195: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 91, // 196: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 170, // 197: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry + 94, // 198: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric + 95, // 199: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric + 96, // 200: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric + 97, // 201: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric + 91, // 202: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 92, // 203: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 91, // 204: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 91, // 205: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 100, // 206: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules + 100, // 207: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules + 101, // 208: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy + 103, // 209: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef + 104, // 210: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy + 105, // 211: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy + 107, // 212: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation + 109, // 213: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition + 106, // 214: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy + 171, // 215: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry + 172, // 216: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + 108, // 217: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation + 173, // 218: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry + 174, // 219: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry + 175, // 220: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry + 176, // 221: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry + 111, // 222: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem + 177, // 223: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry + 178, // 224: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry + 179, // 225: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry + 180, // 226: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry + 181, // 227: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + 114, // 228: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule + 116, // 229: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject + 117, // 230: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference + 119, // 231: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger + 120, // 232: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition + 182, // 233: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry + 122, // 234: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition + 123, // 235: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity + 124, // 236: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement + 183, // 237: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry + 184, // 238: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry + 35, // 239: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector + 35, // 240: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector + 0, // 241: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind + 36, // 242: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern + 35, // 243: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector + 36, // 244: api.v1.WorkloadFilters.namespace_pattern:type_name -> api.v1.RegexPattern + 3, // 245: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter + 185, // 246: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + 129, // 247: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition + 186, // 248: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry + 187, // 249: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry + 188, // 250: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry + 131, // 251: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition + 41, // 252: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate + 133, // 253: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition + 134, // 254: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask + 41, // 255: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate + 41, // 256: api.v1.SparkApplicationDetails.containers:type_name -> api.v1.ContainerTemplate + 136, // 257: api.v1.SparkApplicationDetails.spark_driver_info:type_name -> api.v1.SparkDriverInfo + 137, // 258: api.v1.SparkApplicationDetails.restart_policy:type_name -> api.v1.SparkRestartPolicyInfo + 138, // 259: api.v1.SparkApplicationDetails.dynamic_allocation:type_name -> api.v1.SparkDynamicAllocationInfo + 191, // 260: api.v1.ScheduledSparkApplicationDetails.last_run:type_name -> google.protobuf.Timestamp + 191, // 261: api.v1.ScheduledSparkApplicationDetails.next_run:type_name -> google.protobuf.Timestamp + 135, // 262: api.v1.ScheduledSparkApplicationDetails.template_details:type_name -> api.v1.SparkApplicationDetails + 141, // 263: api.v1.KyvernoPolicyReportDetails.results:type_name -> api.v1.PolicyReportResult + 191, // 264: api.v1.GatekeeperConstraintDetails.audit_timestamp:type_name -> google.protobuf.Timestamp + 144, // 265: api.v1.GatekeeperConstraintDetails.violations:type_name -> api.v1.ConstraintViolation + 189, // 266: api.v1.Event.annotations:type_name -> api.v1.Event.AnnotationsEntry + 190, // 267: api.v1.Event.labels:type_name -> api.v1.Event.LabelsEntry + 4, // 268: api.v1.Event.disruption_block_reason:type_name -> api.v1.DisruptionBlockReason + 191, // 269: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp + 191, // 270: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp + 191, // 271: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp + 191, // 272: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp + 147, // 273: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo + 191, // 274: api.v1.EventGroup.first_seen:type_name -> google.protobuf.Timestamp + 191, // 275: api.v1.EventGroup.last_seen:type_name -> google.protobuf.Timestamp + 276, // [276:276] is the sub-list for method output_type + 276, // [276:276] is the sub-list for method input_type + 276, // [276:276] is the sub-list for extension type_name + 276, // [276:276] is the sub-list for extension extendee + 0, // [0:276] is the sub-list for field type_name } func init() { file_api_v1_common_proto_init() } @@ -17882,7 +20140,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForecastResourceMetrics); i { + switch v := v.(*GPUMigInstance); i { case 0: return &v.state case 1: @@ -17894,7 +20152,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceSummary); i { + switch v := v.(*IndividualGPUMetric); i { case 0: return &v.state case 1: @@ -17906,7 +20164,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadItem); i { + switch v := v.(*ContainerIndividualGPUMetrics); i { case 0: return &v.state case 1: @@ -17918,7 +20176,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerRuntimeInfo); i { + switch v := v.(*RuntimeProcess); i { case 0: return &v.state case 1: @@ -17930,7 +20188,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeInfo); i { + switch v := v.(*ForecastResourceMetrics); i { case 0: return &v.state case 1: @@ -17942,7 +20200,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInfo); i { + switch v := v.(*ResourceSummary); i { case 0: return &v.state case 1: @@ -17954,7 +20212,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Node); i { + switch v := v.(*LegacyPolicyRef); i { case 0: return &v.state case 1: @@ -17966,7 +20224,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachedVolume); i { + switch v := v.(*OptimizationStatus); i { case 0: return &v.state case 1: @@ -17978,7 +20236,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroup); i { + switch v := v.(*WorkloadItem); i { case 0: return &v.state case 1: @@ -17990,7 +20248,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CostDataPoint); i { + switch v := v.(*ContainerRuntimeInfo); i { case 0: return &v.state case 1: @@ -18002,7 +20260,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceDataPoint); i { + switch v := v.(*NodeInfo); i { case 0: return &v.state case 1: @@ -18014,7 +20272,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerTimeSeries); i { + switch v := v.(*ResourceInfo); i { case 0: return &v.state case 1: @@ -18026,7 +20284,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsData); i { + switch v := v.(*Node); i { case 0: return &v.state case 1: @@ -18038,7 +20296,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsDataPoint); i { + switch v := v.(*AttachedVolume); i { case 0: return &v.state case 1: @@ -18050,7 +20308,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsTimeSeries); i { + switch v := v.(*NodeGroup); i { case 0: return &v.state case 1: @@ -18062,7 +20320,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSelectorRequirement); i { + switch v := v.(*CostDataPoint); i { case 0: return &v.state case 1: @@ -18074,7 +20332,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Label); i { + switch v := v.(*ResourceDataPoint); i { case 0: return &v.state case 1: @@ -18086,7 +20344,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSelector); i { + switch v := v.(*ContainerTimeSeries); i { case 0: return &v.state case 1: @@ -18098,7 +20356,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegexPattern); i { + switch v := v.(*SavingsData); i { case 0: return &v.state case 1: @@ -18110,7 +20368,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceDetails); i { + switch v := v.(*SavingsDataPoint); i { case 0: return &v.state case 1: @@ -18122,7 +20380,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PodDetails); i { + switch v := v.(*SavingsTimeSeries); i { case 0: return &v.state case 1: @@ -18134,7 +20392,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerSummary); i { + switch v := v.(*LabelSelectorRequirement); i { case 0: return &v.state case 1: @@ -18146,7 +20404,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentDetails); i { + switch v := v.(*Label); i { case 0: return &v.state case 1: @@ -18158,7 +20416,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerTemplate); i { + switch v := v.(*LabelSelector); i { case 0: return &v.state case 1: @@ -18170,7 +20428,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentCondition); i { + switch v := v.(*RegexPattern); i { case 0: return &v.state case 1: @@ -18182,7 +20440,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatefulSetDetails); i { + switch v := v.(*ResourceDetails); i { case 0: return &v.state case 1: @@ -18194,7 +20452,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeClaimTemplate); i { + switch v := v.(*PodDetails); i { case 0: return &v.state case 1: @@ -18206,7 +20464,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaemonSetDetails); i { + switch v := v.(*ContainerSummary); i { case 0: return &v.state case 1: @@ -18218,7 +20476,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicaSetDetails); i { + switch v := v.(*DeploymentDetails); i { case 0: return &v.state case 1: @@ -18230,7 +20488,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobDetails); i { + switch v := v.(*ContainerTemplate); i { case 0: return &v.state case 1: @@ -18242,7 +20500,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobCondition); i { + switch v := v.(*DeploymentCondition); i { case 0: return &v.state case 1: @@ -18254,7 +20512,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CronJobDetails); i { + switch v := v.(*StatefulSetDetails); i { case 0: return &v.state case 1: @@ -18266,7 +20524,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActiveJobReference); i { + switch v := v.(*VolumeClaimTemplate); i { case 0: return &v.state case 1: @@ -18278,6 +20536,78 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DaemonSetDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplicaSetDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobCondition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CronJobDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveJobReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTemplate); i { case 0: return &v.state @@ -18289,7 +20619,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceDetails); i { case 0: return &v.state @@ -18301,7 +20631,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServicePort); i { case 0: return &v.state @@ -18313,7 +20643,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoadBalancerIngress); i { case 0: return &v.state @@ -18325,7 +20655,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressDetails); i { case 0: return &v.state @@ -18337,7 +20667,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressRule); i { case 0: return &v.state @@ -18349,7 +20679,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressPath); i { case 0: return &v.state @@ -18361,7 +20691,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressBackend); i { case 0: return &v.state @@ -18373,7 +20703,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressTLS); i { case 0: return &v.state @@ -18385,7 +20715,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PersistentVolumeClaimDetails); i { case 0: return &v.state @@ -18397,7 +20727,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceRequirements); i { case 0: return &v.state @@ -18409,7 +20739,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeNodeAffinity); i { case 0: return &v.state @@ -18421,7 +20751,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVCCondition); i { case 0: return &v.state @@ -18433,7 +20763,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PersistentVolumeDetails); i { case 0: return &v.state @@ -18445,7 +20775,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVClaimReference); i { case 0: return &v.state @@ -18457,7 +20787,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVVolumeSource); i { case 0: return &v.state @@ -18469,7 +20799,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CSIVolumeSource); i { case 0: return &v.state @@ -18481,7 +20811,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HostPathVolumeSource); i { case 0: return &v.state @@ -18493,7 +20823,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NFSVolumeSource); i { case 0: return &v.state @@ -18505,7 +20835,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StorageClassDetails); i { case 0: return &v.state @@ -18517,7 +20847,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamespaceDetails); i { case 0: return &v.state @@ -18529,7 +20859,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeDetails); i { case 0: return &v.state @@ -18541,7 +20871,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeTaint); i { case 0: return &v.state @@ -18553,7 +20883,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeAddress); i { case 0: return &v.state @@ -18565,7 +20895,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeCondition); i { case 0: return &v.state @@ -18577,7 +20907,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSystemInfo); i { case 0: return &v.state @@ -18589,7 +20919,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeImage); i { case 0: return &v.state @@ -18601,7 +20931,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopologySelector); i { case 0: return &v.state @@ -18613,7 +20943,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopologySelectorTerm); i { case 0: return &v.state @@ -18625,7 +20955,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TolerationInfo); i { case 0: return &v.state @@ -18637,7 +20967,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelector); i { case 0: return &v.state @@ -18649,7 +20979,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelectorTerm); i { case 0: return &v.state @@ -18661,7 +20991,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelectorRequirement); i { case 0: return &v.state @@ -18673,7 +21003,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPADetails); i { case 0: return &v.state @@ -18685,7 +21015,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScaleTargetRef); i { case 0: return &v.state @@ -18697,7 +21027,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAMetric); i { case 0: return &v.state @@ -18709,7 +21039,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAResourceMetric); i { case 0: return &v.state @@ -18721,7 +21051,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAPodsMetric); i { case 0: return &v.state @@ -18733,7 +21063,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAObjectMetric); i { case 0: return &v.state @@ -18745,7 +21075,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAExternalMetric); i { case 0: return &v.state @@ -18757,7 +21087,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAMetricSelector); i { case 0: return &v.state @@ -18769,7 +21099,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAObjectReference); i { case 0: return &v.state @@ -18781,7 +21111,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentMetric); i { case 0: return &v.state @@ -18793,7 +21123,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentResourceMetric); i { case 0: return &v.state @@ -18805,7 +21135,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentPodsMetric); i { case 0: return &v.state @@ -18817,7 +21147,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentObjectMetric); i { case 0: return &v.state @@ -18829,7 +21159,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentExternalMetric); i { case 0: return &v.state @@ -18841,7 +21171,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACondition); i { case 0: return &v.state @@ -18853,7 +21183,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPABehavior); i { case 0: return &v.state @@ -18865,7 +21195,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAScalingRules); i { case 0: return &v.state @@ -18877,7 +21207,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAScalingPolicy); i { case 0: return &v.state @@ -18889,7 +21219,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPADetails); i { case 0: return &v.state @@ -18901,7 +21231,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPATargetRef); i { case 0: return &v.state @@ -18913,7 +21243,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAUpdatePolicy); i { case 0: return &v.state @@ -18925,7 +21255,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAResourcePolicy); i { case 0: return &v.state @@ -18937,7 +21267,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAContainerResourcePolicy); i { case 0: return &v.state @@ -18949,7 +21279,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPARecommendation); i { case 0: return &v.state @@ -18961,7 +21291,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAContainerRecommendation); i { case 0: return &v.state @@ -18973,7 +21303,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPACondition); i { case 0: return &v.state @@ -18985,7 +21315,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LimitRangeDetails); i { case 0: return &v.state @@ -18997,7 +21327,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LimitRangeItem); i { case 0: return &v.state @@ -19009,7 +21339,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceAccountDetails); i { case 0: return &v.state @@ -19021,7 +21351,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleDetails); i { case 0: return &v.state @@ -19033,7 +21363,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleRule); i { case 0: return &v.state @@ -19045,7 +21375,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleBindingDetails); i { case 0: return &v.state @@ -19057,7 +21387,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleBindingSubject); i { case 0: return &v.state @@ -19069,7 +21399,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleReference); i { case 0: return &v.state @@ -19081,7 +21411,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectDetails); i { case 0: return &v.state @@ -19093,7 +21423,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectTrigger); i { case 0: return &v.state @@ -19105,7 +21435,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectCondition); i { case 0: return &v.state @@ -19117,7 +21447,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterResourceDetails); i { case 0: return &v.state @@ -19129,7 +21459,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterResourceCondition); i { case 0: return &v.state @@ -19141,7 +21471,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterCapacity); i { case 0: return &v.state @@ -19153,7 +21483,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterRequirement); i { case 0: return &v.state @@ -19165,7 +21495,31 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceFieldFilter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceFilterFieldOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkloadFilters); i { case 0: return &v.state @@ -19177,7 +21531,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodDisruptionBudgetDetails); i { case 0: return &v.state @@ -19189,7 +21543,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodDisruptionBudgetCondition); i { case 0: return &v.state @@ -19201,7 +21555,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceQuotaDetails); i { case 0: return &v.state @@ -19213,7 +21567,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceQuotaCondition); i { case 0: return &v.state @@ -19225,7 +21579,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoJobDetails); i { case 0: return &v.state @@ -19237,7 +21591,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoJobCondition); i { case 0: return &v.state @@ -19249,7 +21603,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoTask); i { case 0: return &v.state @@ -19261,7 +21615,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkApplicationDetails); i { case 0: return &v.state @@ -19273,7 +21627,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkDriverInfo); i { case 0: return &v.state @@ -19285,7 +21639,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkRestartPolicyInfo); i { case 0: return &v.state @@ -19297,7 +21651,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkDynamicAllocationInfo); i { case 0: return &v.state @@ -19309,7 +21663,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScheduledSparkApplicationDetails); i { case 0: return &v.state @@ -19321,7 +21675,79 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KyvernoPolicyDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PolicyReportResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KyvernoPolicyReportDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatekeeperConstraintTemplateDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConstraintViolation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatekeeperConstraintDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_common_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -19333,7 +21759,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventDatapointInfo); i { case 0: return &v.state @@ -19345,7 +21771,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventDatapoint); i { case 0: return &v.state @@ -19357,7 +21783,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DimensionCount); i { case 0: return &v.state @@ -19369,7 +21795,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventGroup); i { case 0: return &v.state @@ -19383,9 +21809,11 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[3].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[6].OneofWrappers = []interface{}{} file_api_v1_common_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_api_v1_common_proto_msgTypes[13].OneofWrappers = []interface{}{} - file_api_v1_common_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_api_v1_common_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[19].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[32].OneofWrappers = []interface{}{ (*ResourceDetails_PodDetails)(nil), (*ResourceDetails_DeploymentDetails)(nil), (*ResourceDetails_StatefulSetDetails)(nil), @@ -19413,15 +21841,20 @@ func file_api_v1_common_proto_init() { (*ResourceDetails_VolcanoJobDetails)(nil), (*ResourceDetails_SparkApplicationDetails)(nil), (*ResourceDetails_ScheduledSparkApplicationDetails)(nil), + (*ResourceDetails_KyvernoPolicyDetails)(nil), + (*ResourceDetails_KyvernoPolicyReportDetails)(nil), + (*ResourceDetails_GatekeeperConstraintTemplateDetails)(nil), + (*ResourceDetails_GatekeeperConstraintDetails)(nil), } - file_api_v1_common_proto_msgTypes[114].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[122].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[141].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_common_proto_rawDesc, - NumEnums: 4, - NumMessages: 172, + NumEnums: 5, + NumMessages: 186, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/gen/api/v1/hpa_connector.pb.go b/internal/gen/api/v1/hpa_connector.pb.go new file mode 100644 index 0000000..b8a127b --- /dev/null +++ b/internal/gen/api/v1/hpa_connector.pb.go @@ -0,0 +1,850 @@ +// dakr/proto/api/v1/hpa_connector.proto + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: api/v1/hpa_connector.proto + +package apiv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type HPAConnector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"` + Config map[string]string `protobuf:"bytes,6,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,7,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` + LastHealthCheck *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_health_check,json=lastHealthCheck,proto3,oneof" json:"last_health_check,omitempty"` + HealthError *string `protobuf:"bytes,10,opt,name=health_error,json=healthError,proto3,oneof" json:"health_error,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,13,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *HPAConnector) Reset() { + *x = HPAConnector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HPAConnector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HPAConnector) ProtoMessage() {} + +func (x *HPAConnector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[0] + 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 HPAConnector.ProtoReflect.Descriptor instead. +func (*HPAConnector) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{0} +} + +func (x *HPAConnector) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *HPAConnector) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *HPAConnector) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *HPAConnector) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HPAConnector) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *HPAConnector) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *HPAConnector) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *HPAConnector) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *HPAConnector) GetLastHealthCheck() *timestamppb.Timestamp { + if x != nil { + return x.LastHealthCheck + } + return nil +} + +func (x *HPAConnector) GetHealthError() string { + if x != nil && x.HealthError != nil { + return *x.HealthError + } + return "" +} + +func (x *HPAConnector) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *HPAConnector) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *HPAConnector) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type CreateHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + Config map[string]string `protobuf:"bytes,4,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,5,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,6,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *CreateHPAConnectorRequest) Reset() { + *x = CreateHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateHPAConnectorRequest) ProtoMessage() {} + +func (x *CreateHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[1] + 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 CreateHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*CreateHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateHPAConnectorRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *CreateHPAConnectorRequest) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type UpdateHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Config map[string]string `protobuf:"bytes,3,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,4,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,5,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *UpdateHPAConnectorRequest) Reset() { + *x = UpdateHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateHPAConnectorRequest) ProtoMessage() {} + +func (x *UpdateHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*UpdateHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *UpdateHPAConnectorRequest) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type GetHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetHPAConnectorRequest) Reset() { + *x = GetHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetHPAConnectorRequest) ProtoMessage() {} + +func (x *GetHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*GetHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{3} +} + +func (x *GetHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type ListHPAConnectorsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Type *string `protobuf:"bytes,2,opt,name=type,proto3,oneof" json:"type,omitempty"` +} + +func (x *ListHPAConnectorsRequest) Reset() { + *x = ListHPAConnectorsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListHPAConnectorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListHPAConnectorsRequest) ProtoMessage() {} + +func (x *ListHPAConnectorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[4] + 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 ListHPAConnectorsRequest.ProtoReflect.Descriptor instead. +func (*ListHPAConnectorsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{4} +} + +func (x *ListHPAConnectorsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListHPAConnectorsRequest) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" +} + +type ListHPAConnectorsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Connectors []*HPAConnector `protobuf:"bytes,1,rep,name=connectors,proto3" json:"connectors,omitempty"` +} + +func (x *ListHPAConnectorsResponse) Reset() { + *x = ListHPAConnectorsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListHPAConnectorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListHPAConnectorsResponse) ProtoMessage() {} + +func (x *ListHPAConnectorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[5] + 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 ListHPAConnectorsResponse.ProtoReflect.Descriptor instead. +func (*ListHPAConnectorsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{5} +} + +func (x *ListHPAConnectorsResponse) GetConnectors() []*HPAConnector { + if x != nil { + return x.Connectors + } + return nil +} + +type DeleteHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *DeleteHPAConnectorRequest) Reset() { + *x = DeleteHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteHPAConnectorRequest) ProtoMessage() {} + +func (x *DeleteHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[6] + 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 DeleteHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*DeleteHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +var File_api_v1_hpa_connector_proto protoreflect.FileDescriptor + +var file_api_v1_hpa_connector_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xb1, 0x05, 0x0a, 0x0c, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, + 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, + 0x26, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, + 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x13, + 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x18, 0x0a, 0x16, + 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xf8, 0x02, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, + 0x37, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x13, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0xd5, 0x02, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x0f, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x13, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, + 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, + 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x28, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x5b, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x51, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0x2b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x32, 0xa7, 0x03, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x58, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x48, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x8f, 0x01, 0x0a, 0x0a, 0x63, + 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x48, 0x70, 0x61, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, + 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, + 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, + 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, + 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v1_hpa_connector_proto_rawDescOnce sync.Once + file_api_v1_hpa_connector_proto_rawDescData = file_api_v1_hpa_connector_proto_rawDesc +) + +func file_api_v1_hpa_connector_proto_rawDescGZIP() []byte { + file_api_v1_hpa_connector_proto_rawDescOnce.Do(func() { + file_api_v1_hpa_connector_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_hpa_connector_proto_rawDescData) + }) + return file_api_v1_hpa_connector_proto_rawDescData +} + +var file_api_v1_hpa_connector_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_api_v1_hpa_connector_proto_goTypes = []interface{}{ + (*HPAConnector)(nil), // 0: api.v1.HPAConnector + (*CreateHPAConnectorRequest)(nil), // 1: api.v1.CreateHPAConnectorRequest + (*UpdateHPAConnectorRequest)(nil), // 2: api.v1.UpdateHPAConnectorRequest + (*GetHPAConnectorRequest)(nil), // 3: api.v1.GetHPAConnectorRequest + (*ListHPAConnectorsRequest)(nil), // 4: api.v1.ListHPAConnectorsRequest + (*ListHPAConnectorsResponse)(nil), // 5: api.v1.ListHPAConnectorsResponse + (*DeleteHPAConnectorRequest)(nil), // 6: api.v1.DeleteHPAConnectorRequest + nil, // 7: api.v1.HPAConnector.ConfigEntry + nil, // 8: api.v1.CreateHPAConnectorRequest.ConfigEntry + nil, // 9: api.v1.UpdateHPAConnectorRequest.ConfigEntry + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 11: google.protobuf.Empty +} +var file_api_v1_hpa_connector_proto_depIdxs = []int32{ + 7, // 0: api.v1.HPAConnector.config:type_name -> api.v1.HPAConnector.ConfigEntry + 10, // 1: api.v1.HPAConnector.last_health_check:type_name -> google.protobuf.Timestamp + 10, // 2: api.v1.HPAConnector.created_at:type_name -> google.protobuf.Timestamp + 10, // 3: api.v1.HPAConnector.updated_at:type_name -> google.protobuf.Timestamp + 8, // 4: api.v1.CreateHPAConnectorRequest.config:type_name -> api.v1.CreateHPAConnectorRequest.ConfigEntry + 9, // 5: api.v1.UpdateHPAConnectorRequest.config:type_name -> api.v1.UpdateHPAConnectorRequest.ConfigEntry + 0, // 6: api.v1.ListHPAConnectorsResponse.connectors:type_name -> api.v1.HPAConnector + 1, // 7: api.v1.HPAConnectorService.CreateHPAConnector:input_type -> api.v1.CreateHPAConnectorRequest + 2, // 8: api.v1.HPAConnectorService.UpdateHPAConnector:input_type -> api.v1.UpdateHPAConnectorRequest + 6, // 9: api.v1.HPAConnectorService.DeleteHPAConnector:input_type -> api.v1.DeleteHPAConnectorRequest + 4, // 10: api.v1.HPAConnectorService.ListHPAConnectors:input_type -> api.v1.ListHPAConnectorsRequest + 3, // 11: api.v1.HPAConnectorService.GetHPAConnector:input_type -> api.v1.GetHPAConnectorRequest + 0, // 12: api.v1.HPAConnectorService.CreateHPAConnector:output_type -> api.v1.HPAConnector + 0, // 13: api.v1.HPAConnectorService.UpdateHPAConnector:output_type -> api.v1.HPAConnector + 11, // 14: api.v1.HPAConnectorService.DeleteHPAConnector:output_type -> google.protobuf.Empty + 5, // 15: api.v1.HPAConnectorService.ListHPAConnectors:output_type -> api.v1.ListHPAConnectorsResponse + 0, // 16: api.v1.HPAConnectorService.GetHPAConnector:output_type -> api.v1.HPAConnector + 12, // [12:17] is the sub-list for method output_type + 7, // [7:12] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_api_v1_hpa_connector_proto_init() } +func file_api_v1_hpa_connector_proto_init() { + if File_api_v1_hpa_connector_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_api_v1_hpa_connector_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAConnector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListHPAConnectorsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListHPAConnectorsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_api_v1_hpa_connector_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[4].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v1_hpa_connector_proto_rawDesc, + NumEnums: 0, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v1_hpa_connector_proto_goTypes, + DependencyIndexes: file_api_v1_hpa_connector_proto_depIdxs, + MessageInfos: file_api_v1_hpa_connector_proto_msgTypes, + }.Build() + File_api_v1_hpa_connector_proto = out.File + file_api_v1_hpa_connector_proto_rawDesc = nil + file_api_v1_hpa_connector_proto_goTypes = nil + file_api_v1_hpa_connector_proto_depIdxs = nil +} diff --git a/internal/gen/api/v1/k8s.pb.go b/internal/gen/api/v1/k8s.pb.go index 39ab4b8..3916dfc 100644 --- a/internal/gen/api/v1/k8s.pb.go +++ b/internal/gen/api/v1/k8s.pb.go @@ -586,6 +586,16 @@ type GetWorkloadsRequest struct { // Deprecated: Marked as deprecated in api/v1/k8s.proto. NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Prefer filters.status instead Filters *WorkloadFilters `protobuf:"bytes,31,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters; when set, overrides show_deleted behavior via filters.status + // The two flags below independently control which half of + // WorkloadItem.optimization_status gets computed. Split because a team on + // MPA_V2 with is_enabled=false is permanently locked into exactly one + // system (is_active=true -> v2-only, is_active=false -> legacy-only) and + // the unused system should never be queried; only when is_enabled=true + // (team is in a self-service/transition state) does the caller request + // both. Adds batched lookups — leave both false unless the caller renders + // optimization status. + IncludeLegacyOptimizationStatus bool `protobuf:"varint,32,opt,name=include_legacy_optimization_status,json=includeLegacyOptimizationStatus,proto3" json:"include_legacy_optimization_status,omitempty"` + IncludeV2OptimizationStatus bool `protobuf:"varint,33,opt,name=include_v2_optimization_status,json=includeV2OptimizationStatus,proto3" json:"include_v2_optimization_status,omitempty"` } func (x *GetWorkloadsRequest) Reset() { @@ -671,21 +681,43 @@ func (x *GetWorkloadsRequest) GetFilters() *WorkloadFilters { return nil } -// GetResourcesRequest is uset to fetch resources from db. -type GetResourcesRequest struct { +func (x *GetWorkloadsRequest) GetIncludeLegacyOptimizationStatus() bool { + if x != nil { + return x.IncludeLegacyOptimizationStatus + } + return false +} + +func (x *GetWorkloadsRequest) GetIncludeV2OptimizationStatus() bool { + if x != nil { + return x.IncludeV2OptimizationStatus + } + return false +} + +// ListWorkloadsPaginatedRequest fetches a single keyset-paginated page of +// top-level workloads for a cluster+timerange. Additive alternative to +// GetWorkloads for large clusters; existing GetWorkloads callers are unaffected. +type ListWorkloadsPaginatedRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // Type of object to get. - Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter resources by name - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Filters *WorkloadFilters `protobuf:"bytes,5,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters (same message GetWorkloads uses). + IncludeLegacyOptimizationStatus bool `protobuf:"varint,6,opt,name=include_legacy_optimization_status,json=includeLegacyOptimizationStatus,proto3" json:"include_legacy_optimization_status,omitempty"` + IncludeV2OptimizationStatus bool `protobuf:"varint,7,opt,name=include_v2_optimization_status,json=includeV2OptimizationStatus,proto3" json:"include_v2_optimization_status,omitempty"` + PageSize int32 `protobuf:"varint,8,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Max items per page; server clamps to a sane range. + PageToken string `protobuf:"bytes,9,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Opaque cursor from a prior response; empty = first page. + SortOrder string `protobuf:"bytes,10,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` // "asc" | "desc" (default "desc": highest sort_field value first). + SortField string `protobuf:"bytes,11,opt,name=sort_field,json=sortField,proto3" json:"sort_field,omitempty"` // "cost" | "cpu" | "memory" | "gpu" (default "cost"). Selects which metric orders the page. } -func (x *GetResourcesRequest) Reset() { - *x = GetResourcesRequest{} +func (x *ListWorkloadsPaginatedRequest) Reset() { + *x = ListWorkloadsPaginatedRequest{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_k8s_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -693,13 +725,13 @@ func (x *GetResourcesRequest) Reset() { } } -func (x *GetResourcesRequest) String() string { +func (x *ListWorkloadsPaginatedRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetResourcesRequest) ProtoMessage() {} +func (*ListWorkloadsPaginatedRequest) ProtoMessage() {} -func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { +func (x *ListWorkloadsPaginatedRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_k8s_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -711,177 +743,122 @@ func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetResourcesRequest.ProtoReflect.Descriptor instead. -func (*GetResourcesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListWorkloadsPaginatedRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadsPaginatedRequest) Descriptor() ([]byte, []int) { return file_api_v1_k8s_proto_rawDescGZIP(), []int{5} } -func (x *GetResourcesRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetResourcesRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId - } - return "" -} - -func (x *GetResourcesRequest) GetKind() K8SObjectKind { +func (x *ListWorkloadsPaginatedRequest) GetClusterId() string { if x != nil { - return x.Kind - } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED -} - -func (x *GetResourcesRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search + return x.ClusterId } return "" } -func (x *GetResourcesRequest) GetPagination() *Pagination { +func (x *ListWorkloadsPaginatedRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.Pagination + return x.StartTime } return nil } -// GetPodsRequest is used to fetch Pod resources from db. -type GetPodsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter pods by name - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters - NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups - NodeIds []string `protobuf:"bytes,26,rep,name=node_ids,json=nodeIds,proto3" json:"node_ids,omitempty"` // Optional filter for specific node IDs - StartTime *timestamppb.Timestamp `protobuf:"bytes,27,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // Start time for metrics query - EndTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // End time for metrics query -} - -func (x *GetPodsRequest) Reset() { - *x = GetPodsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetPodsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetPodsRequest) ProtoMessage() {} - -func (x *GetPodsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[6] - 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 GetPodsRequest.ProtoReflect.Descriptor instead. -func (*GetPodsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{6} -} - -func (x *GetPodsRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.TeamId + return x.EndTime } - return "" + return nil } -func (x *GetPodsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *ListWorkloadsPaginatedRequest) GetFilters() *WorkloadFilters { + if x != nil { + return x.Filters } - return "" + return nil } -func (x *GetPodsRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search +func (x *ListWorkloadsPaginatedRequest) GetIncludeLegacyOptimizationStatus() bool { + if x != nil { + return x.IncludeLegacyOptimizationStatus } - return "" + return false } -func (x *GetPodsRequest) GetPagination() *Pagination { +func (x *ListWorkloadsPaginatedRequest) GetIncludeV2OptimizationStatus() bool { if x != nil { - return x.Pagination + return x.IncludeV2OptimizationStatus } - return nil + return false } -func (x *GetPodsRequest) GetNodeGroupNames() []string { +func (x *ListWorkloadsPaginatedRequest) GetPageSize() int32 { if x != nil { - return x.NodeGroupNames + return x.PageSize } - return nil + return 0 } -func (x *GetPodsRequest) GetNodeIds() []string { +func (x *ListWorkloadsPaginatedRequest) GetPageToken() string { if x != nil { - return x.NodeIds + return x.PageToken } - return nil + return "" } -func (x *GetPodsRequest) GetStartTime() *timestamppb.Timestamp { +func (x *ListWorkloadsPaginatedRequest) GetSortOrder() string { if x != nil { - return x.StartTime + return x.SortOrder } - return nil + return "" } -func (x *GetPodsRequest) GetEndTime() *timestamppb.Timestamp { +func (x *ListWorkloadsPaginatedRequest) GetSortField() string { if x != nil { - return x.EndTime + return x.SortField } - return nil + return "" } -// GetPodsResponse is the response for getting pod resources. -type GetPodsResponse struct { +// GetWorkloadsSummaryRequest computes cluster-wide aggregate breakdowns (summary +// cards, top-N lists, treemaps) over the FULL filtered workload set in a single +// pass. Companion to ListWorkloadsPaginated: this pays the full-scan cost once +// per page load, while ListWorkloadsPaginated serves the cheap table body per +// scroll. +type GetWorkloadsSummaryRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of pods. - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Filters *WorkloadFilters `protobuf:"bytes,5,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Same WorkloadFilters message as ListWorkloadsPaginatedRequest. } -func (x *GetPodsResponse) Reset() { - *x = GetPodsResponse{} +func (x *GetWorkloadsSummaryRequest) Reset() { + *x = GetWorkloadsSummaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[7] + mi := &file_api_v1_k8s_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPodsResponse) String() string { +func (x *GetWorkloadsSummaryRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPodsResponse) ProtoMessage() {} +func (*GetWorkloadsSummaryRequest) ProtoMessage() {} -func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[7] +func (x *GetWorkloadsSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -892,59 +869,85 @@ func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPodsResponse.ProtoReflect.Descriptor instead. -func (*GetPodsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{7} +// Deprecated: Use GetWorkloadsSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadsSummaryRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{6} } -func (x *GetPodsResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetWorkloadsSummaryRequest) GetTeamId() string { if x != nil { - return x.WorkloadItems + return x.TeamId + } + return "" +} + +func (x *GetWorkloadsSummaryRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadsSummaryRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime } return nil } -func (x *GetPodsResponse) GetPagination() *Pagination { +func (x *GetWorkloadsSummaryRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Pagination + return x.EndTime } return nil } -// GetWorkloadRequest is used to fetch details of a specific workload in a cluster. -type GetWorkloadRequest struct { +func (x *GetWorkloadsSummaryRequest) GetFilters() *WorkloadFilters { + if x != nil { + return x.Filters + } + return nil +} + +// WorkloadMetricEntry is a single workload's contribution to one metric. value +// is whatever the enclosing breakdown is sorted by; requested/limit/usage carry +// the full picture so the frontend can render tooltips and compute utilization +// without a second round-trip. For the cost breakdown, requested is the +// requested cost, usage is the usage cost, and limit is 0 (no limit-cost +// concept). +type WorkloadMetricEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` - WithDetails bool `protobuf:"varint,12,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` // Optional flag to include additional resource details - WithMetadata bool `protobuf:"varint,13,opt,name=with_metadata,json=withMetadata,proto3" json:"with_metadata,omitempty"` // Optional flag to include metadata - StartTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,22,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + Value float64 `protobuf:"fixed64,5,opt,name=value,proto3" json:"value,omitempty"` // The metric this breakdown is sorted by (usage for cpu/mem/gpu, requested cost for cost, overprovisioned amount for optimization_potential). + Requested float64 `protobuf:"fixed64,6,opt,name=requested,proto3" json:"requested,omitempty"` // Cluster-wide requested amount for this workload (millicores / bytes / gpu-count / requested cost). + Limit float64 `protobuf:"fixed64,7,opt,name=limit,proto3" json:"limit,omitempty"` // Configured limit for this workload (0 for the cost breakdown). + Usage float64 `protobuf:"fixed64,8,opt,name=usage,proto3" json:"usage,omitempty"` // Observed usage for this workload (millicores / bytes / gpu-count / usage cost). + IsDeleted bool `protobuf:"varint,9,opt,name=is_deleted,json=isDeleted,proto3" json:"is_deleted,omitempty"` // Whether this workload is soft-deleted. The frontend needs this to open the workload drawer correctly when a caller clicks a treemap/top-N node built from this entry, the same way it already does for table rows sourced from WorkloadItem.deleted_at. } -func (x *GetWorkloadRequest) Reset() { - *x = GetWorkloadRequest{} +func (x *WorkloadMetricEntry) Reset() { + *x = WorkloadMetricEntry{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[8] + mi := &file_api_v1_k8s_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRequest) String() string { +func (x *WorkloadMetricEntry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRequest) ProtoMessage() {} +func (*WorkloadMetricEntry) ProtoMessage() {} -func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[8] +func (x *WorkloadMetricEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -955,104 +958,107 @@ func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{8} +// Deprecated: Use WorkloadMetricEntry.ProtoReflect.Descriptor instead. +func (*WorkloadMetricEntry) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{7} } -func (x *GetWorkloadRequest) GetTeamId() string { +func (x *WorkloadMetricEntry) GetUid() string { if x != nil { - return x.TeamId + return x.Uid } return "" } -func (x *GetWorkloadRequest) GetClusterId() string { +func (x *WorkloadMetricEntry) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *GetWorkloadRequest) GetKind() string { +func (x *WorkloadMetricEntry) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *GetWorkloadRequest) GetUid() string { +func (x *WorkloadMetricEntry) GetNamespace() string { if x != nil { - return x.Uid + return x.Namespace } return "" } -func (x *GetWorkloadRequest) GetIncludeDeleted() bool { +func (x *WorkloadMetricEntry) GetValue() float64 { if x != nil { - return x.IncludeDeleted + return x.Value } - return false + return 0 } -func (x *GetWorkloadRequest) GetWithDetails() bool { +func (x *WorkloadMetricEntry) GetRequested() float64 { if x != nil { - return x.WithDetails + return x.Requested } - return false + return 0 } -func (x *GetWorkloadRequest) GetWithMetadata() bool { +func (x *WorkloadMetricEntry) GetLimit() float64 { if x != nil { - return x.WithMetadata + return x.Limit } - return false + return 0 } -func (x *GetWorkloadRequest) GetStartTime() *timestamppb.Timestamp { +func (x *WorkloadMetricEntry) GetUsage() float64 { if x != nil { - return x.StartTime + return x.Usage } - return nil + return 0 } -func (x *GetWorkloadRequest) GetEndTime() *timestamppb.Timestamp { +func (x *WorkloadMetricEntry) GetIsDeleted() bool { if x != nil { - return x.EndTime + return x.IsDeleted } - return nil + return false } -// GetClustersRequest is used to fetch clusters for a specific team. -type GetClustersRequest struct { +// WorkloadMetricBreakdown is a top-N + "other" rollup of one metric across all +// top-level workloads matching the filters. +type WorkloadMetricBreakdown struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups + TopEntries []*WorkloadMetricEntry `protobuf:"bytes,1,rep,name=top_entries,json=topEntries,proto3" json:"top_entries,omitempty"` // Top N by this metric, descending. + OtherValue float64 `protobuf:"fixed64,2,opt,name=other_value,json=otherValue,proto3" json:"other_value,omitempty"` // Sum of value across everything NOT in top_entries. + OtherCount int32 `protobuf:"varint,3,opt,name=other_count,json=otherCount,proto3" json:"other_count,omitempty"` // How many workloads are folded into other_value. + Total float64 `protobuf:"fixed64,4,opt,name=total,proto3" json:"total,omitempty"` // Sum of value across ALL workloads (top_entries + other). + RequestedTotal float64 `protobuf:"fixed64,5,opt,name=requested_total,json=requestedTotal,proto3" json:"requested_total,omitempty"` // Sum of requested across ALL workloads; pair with total (usage) for request-utilization %. + PositiveCount int32 `protobuf:"varint,6,opt,name=positive_count,json=positiveCount,proto3" json:"positive_count,omitempty"` // How many workloads (top_entries + other, combined) have value > 0 for this metric. Use this, not top_entries+other_count, as the denominator for "N% of workloads account for ~80%" style displays — other_count includes workloads with zero value for this metric (e.g. a workload with no CPU usage still gets folded into "other"), which understates the percentage. + Top80Count int32 `protobuf:"varint,7,opt,name=top80_count,json=top80Count,proto3" json:"top80_count,omitempty"` // How many workloads, ranked by this metric descending, are needed to reach ~80% of total. Computed server-side over the FULL dataset, not just top_entries (which is capped at 50) — use this instead of walking top_entries client-side, which silently caps at 50 and under-reports on flatter distributions where more than 50 workloads are needed to reach 80%. } -func (x *GetClustersRequest) Reset() { - *x = GetClustersRequest{} +func (x *WorkloadMetricBreakdown) Reset() { + *x = WorkloadMetricBreakdown{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[9] + mi := &file_api_v1_k8s_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClustersRequest) String() string { +func (x *WorkloadMetricBreakdown) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClustersRequest) ProtoMessage() {} +func (*WorkloadMetricBreakdown) ProtoMessage() {} -func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[9] +func (x *WorkloadMetricBreakdown) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1063,77 +1069,98 @@ func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClustersRequest.ProtoReflect.Descriptor instead. -func (*GetClustersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{9} +// Deprecated: Use WorkloadMetricBreakdown.ProtoReflect.Descriptor instead. +func (*WorkloadMetricBreakdown) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{8} } -func (x *GetClustersRequest) GetTeamId() string { +func (x *WorkloadMetricBreakdown) GetTopEntries() []*WorkloadMetricEntry { if x != nil { - return x.TeamId + return x.TopEntries } - return "" + return nil } -func (x *GetClustersRequest) GetStartTime() *timestamppb.Timestamp { +func (x *WorkloadMetricBreakdown) GetOtherValue() float64 { if x != nil { - return x.StartTime + return x.OtherValue } - return nil + return 0 } -func (x *GetClustersRequest) GetEndTime() *timestamppb.Timestamp { +func (x *WorkloadMetricBreakdown) GetOtherCount() int32 { if x != nil { - return x.EndTime + return x.OtherCount } - return nil + return 0 } -func (x *GetClustersRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize +func (x *WorkloadMetricBreakdown) GetTotal() float64 { + if x != nil { + return x.Total } return 0 } -func (x *GetClustersRequest) GetNodeGroupNames() []string { +func (x *WorkloadMetricBreakdown) GetRequestedTotal() float64 { if x != nil { - return x.NodeGroupNames + return x.RequestedTotal } - return nil + return 0 } -// ListClustersRequest is used to fetch clusters for a specific team with pagination. -// Deprecated: Use GetClustersRequest instead. -// -// Deprecated: Marked as deprecated in api/v1/k8s.proto. -type ListClustersRequest struct { +func (x *WorkloadMetricBreakdown) GetPositiveCount() int32 { + if x != nil { + return x.PositiveCount + } + return 0 +} + +func (x *WorkloadMetricBreakdown) GetTop80Count() int32 { + if x != nil { + return x.Top80Count + } + return 0 +} + +// GetWorkloadsSummaryResponse carries one usage/cost breakdown per metric plus +// the total matching top-level workload count. The optimization_potential_* +// breakdowns re-rank the same workloads by the overprovisioned amount +// (requested - usage) for that metric, feeding each treemap's "show +// optimization potential" toggle without an approximation. +type GetWorkloadsSummaryResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - Search *string `protobuf:"bytes,2,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter clusters by name or ID - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + Cost *WorkloadMetricBreakdown `protobuf:"bytes,1,opt,name=cost,proto3" json:"cost,omitempty"` + CpuUsage *WorkloadMetricBreakdown `protobuf:"bytes,2,opt,name=cpu_usage,json=cpuUsage,proto3" json:"cpu_usage,omitempty"` + MemoryUsage *WorkloadMetricBreakdown `protobuf:"bytes,3,opt,name=memory_usage,json=memoryUsage,proto3" json:"memory_usage,omitempty"` + GpuUsage *WorkloadMetricBreakdown `protobuf:"bytes,4,opt,name=gpu_usage,json=gpuUsage,proto3" json:"gpu_usage,omitempty"` + TotalWorkloadCount int32 `protobuf:"varint,5,opt,name=total_workload_count,json=totalWorkloadCount,proto3" json:"total_workload_count,omitempty"` // Total top-level workloads matching filters. + OptimizationPotentialCost *WorkloadMetricBreakdown `protobuf:"bytes,6,opt,name=optimization_potential_cost,json=optimizationPotentialCost,proto3" json:"optimization_potential_cost,omitempty"` // Ranked by overprovisioned cost (requested cost - usage cost), descending. + OptimizationPotentialCpu *WorkloadMetricBreakdown `protobuf:"bytes,7,opt,name=optimization_potential_cpu,json=optimizationPotentialCpu,proto3" json:"optimization_potential_cpu,omitempty"` // Ranked by overprovisioned cpu (cpu request - cpu usage, millicores), descending. + OptimizationPotentialMemory *WorkloadMetricBreakdown `protobuf:"bytes,8,opt,name=optimization_potential_memory,json=optimizationPotentialMemory,proto3" json:"optimization_potential_memory,omitempty"` // Ranked by overprovisioned memory (memory request - memory usage, bytes), descending. + OptimizationPotentialGpu *WorkloadMetricBreakdown `protobuf:"bytes,9,opt,name=optimization_potential_gpu,json=optimizationPotentialGpu,proto3" json:"optimization_potential_gpu,omitempty"` // Ranked by overprovisioned gpu (gpu request - gpu usage, gpu-count), descending. } -func (x *ListClustersRequest) Reset() { - *x = ListClustersRequest{} +func (x *GetWorkloadsSummaryResponse) Reset() { + *x = GetWorkloadsSummaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[10] + mi := &file_api_v1_k8s_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListClustersRequest) String() string { +func (x *GetWorkloadsSummaryResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListClustersRequest) ProtoMessage() {} +func (*GetWorkloadsSummaryResponse) ProtoMessage() {} -func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[10] +func (x *GetWorkloadsSummaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1144,147 +1171,104 @@ func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListClustersRequest.ProtoReflect.Descriptor instead. -func (*ListClustersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{10} +// Deprecated: Use GetWorkloadsSummaryResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadsSummaryResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{9} } -func (x *ListClustersRequest) GetTeamId() string { +func (x *GetWorkloadsSummaryResponse) GetCost() *WorkloadMetricBreakdown { if x != nil { - return x.TeamId - } - return "" -} - -func (x *ListClustersRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search + return x.Cost } - return "" + return nil } -func (x *ListClustersRequest) GetPagination() *Pagination { +func (x *GetWorkloadsSummaryResponse) GetCpuUsage() *WorkloadMetricBreakdown { if x != nil { - return x.Pagination + return x.CpuUsage } return nil } -// GetClusterRequest is used to fetch details of a specific cluster for a team. -type GetClusterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups -} - -func (x *GetClusterRequest) Reset() { - *x = GetClusterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetClusterRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetClusterRequest) ProtoMessage() {} - -func (x *GetClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GetWorkloadsSummaryResponse) GetMemoryUsage() *WorkloadMetricBreakdown { + if x != nil { + return x.MemoryUsage } - return mi.MessageOf(x) -} - -// Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead. -func (*GetClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{11} + return nil } -func (x *GetClusterRequest) GetTeamId() string { +func (x *GetWorkloadsSummaryResponse) GetGpuUsage() *WorkloadMetricBreakdown { if x != nil { - return x.TeamId + return x.GpuUsage } - return "" + return nil } -func (x *GetClusterRequest) GetClusterId() string { +func (x *GetWorkloadsSummaryResponse) GetTotalWorkloadCount() int32 { if x != nil { - return x.ClusterId + return x.TotalWorkloadCount } - return "" + return 0 } -func (x *GetClusterRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialCost() *WorkloadMetricBreakdown { if x != nil { - return x.StartTime + return x.OptimizationPotentialCost } return nil } -func (x *GetClusterRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialCpu() *WorkloadMetricBreakdown { if x != nil { - return x.EndTime + return x.OptimizationPotentialCpu } return nil } -func (x *GetClusterRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialMemory() *WorkloadMetricBreakdown { + if x != nil { + return x.OptimizationPotentialMemory } - return 0 + return nil } -func (x *GetClusterRequest) GetNodeGroupNames() []string { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialGpu() *WorkloadMetricBreakdown { if x != nil { - return x.NodeGroupNames + return x.OptimizationPotentialGpu } return nil } -// DeleteClusterRequest is used to delete a cluster and all its resources. -type DeleteClusterRequest struct { +// ListWorkloadsPaginatedResponse is one page of workloads plus the cursor for +// the next page and the total matching count (before pagination). +type ListWorkloadsPaginatedResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // This page's workloads. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // Opaque cursor for the next page; empty = no more data. + TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` // Total workloads matching the filters, before pagination. + PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Effective page size applied after clamping; reflects the requested/clamped size, not len(workload_items). } -func (x *DeleteClusterRequest) Reset() { - *x = DeleteClusterRequest{} +func (x *ListWorkloadsPaginatedResponse) Reset() { + *x = ListWorkloadsPaginatedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[12] + mi := &file_api_v1_k8s_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteClusterRequest) String() string { +func (x *ListWorkloadsPaginatedResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteClusterRequest) ProtoMessage() {} +func (*ListWorkloadsPaginatedResponse) ProtoMessage() {} -func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[12] +func (x *ListWorkloadsPaginatedResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1295,96 +1279,70 @@ func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteClusterRequest.ProtoReflect.Descriptor instead. -func (*DeleteClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{12} +// Deprecated: Use ListWorkloadsPaginatedResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadsPaginatedResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{10} } -func (x *DeleteClusterRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { - return x.TeamId + return x.WorkloadItems } - return "" + return nil } -func (x *DeleteClusterRequest) GetClusterId() string { +func (x *ListWorkloadsPaginatedResponse) GetNextPageToken() string { if x != nil { - return x.ClusterId + return x.NextPageToken } return "" } -// DeleteClusterResponse is the response for a delete cluster request. -type DeleteClusterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeleteClusterResponse) Reset() { - *x = DeleteClusterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ListWorkloadsPaginatedResponse) GetTotalCount() int64 { + if x != nil { + return x.TotalCount } + return 0 } -func (x *DeleteClusterResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteClusterResponse) ProtoMessage() {} - -func (x *DeleteClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListWorkloadsPaginatedResponse) GetPageSize() int32 { + if x != nil { + return x.PageSize } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteClusterResponse.ProtoReflect.Descriptor instead. -func (*DeleteClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{13} + return 0 } -// UpdateClusterRequest is used to update the configuration of an existing cluster. -// only certain fields can be updated, such as name -type UpdateClusterRequest struct { +// GetResourcesRequest is uset to fetch resources from db. +type GetResourcesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Updated cluster details. - CpuCostPerHour float64 `protobuf:"fixed64,4,opt,name=cpu_cost_per_hour,json=cpuCostPerHour,proto3" json:"cpu_cost_per_hour,omitempty"` // Estimated CPU cost per hour for one vcpu. - MemoryCostPerHour float64 `protobuf:"fixed64,5,opt,name=memory_cost_per_hour,json=memoryCostPerHour,proto3" json:"memory_cost_per_hour,omitempty"` // Estimated memory cost per hour for one GiB of memory. - GpuCostPerHour float64 `protobuf:"fixed64,6,opt,name=gpu_cost_per_hour,json=gpuCostPerHour,proto3" json:"gpu_cost_per_hour,omitempty"` // Estimate GPU cost per hour for one GPU. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // Type of object to get. + Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter resources by name + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + Filters []*ResourceFieldFilter `protobuf:"bytes,12,rep,name=filters,proto3" json:"filters,omitempty"` // Optional field-level filters; multiple filters AND together } -func (x *UpdateClusterRequest) Reset() { - *x = UpdateClusterRequest{} +func (x *GetResourcesRequest) Reset() { + *x = GetResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[14] + mi := &file_api_v1_k8s_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateClusterRequest) String() string { +func (x *GetResourcesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateClusterRequest) ProtoMessage() {} +func (*GetResourcesRequest) ProtoMessage() {} -func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[14] +func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1395,79 +1353,86 @@ func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateClusterRequest.ProtoReflect.Descriptor instead. -func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{14} +// Deprecated: Use GetResourcesRequest.ProtoReflect.Descriptor instead. +func (*GetResourcesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{11} } -func (x *UpdateClusterRequest) GetTeamId() string { +func (x *GetResourcesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateClusterRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *GetResourcesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -func (x *UpdateClusterRequest) GetClusterName() string { +func (x *GetResourcesRequest) GetKind() K8SObjectKind { if x != nil { - return x.ClusterName + return x.Kind } - return "" + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -func (x *UpdateClusterRequest) GetCpuCostPerHour() float64 { - if x != nil { - return x.CpuCostPerHour +func (x *GetResourcesRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search } - return 0 + return "" } -func (x *UpdateClusterRequest) GetMemoryCostPerHour() float64 { +func (x *GetResourcesRequest) GetPagination() *Pagination { if x != nil { - return x.MemoryCostPerHour + return x.Pagination } - return 0 + return nil } -func (x *UpdateClusterRequest) GetGpuCostPerHour() float64 { +func (x *GetResourcesRequest) GetFilters() []*ResourceFieldFilter { if x != nil { - return x.GpuCostPerHour + return x.Filters } - return 0 + return nil } -// UpdateClusterResponse is the response for an update cluster request. -type UpdateClusterResponse struct { +// GetPodsRequest is used to fetch Pod resources from db. +type GetPodsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Updated cluster details. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter pods by name + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups + NodeIds []string `protobuf:"bytes,26,rep,name=node_ids,json=nodeIds,proto3" json:"node_ids,omitempty"` // Optional filter for specific node IDs + StartTime *timestamppb.Timestamp `protobuf:"bytes,27,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // Start time for metrics query + EndTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // End time for metrics query } -func (x *UpdateClusterResponse) Reset() { - *x = UpdateClusterResponse{} +func (x *GetPodsRequest) Reset() { + *x = GetPodsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[15] + mi := &file_api_v1_k8s_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateClusterResponse) String() string { +func (x *GetPodsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateClusterResponse) ProtoMessage() {} +func (*GetPodsRequest) ProtoMessage() {} -func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[15] +func (x *GetPodsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1478,45 +1443,94 @@ func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateClusterResponse.ProtoReflect.Descriptor instead. -func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{15} +// Deprecated: Use GetPodsRequest.ProtoReflect.Descriptor instead. +func (*GetPodsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{12} } -func (x *UpdateClusterResponse) GetCluster() *Cluster { +func (x *GetPodsRequest) GetTeamId() string { if x != nil { - return x.Cluster + return x.TeamId + } + return "" +} + +func (x *GetPodsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +func (x *GetPodsRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search + } + return "" +} + +func (x *GetPodsRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination } return nil } -// GetResourcesResponse is the response for getting k8s resources. -type GetResourcesResponse struct { +func (x *GetPodsRequest) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *GetPodsRequest) GetNodeIds() []string { + if x != nil { + return x.NodeIds + } + return nil +} + +func (x *GetPodsRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetPodsRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +// GetPodsResponse is the response for getting pod resources. +type GetPodsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Return list of resources requested + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of pods. Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information } -func (x *GetResourcesResponse) Reset() { - *x = GetResourcesResponse{} +func (x *GetPodsResponse) Reset() { + *x = GetPodsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[16] + mi := &file_api_v1_k8s_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetResourcesResponse) String() string { +func (x *GetPodsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetResourcesResponse) ProtoMessage() {} +func (*GetPodsResponse) ProtoMessage() {} -func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[16] +func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1527,52 +1541,59 @@ func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetResourcesResponse.ProtoReflect.Descriptor instead. -func (*GetResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{16} +// Deprecated: Use GetPodsResponse.ProtoReflect.Descriptor instead. +func (*GetPodsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{13} } -func (x *GetResourcesResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetPodsResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { return x.WorkloadItems } return nil } -func (x *GetResourcesResponse) GetPagination() *Pagination { +func (x *GetPodsResponse) GetPagination() *Pagination { if x != nil { return x.Pagination } return nil } -// CreateClusterRequest is used to create a new cluster. -type CreateClusterRequest struct { +// GetWorkloadRequest is used to fetch details of a specific workload in a cluster. +type GetWorkloadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Name of the new cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + WithDetails bool `protobuf:"varint,12,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` // Optional flag to include additional resource details + WithMetadata bool `protobuf:"varint,13,opt,name=with_metadata,json=withMetadata,proto3" json:"with_metadata,omitempty"` // Optional flag to include metadata + StartTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,22,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` } -func (x *CreateClusterRequest) Reset() { - *x = CreateClusterRequest{} +func (x *GetWorkloadRequest) Reset() { + *x = GetWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[17] + mi := &file_api_v1_k8s_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateClusterRequest) String() string { +func (x *GetWorkloadRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateClusterRequest) ProtoMessage() {} +func (*GetWorkloadRequest) ProtoMessage() {} -func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[17] +func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1583,108 +1604,104 @@ func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateClusterRequest.ProtoReflect.Descriptor instead. -func (*CreateClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{17} +// Deprecated: Use GetWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{14} } -func (x *CreateClusterRequest) GetTeamId() string { +func (x *GetWorkloadRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *CreateClusterRequest) GetClusterName() string { +func (x *GetWorkloadRequest) GetClusterId() string { if x != nil { - return x.ClusterName + return x.ClusterId } return "" } -// CreateClusterResponse is the response for a create cluster request. -type CreateClusterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the created cluster. - Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +func (x *GetWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" } -func (x *CreateClusterResponse) Reset() { - *x = CreateClusterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GetWorkloadRequest) GetUid() string { + if x != nil { + return x.Uid } + return "" } -func (x *CreateClusterResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *GetWorkloadRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted + } + return false } -func (*CreateClusterResponse) ProtoMessage() {} - -func (x *CreateClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GetWorkloadRequest) GetWithDetails() bool { + if x != nil { + return x.WithDetails } - return mi.MessageOf(x) + return false } -// Deprecated: Use CreateClusterResponse.ProtoReflect.Descriptor instead. -func (*CreateClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{18} +func (x *GetWorkloadRequest) GetWithMetadata() bool { + if x != nil { + return x.WithMetadata + } + return false } -func (x *CreateClusterResponse) GetCluster() *Cluster { +func (x *GetWorkloadRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.Cluster + return x.StartTime } return nil } -func (x *CreateClusterResponse) GetToken() string { +func (x *GetWorkloadRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Token + return x.EndTime } - return "" + return nil } -// ResetClusterTokenRequest is used to reset the token for a cluster. -type ResetClusterTokenRequest struct { +// GetClustersRequest is used to fetch clusters for a specific team. +type GetClustersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups } -func (x *ResetClusterTokenRequest) Reset() { - *x = ResetClusterTokenRequest{} +func (x *GetClustersRequest) Reset() { + *x = GetClustersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[19] + mi := &file_api_v1_k8s_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResetClusterTokenRequest) String() string { +func (x *GetClustersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResetClusterTokenRequest) ProtoMessage() {} +func (*GetClustersRequest) ProtoMessage() {} -func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[19] +func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1695,51 +1712,77 @@ func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResetClusterTokenRequest.ProtoReflect.Descriptor instead. -func (*ResetClusterTokenRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{19} +// Deprecated: Use GetClustersRequest.ProtoReflect.Descriptor instead. +func (*GetClustersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{15} } -func (x *ResetClusterTokenRequest) GetTeamId() string { +func (x *GetClustersRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *ResetClusterTokenRequest) GetClusterId() string { +func (x *GetClustersRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.ClusterId + return x.StartTime } - return "" -} - -// ResetClusterTokenResponse is the response for a reset cluster token request. -type ResetClusterTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. + return nil } -func (x *ResetClusterTokenResponse) Reset() { - *x = ResetClusterTokenResponse{} +func (x *GetClustersRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetClustersRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +func (x *GetClustersRequest) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +// ListClustersRequest is used to fetch clusters for a specific team with pagination. +// Deprecated: Use GetClustersRequest instead. +// +// Deprecated: Marked as deprecated in api/v1/k8s.proto. +type ListClustersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + Search *string `protobuf:"bytes,2,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter clusters by name or ID + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters +} + +func (x *ListClustersRequest) Reset() { + *x = ListClustersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[20] + mi := &file_api_v1_k8s_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResetClusterTokenResponse) String() string { +func (x *ListClustersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResetClusterTokenResponse) ProtoMessage() {} +func (*ListClustersRequest) ProtoMessage() {} -func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[20] +func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1750,49 +1793,63 @@ func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResetClusterTokenResponse.ProtoReflect.Descriptor instead. -func (*ResetClusterTokenResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{20} +// Deprecated: Use ListClustersRequest.ProtoReflect.Descriptor instead. +func (*ListClustersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{16} } -func (x *ResetClusterTokenResponse) GetToken() string { +func (x *ListClustersRequest) GetTeamId() string { if x != nil { - return x.Token + return x.TeamId } return "" } -// GetNodeGroupsRequest is used to fetch node groups for a specific cluster. -type GetNodeGroupsRequest struct { +func (x *ListClustersRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search + } + return "" +} + +func (x *ListClustersRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +// GetClusterRequest is used to fetch details of a specific cluster for a team. +type GetClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - ShowDeleted bool `protobuf:"varint,21,opt,name=show_deleted,json=showDeleted,proto3" json:"show_deleted,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups } -func (x *GetNodeGroupsRequest) Reset() { - *x = GetNodeGroupsRequest{} +func (x *GetClusterRequest) Reset() { + *x = GetClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[21] + mi := &file_api_v1_k8s_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsRequest) String() string { +func (x *GetClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsRequest) ProtoMessage() {} +func (*GetClusterRequest) ProtoMessage() {} -func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[21] +func (x *GetClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1803,79 +1860,80 @@ func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{21} +// Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead. +func (*GetClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{17} } -func (x *GetNodeGroupsRequest) GetTeamId() string { +func (x *GetClusterRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetNodeGroupsRequest) GetClusterId() string { +func (x *GetClusterRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetNodeGroupsRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetClusterRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { return x.StartTime } return nil } -func (x *GetNodeGroupsRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetClusterRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { return x.EndTime } return nil } -func (x *GetNodeGroupsRequest) GetBucketSize() int32 { +func (x *GetClusterRequest) GetBucketSize() int32 { if x != nil && x.BucketSize != nil { return *x.BucketSize } return 0 } -func (x *GetNodeGroupsRequest) GetShowDeleted() bool { +func (x *GetClusterRequest) GetNodeGroupNames() []string { if x != nil { - return x.ShowDeleted + return x.NodeGroupNames } - return false + return nil } -// GetAllNodeGroupsRequest is used to fetch all node groups for a specific team. -type GetAllNodeGroupsRequest struct { +// DeleteClusterRequest is used to delete a cluster and all its resources. +type DeleteClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. } -func (x *GetAllNodeGroupsRequest) Reset() { - *x = GetAllNodeGroupsRequest{} +func (x *DeleteClusterRequest) Reset() { + *x = DeleteClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[22] + mi := &file_api_v1_k8s_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAllNodeGroupsRequest) String() string { +func (x *DeleteClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAllNodeGroupsRequest) ProtoMessage() {} +func (*DeleteClusterRequest) ProtoMessage() {} -func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[22] +func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1886,44 +1944,49 @@ func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAllNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GetAllNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{22} +// Deprecated: Use DeleteClusterRequest.ProtoReflect.Descriptor instead. +func (*DeleteClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{18} } -func (x *GetAllNodeGroupsRequest) GetTeamId() string { +func (x *DeleteClusterRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -// GetNodeGroupsResponse contains the list of node groups for a specific cluster. -type GetNodeGroupsResponse struct { +func (x *DeleteClusterRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// DeleteClusterResponse is the response for a delete cluster request. +type DeleteClusterResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. } -func (x *GetNodeGroupsResponse) Reset() { - *x = GetNodeGroupsResponse{} +func (x *DeleteClusterResponse) Reset() { + *x = DeleteClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[23] + mi := &file_api_v1_k8s_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsResponse) String() string { +func (x *DeleteClusterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsResponse) ProtoMessage() {} +func (*DeleteClusterResponse) ProtoMessage() {} -func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[23] +func (x *DeleteClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,44 +1997,43 @@ func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{23} -} - -func (x *GetNodeGroupsResponse) GetNodeGroups() []*NodeGroup { - if x != nil { - return x.NodeGroups - } - return nil +// Deprecated: Use DeleteClusterResponse.ProtoReflect.Descriptor instead. +func (*DeleteClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{19} } -// GetAllNodeGroupsResponse contains the list of all node groups for a specific team. -type GetAllNodeGroupsResponse struct { +// UpdateClusterRequest is used to update the configuration of an existing cluster. +// only certain fields can be updated, such as name +type UpdateClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroupMap map[string]*NodeGroup `protobuf:"bytes,1,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of clusterId+nodeGroupName to NodeGroup. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Updated cluster details. + CpuCostPerHour float64 `protobuf:"fixed64,4,opt,name=cpu_cost_per_hour,json=cpuCostPerHour,proto3" json:"cpu_cost_per_hour,omitempty"` // Estimated CPU cost per hour for one vcpu. + MemoryCostPerHour float64 `protobuf:"fixed64,5,opt,name=memory_cost_per_hour,json=memoryCostPerHour,proto3" json:"memory_cost_per_hour,omitempty"` // Estimated memory cost per hour for one GiB of memory. + GpuCostPerHour float64 `protobuf:"fixed64,6,opt,name=gpu_cost_per_hour,json=gpuCostPerHour,proto3" json:"gpu_cost_per_hour,omitempty"` // Estimate GPU cost per hour for one GPU. } -func (x *GetAllNodeGroupsResponse) Reset() { - *x = GetAllNodeGroupsResponse{} +func (x *UpdateClusterRequest) Reset() { + *x = UpdateClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[24] + mi := &file_api_v1_k8s_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAllNodeGroupsResponse) String() string { +func (x *UpdateClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAllNodeGroupsResponse) ProtoMessage() {} +func (*UpdateClusterRequest) ProtoMessage() {} -func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[24] +func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1982,43 +2044,79 @@ func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAllNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GetAllNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{24} +// Deprecated: Use UpdateClusterRequest.ProtoReflect.Descriptor instead. +func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{20} } -func (x *GetAllNodeGroupsResponse) GetNodeGroupMap() map[string]*NodeGroup { +func (x *UpdateClusterRequest) GetTeamId() string { if x != nil { - return x.NodeGroupMap + return x.TeamId } - return nil -} - -type NodeGroupSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. + return "" } -func (x *NodeGroupSet) Reset() { - *x = NodeGroupSet{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *UpdateClusterRequest) GetClusterId() string { + if x != nil { + return x.ClusterId } + return "" } -func (x *NodeGroupSet) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *UpdateClusterRequest) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" } -func (*NodeGroupSet) ProtoMessage() {} +func (x *UpdateClusterRequest) GetCpuCostPerHour() float64 { + if x != nil { + return x.CpuCostPerHour + } + return 0 +} -func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[25] +func (x *UpdateClusterRequest) GetMemoryCostPerHour() float64 { + if x != nil { + return x.MemoryCostPerHour + } + return 0 +} + +func (x *UpdateClusterRequest) GetGpuCostPerHour() float64 { + if x != nil { + return x.GpuCostPerHour + } + return 0 +} + +// UpdateClusterResponse is the response for an update cluster request. +type UpdateClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Updated cluster details. +} + +func (x *UpdateClusterResponse) Reset() { + *x = UpdateClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateClusterResponse) ProtoMessage() {} + +func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2029,48 +2127,45 @@ func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupSet.ProtoReflect.Descriptor instead. -func (*NodeGroupSet) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{25} +// Deprecated: Use UpdateClusterResponse.ProtoReflect.Descriptor instead. +func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{21} } -func (x *NodeGroupSet) GetNodeGroups() []*NodeGroup { +func (x *UpdateClusterResponse) GetCluster() *Cluster { if x != nil { - return x.NodeGroups + return x.Cluster } return nil } -// GetNodeGroupsUtilizationRequest is used to fetch timeseries utilization data for node groups for a specific cluster. -type GetNodeGroupsUtilizationRequest struct { +// GetResourcesResponse is the response for getting k8s resources. +type GetResourcesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Return list of resources requested + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information } -func (x *GetNodeGroupsUtilizationRequest) Reset() { - *x = GetNodeGroupsUtilizationRequest{} +func (x *GetResourcesResponse) Reset() { + *x = GetResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[26] + mi := &file_api_v1_k8s_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsUtilizationRequest) String() string { +func (x *GetResourcesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsUtilizationRequest) ProtoMessage() {} +func (*GetResourcesResponse) ProtoMessage() {} -func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[26] +func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2081,75 +2176,53 @@ func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsUtilizationRequest.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsUtilizationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{26} -} - -func (x *GetNodeGroupsUtilizationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *GetNodeGroupsUtilizationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetResourcesResponse.ProtoReflect.Descriptor instead. +func (*GetResourcesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{22} } -func (x *GetNodeGroupsUtilizationRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetResourcesResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { - return x.StartTime + return x.WorkloadItems } return nil } -func (x *GetNodeGroupsUtilizationRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetResourcesResponse) GetPagination() *Pagination { if x != nil { - return x.EndTime + return x.Pagination } return nil } -func (x *GetNodeGroupsUtilizationRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize - } - return 0 -} - -// GetNodeGroupsResponse contains the list of node groups for a specific cluster. -type GetNodeGroupsUtilizationResponse struct { +// GetResourceFilterOptionsRequest asks for the distinct filterable field values for a resource kind. +type GetResourceFilterOptionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroupToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,1,rep,name=node_group_to_util_metrics,json=nodeGroupToUtilMetrics,proto3" json:"node_group_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - InstanceTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,6,rep,name=instance_type_to_util_metrics,json=instanceTypeToUtilMetrics,proto3" json:"instance_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ReservationTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,11,rep,name=reservation_type_to_util_metrics,json=reservationTypeToUtilMetrics,proto3" json:"reservation_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - LogicalAzToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,16,rep,name=logical_az_to_util_metrics,json=logicalAzToUtilMetrics,proto3" json:"logical_az_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` } -func (x *GetNodeGroupsUtilizationResponse) Reset() { - *x = GetNodeGroupsUtilizationResponse{} +func (x *GetResourceFilterOptionsRequest) Reset() { + *x = GetResourceFilterOptionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[27] + mi := &file_api_v1_k8s_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsUtilizationResponse) String() string { +func (x *GetResourceFilterOptionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsUtilizationResponse) ProtoMessage() {} +func (*GetResourceFilterOptionsRequest) ProtoMessage() {} -func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[27] +func (x *GetResourceFilterOptionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2160,81 +2233,58 @@ func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsUtilizationResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsUtilizationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{27} -} - -func (x *GetNodeGroupsUtilizationResponse) GetNodeGroupToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { - if x != nil { - return x.NodeGroupToUtilMetrics - } - return nil +// Deprecated: Use GetResourceFilterOptionsRequest.ProtoReflect.Descriptor instead. +func (*GetResourceFilterOptionsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{23} } -func (x *GetNodeGroupsUtilizationResponse) GetInstanceTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { +func (x *GetResourceFilterOptionsRequest) GetTeamId() string { if x != nil { - return x.InstanceTypeToUtilMetrics + return x.TeamId } - return nil + return "" } -func (x *GetNodeGroupsUtilizationResponse) GetReservationTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { - if x != nil { - return x.ReservationTypeToUtilMetrics +func (x *GetResourceFilterOptionsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } - return nil + return "" } -func (x *GetNodeGroupsUtilizationResponse) GetLogicalAzToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { +func (x *GetResourceFilterOptionsRequest) GetKind() K8SObjectKind { if x != nil { - return x.LogicalAzToUtilMetrics + return x.Kind } - return nil + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -type NodeGroupMetric struct { +// GetResourceFilterOptionsResponse returns the available filter options per field. +type GetResourceFilterOptionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` - MaxConcurrentNodeCount int32 `protobuf:"varint,2,opt,name=max_concurrent_node_count,json=maxConcurrentNodeCount,proto3" json:"max_concurrent_node_count,omitempty"` - CapacityCpu int64 `protobuf:"varint,11,opt,name=capacity_cpu,json=capacityCpu,proto3" json:"capacity_cpu,omitempty"` // millicores - CapacityMemory int64 `protobuf:"varint,12,opt,name=capacity_memory,json=capacityMemory,proto3" json:"capacity_memory,omitempty"` // bytes - CapacityGpuVram int64 `protobuf:"varint,13,opt,name=capacity_gpu_vram,json=capacityGpuVram,proto3" json:"capacity_gpu_vram,omitempty"` // bytes - CapacityGpuDevices int64 `protobuf:"varint,14,opt,name=capacity_gpu_devices,json=capacityGpuDevices,proto3" json:"capacity_gpu_devices,omitempty"` // number - AggrCpuReq int64 `protobuf:"varint,21,opt,name=aggr_cpu_req,json=aggrCpuReq,proto3" json:"aggr_cpu_req,omitempty"` // millicores - AggrMemoryReq int64 `protobuf:"varint,22,opt,name=aggr_memory_req,json=aggrMemoryReq,proto3" json:"aggr_memory_req,omitempty"` // bytes - AggrGpuReq int64 `protobuf:"varint,23,opt,name=aggr_gpu_req,json=aggrGpuReq,proto3" json:"aggr_gpu_req,omitempty"` // number - UtilCpuAvgUsage float32 `protobuf:"fixed32,31,opt,name=util_cpu_avg_usage,json=utilCpuAvgUsage,proto3" json:"util_cpu_avg_usage,omitempty"` // millicores - UtilMemoryAvgUsage float32 `protobuf:"fixed32,32,opt,name=util_memory_avg_usage,json=utilMemoryAvgUsage,proto3" json:"util_memory_avg_usage,omitempty"` // bytes - UtilGpuVramAvgUsage float32 `protobuf:"fixed32,33,opt,name=util_gpu_vram_avg_usage,json=utilGpuVramAvgUsage,proto3" json:"util_gpu_vram_avg_usage,omitempty"` // bytes - UtilGpuDevice float32 `protobuf:"fixed32,34,opt,name=util_gpu_device,json=utilGpuDevice,proto3" json:"util_gpu_device,omitempty"` // pct - HourlyCost *money.Money `protobuf:"bytes,50,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"` // average hourly cost within the time bucket - HourlyCpuCost *money.Money `protobuf:"bytes,51,opt,name=hourly_cpu_cost,json=hourlyCpuCost,proto3" json:"hourly_cpu_cost,omitempty"` // cost for cpu - HourlyMemoryCost *money.Money `protobuf:"bytes,52,opt,name=hourly_memory_cost,json=hourlyMemoryCost,proto3" json:"hourly_memory_cost,omitempty"` // cost for memory - HourlyGpuCost *money.Money `protobuf:"bytes,53,opt,name=hourly_gpu_cost,json=hourlyGpuCost,proto3" json:"hourly_gpu_cost,omitempty"` // cost for gpu - BucketTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=bucket_time,json=bucketTime,proto3" json:"bucket_time,omitempty"` + Options []*ResourceFilterFieldOptions `protobuf:"bytes,1,rep,name=options,proto3" json:"options,omitempty"` } -func (x *NodeGroupMetric) Reset() { - *x = NodeGroupMetric{} +func (x *GetResourceFilterOptionsResponse) Reset() { + *x = GetResourceFilterOptionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[28] + mi := &file_api_v1_k8s_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupMetric) String() string { +func (x *GetResourceFilterOptionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupMetric) ProtoMessage() {} +func (*GetResourceFilterOptionsResponse) ProtoMessage() {} -func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[28] +func (x *GetResourceFilterOptionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2245,163 +2295,1581 @@ func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupMetric.ProtoReflect.Descriptor instead. -func (*NodeGroupMetric) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{28} +// Deprecated: Use GetResourceFilterOptionsResponse.ProtoReflect.Descriptor instead. +func (*GetResourceFilterOptionsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{24} } -func (x *NodeGroupMetric) GetNodeCount() int32 { +func (x *GetResourceFilterOptionsResponse) GetOptions() []*ResourceFilterFieldOptions { if x != nil { - return x.NodeCount + return x.Options } - return 0 + return nil } -func (x *NodeGroupMetric) GetMaxConcurrentNodeCount() int32 { - if x != nil { - return x.MaxConcurrentNodeCount - } - return 0 +// CreateClusterRequest is used to create a new cluster. +type CreateClusterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Name of the new cluster. } -func (x *NodeGroupMetric) GetCapacityCpu() int64 { - if x != nil { - return x.CapacityCpu +func (x *CreateClusterRequest) Reset() { + *x = CreateClusterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *NodeGroupMetric) GetCapacityMemory() int64 { - if x != nil { - return x.CapacityMemory - } - return 0 +func (x *CreateClusterRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeGroupMetric) GetCapacityGpuVram() int64 { - if x != nil { - return x.CapacityGpuVram +func (*CreateClusterRequest) ProtoMessage() {} + +func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *NodeGroupMetric) GetCapacityGpuDevices() int64 { +// Deprecated: Use CreateClusterRequest.ProtoReflect.Descriptor instead. +func (*CreateClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{25} +} + +func (x *CreateClusterRequest) GetTeamId() string { if x != nil { - return x.CapacityGpuDevices + return x.TeamId } - return 0 + return "" } -func (x *NodeGroupMetric) GetAggrCpuReq() int64 { +func (x *CreateClusterRequest) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +// CreateClusterResponse is the response for a create cluster request. +type CreateClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the created cluster. + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +} + +func (x *CreateClusterResponse) Reset() { + *x = CreateClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateClusterResponse) ProtoMessage() {} + +func (x *CreateClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[26] + 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 CreateClusterResponse.ProtoReflect.Descriptor instead. +func (*CreateClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{26} +} + +func (x *CreateClusterResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +func (x *CreateClusterResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// ResetClusterTokenRequest is used to reset the token for a cluster. +type ResetClusterTokenRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. +} + +func (x *ResetClusterTokenRequest) Reset() { + *x = ResetClusterTokenRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResetClusterTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetClusterTokenRequest) ProtoMessage() {} + +func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[27] + 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 ResetClusterTokenRequest.ProtoReflect.Descriptor instead. +func (*ResetClusterTokenRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{27} +} + +func (x *ResetClusterTokenRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ResetClusterTokenRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ResetClusterTokenResponse is the response for a reset cluster token request. +type ResetClusterTokenResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +} + +func (x *ResetClusterTokenResponse) Reset() { + *x = ResetClusterTokenResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResetClusterTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetClusterTokenResponse) ProtoMessage() {} + +func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[28] + 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 ResetClusterTokenResponse.ProtoReflect.Descriptor instead. +func (*ResetClusterTokenResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{28} +} + +func (x *ResetClusterTokenResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// GetNodeGroupsRequest is used to fetch node groups for a specific cluster. +type GetNodeGroupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + ShowDeleted bool `protobuf:"varint,21,opt,name=show_deleted,json=showDeleted,proto3" json:"show_deleted,omitempty"` +} + +func (x *GetNodeGroupsRequest) Reset() { + *x = GetNodeGroupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsRequest) ProtoMessage() {} + +func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[29] + 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 GetNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{29} +} + +func (x *GetNodeGroupsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeGroupsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeGroupsRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetNodeGroupsRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetNodeGroupsRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +func (x *GetNodeGroupsRequest) GetShowDeleted() bool { + if x != nil { + return x.ShowDeleted + } + return false +} + +// GetAllNodeGroupsRequest is used to fetch all node groups for a specific team. +type GetAllNodeGroupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. +} + +func (x *GetAllNodeGroupsRequest) Reset() { + *x = GetAllNodeGroupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllNodeGroupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllNodeGroupsRequest) ProtoMessage() {} + +func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[30] + 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 GetAllNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GetAllNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{30} +} + +func (x *GetAllNodeGroupsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +// GetNodeGroupsResponse contains the list of node groups for a specific cluster. +type GetNodeGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. +} + +func (x *GetNodeGroupsResponse) Reset() { + *x = GetNodeGroupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsResponse) ProtoMessage() {} + +func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[31] + 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 GetNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{31} +} + +func (x *GetNodeGroupsResponse) GetNodeGroups() []*NodeGroup { + if x != nil { + return x.NodeGroups + } + return nil +} + +// GetAllNodeGroupsResponse contains the list of all node groups for a specific team. +type GetAllNodeGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroupMap map[string]*NodeGroup `protobuf:"bytes,1,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of clusterId+nodeGroupName to NodeGroup. +} + +func (x *GetAllNodeGroupsResponse) Reset() { + *x = GetAllNodeGroupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllNodeGroupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllNodeGroupsResponse) ProtoMessage() {} + +func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[32] + 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 GetAllNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GetAllNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{32} +} + +func (x *GetAllNodeGroupsResponse) GetNodeGroupMap() map[string]*NodeGroup { + if x != nil { + return x.NodeGroupMap + } + return nil +} + +type NodeGroupSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. +} + +func (x *NodeGroupSet) Reset() { + *x = NodeGroupSet{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupSet) ProtoMessage() {} + +func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[33] + 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 NodeGroupSet.ProtoReflect.Descriptor instead. +func (*NodeGroupSet) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{33} +} + +func (x *NodeGroupSet) GetNodeGroups() []*NodeGroup { + if x != nil { + return x.NodeGroups + } + return nil +} + +// GetNodeGroupsUtilizationRequest is used to fetch timeseries utilization data for node groups for a specific cluster. +type GetNodeGroupsUtilizationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` +} + +func (x *GetNodeGroupsUtilizationRequest) Reset() { + *x = GetNodeGroupsUtilizationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsUtilizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsUtilizationRequest) ProtoMessage() {} + +func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[34] + 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 GetNodeGroupsUtilizationRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsUtilizationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{34} +} + +func (x *GetNodeGroupsUtilizationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeGroupsUtilizationRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeGroupsUtilizationRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetNodeGroupsUtilizationRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetNodeGroupsUtilizationRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +// GetNodeGroupsResponse contains the list of node groups for a specific cluster. +type GetNodeGroupsUtilizationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroupToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,1,rep,name=node_group_to_util_metrics,json=nodeGroupToUtilMetrics,proto3" json:"node_group_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + InstanceTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,6,rep,name=instance_type_to_util_metrics,json=instanceTypeToUtilMetrics,proto3" json:"instance_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ReservationTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,11,rep,name=reservation_type_to_util_metrics,json=reservationTypeToUtilMetrics,proto3" json:"reservation_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + LogicalAzToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,16,rep,name=logical_az_to_util_metrics,json=logicalAzToUtilMetrics,proto3" json:"logical_az_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetNodeGroupsUtilizationResponse) Reset() { + *x = GetNodeGroupsUtilizationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsUtilizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsUtilizationResponse) ProtoMessage() {} + +func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[35] + 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 GetNodeGroupsUtilizationResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsUtilizationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{35} +} + +func (x *GetNodeGroupsUtilizationResponse) GetNodeGroupToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.NodeGroupToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetInstanceTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.InstanceTypeToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetReservationTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.ReservationTypeToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetLogicalAzToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.LogicalAzToUtilMetrics + } + return nil +} + +type NodeGroupMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` + MaxConcurrentNodeCount int32 `protobuf:"varint,2,opt,name=max_concurrent_node_count,json=maxConcurrentNodeCount,proto3" json:"max_concurrent_node_count,omitempty"` + CapacityCpu int64 `protobuf:"varint,11,opt,name=capacity_cpu,json=capacityCpu,proto3" json:"capacity_cpu,omitempty"` // millicores + CapacityMemory int64 `protobuf:"varint,12,opt,name=capacity_memory,json=capacityMemory,proto3" json:"capacity_memory,omitempty"` // bytes + CapacityGpuVram int64 `protobuf:"varint,13,opt,name=capacity_gpu_vram,json=capacityGpuVram,proto3" json:"capacity_gpu_vram,omitempty"` // bytes + CapacityGpuDevices int64 `protobuf:"varint,14,opt,name=capacity_gpu_devices,json=capacityGpuDevices,proto3" json:"capacity_gpu_devices,omitempty"` // number + AggrCpuReq int64 `protobuf:"varint,21,opt,name=aggr_cpu_req,json=aggrCpuReq,proto3" json:"aggr_cpu_req,omitempty"` // millicores + AggrMemoryReq int64 `protobuf:"varint,22,opt,name=aggr_memory_req,json=aggrMemoryReq,proto3" json:"aggr_memory_req,omitempty"` // bytes + AggrGpuReq int64 `protobuf:"varint,23,opt,name=aggr_gpu_req,json=aggrGpuReq,proto3" json:"aggr_gpu_req,omitempty"` // number + UtilCpuAvgUsage float32 `protobuf:"fixed32,31,opt,name=util_cpu_avg_usage,json=utilCpuAvgUsage,proto3" json:"util_cpu_avg_usage,omitempty"` // millicores + UtilMemoryAvgUsage float32 `protobuf:"fixed32,32,opt,name=util_memory_avg_usage,json=utilMemoryAvgUsage,proto3" json:"util_memory_avg_usage,omitempty"` // bytes + UtilGpuVramAvgUsage float32 `protobuf:"fixed32,33,opt,name=util_gpu_vram_avg_usage,json=utilGpuVramAvgUsage,proto3" json:"util_gpu_vram_avg_usage,omitempty"` // bytes + UtilGpuDevice float32 `protobuf:"fixed32,34,opt,name=util_gpu_device,json=utilGpuDevice,proto3" json:"util_gpu_device,omitempty"` // pct + HourlyCost *money.Money `protobuf:"bytes,50,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"` // average hourly cost within the time bucket + HourlyCpuCost *money.Money `protobuf:"bytes,51,opt,name=hourly_cpu_cost,json=hourlyCpuCost,proto3" json:"hourly_cpu_cost,omitempty"` // cost for cpu + HourlyMemoryCost *money.Money `protobuf:"bytes,52,opt,name=hourly_memory_cost,json=hourlyMemoryCost,proto3" json:"hourly_memory_cost,omitempty"` // cost for memory + HourlyGpuCost *money.Money `protobuf:"bytes,53,opt,name=hourly_gpu_cost,json=hourlyGpuCost,proto3" json:"hourly_gpu_cost,omitempty"` // cost for gpu + BucketTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=bucket_time,json=bucketTime,proto3" json:"bucket_time,omitempty"` +} + +func (x *NodeGroupMetric) Reset() { + *x = NodeGroupMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupMetric) ProtoMessage() {} + +func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[36] + 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 NodeGroupMetric.ProtoReflect.Descriptor instead. +func (*NodeGroupMetric) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{36} +} + +func (x *NodeGroupMetric) GetNodeCount() int32 { + if x != nil { + return x.NodeCount + } + return 0 +} + +func (x *NodeGroupMetric) GetMaxConcurrentNodeCount() int32 { + if x != nil { + return x.MaxConcurrentNodeCount + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityCpu() int64 { + if x != nil { + return x.CapacityCpu + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityMemory() int64 { + if x != nil { + return x.CapacityMemory + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityGpuVram() int64 { + if x != nil { + return x.CapacityGpuVram + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityGpuDevices() int64 { + if x != nil { + return x.CapacityGpuDevices + } + return 0 +} + +func (x *NodeGroupMetric) GetAggrCpuReq() int64 { if x != nil { return x.AggrCpuReq } - return 0 + return 0 +} + +func (x *NodeGroupMetric) GetAggrMemoryReq() int64 { + if x != nil { + return x.AggrMemoryReq + } + return 0 +} + +func (x *NodeGroupMetric) GetAggrGpuReq() int64 { + if x != nil { + return x.AggrGpuReq + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilCpuAvgUsage() float32 { + if x != nil { + return x.UtilCpuAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilMemoryAvgUsage() float32 { + if x != nil { + return x.UtilMemoryAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilGpuVramAvgUsage() float32 { + if x != nil { + return x.UtilGpuVramAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilGpuDevice() float32 { + if x != nil { + return x.UtilGpuDevice + } + return 0 +} + +func (x *NodeGroupMetric) GetHourlyCost() *money.Money { + if x != nil { + return x.HourlyCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyCpuCost() *money.Money { + if x != nil { + return x.HourlyCpuCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyMemoryCost() *money.Money { + if x != nil { + return x.HourlyMemoryCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyGpuCost() *money.Money { + if x != nil { + return x.HourlyGpuCost + } + return nil +} + +func (x *NodeGroupMetric) GetBucketTime() *timestamppb.Timestamp { + if x != nil { + return x.BucketTime + } + return nil +} + +// GetNodeGroupResponse contains node group for a specific cluster. +type GetNodeGroupResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroup *NodeGroup `protobuf:"bytes,1,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` // Node Group +} + +func (x *GetNodeGroupResponse) Reset() { + *x = GetNodeGroupResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupResponse) ProtoMessage() {} + +func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[37] + 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 GetNodeGroupResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{37} +} + +func (x *GetNodeGroupResponse) GetNodeGroup() *NodeGroup { + if x != nil { + return x.NodeGroup + } + return nil +} + +// GetClusterResponse contains details of a specific cluster for a team. +type GetClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the cluster. +} + +func (x *GetClusterResponse) Reset() { + *x = GetClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterResponse) ProtoMessage() {} + +func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[38] + 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 GetClusterResponse.ProtoReflect.Descriptor instead. +func (*GetClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{38} +} + +func (x *GetClusterResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +// GetClustersResponse contains the list of clusters and aggregated metrics for a team. +type GetClustersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics across clusters. + CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information across clusters. + NodeInfo *NodeInfo `protobuf:"bytes,4,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Aggregated node information across clusters. + CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource utilization data points. +} + +func (x *GetClustersResponse) Reset() { + *x = GetClustersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClustersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClustersResponse) ProtoMessage() {} + +func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetClustersResponse.ProtoReflect.Descriptor instead. +func (*GetClustersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{39} +} + +func (x *GetClustersResponse) GetClusters() []*Cluster { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *GetClustersResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetClustersResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetClustersResponse) GetNodeInfo() *NodeInfo { + if x != nil { + return x.NodeInfo + } + return nil +} + +func (x *GetClustersResponse) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *GetClustersResponse) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// ListClustersResponse contains the paginated list of clusters for a team. +// Deprecated: Use GetClustersResponse instead. +// +// Deprecated: Marked as deprecated in api/v1/k8s.proto. +type ListClustersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information. +} + +func (x *ListClustersResponse) Reset() { + *x = ListClustersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListClustersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListClustersResponse) ProtoMessage() {} + +func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 ListClustersResponse.ProtoReflect.Descriptor instead. +func (*ListClustersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{40} +} + +func (x *ListClustersResponse) GetClusters() []*Cluster { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *ListClustersResponse) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +// GetNodeResponse contains details and metrics for a specific node in a cluster. +type GetNodeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Details of the node. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the node. + CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost details for the node. + CostDataPoints []*CostDataPoint `protobuf:"bytes,4,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,5,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node. +} + +func (x *GetNodeResponse) Reset() { + *x = GetNodeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeResponse) ProtoMessage() {} + +func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetNodeResponse.ProtoReflect.Descriptor instead. +func (*GetNodeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{41} +} + +func (x *GetNodeResponse) GetNode() *Node { + if x != nil { + return x.Node + } + return nil +} + +func (x *GetNodeResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetNodeResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetNodeResponse) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *GetNodeResponse) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// GetWorkloadsResponse contains a list of workloads and aggregated metrics for a cluster. +type GetWorkloadsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of workload hierarchy items. + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for workloads. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for workloads. + ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses. +} + +func (x *GetWorkloadsResponse) Reset() { + *x = GetWorkloadsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadsResponse) ProtoMessage() {} + +func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetWorkloadsResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{42} +} + +func (x *GetWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { + if x != nil { + return x.WorkloadItems + } + return nil +} + +func (x *GetWorkloadsResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetWorkloadsResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetWorkloadsResponse) GetResourceSummary() *ResourceSummary { + if x != nil { + return x.ResourceSummary + } + return nil +} + +// GetWorkloadResponse contains details and metrics for a specific workload in a cluster. +type GetWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadItem *WorkloadItem `protobuf:"bytes,1,opt,name=workload_item,json=workloadItem,proto3" json:"workload_item,omitempty"` // Details of the workload hierarchy. + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the workload. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the workload. + ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses for the workload. + CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. +} + +func (x *GetWorkloadResponse) Reset() { + *x = GetWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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) } -func (x *NodeGroupMetric) GetAggrMemoryReq() int64 { +// Deprecated: Use GetWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{43} +} + +func (x *GetWorkloadResponse) GetWorkloadItem() *WorkloadItem { if x != nil { - return x.AggrMemoryReq + return x.WorkloadItem } - return 0 + return nil } -func (x *NodeGroupMetric) GetAggrGpuReq() int64 { +func (x *GetWorkloadResponse) GetCostInfo() *CostInfo { if x != nil { - return x.AggrGpuReq + return x.CostInfo } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilCpuAvgUsage() float32 { +func (x *GetWorkloadResponse) GetResourceMetrics() *ResourceMetrics { if x != nil { - return x.UtilCpuAvgUsage + return x.ResourceMetrics } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilMemoryAvgUsage() float32 { +func (x *GetWorkloadResponse) GetResourceSummary() *ResourceSummary { if x != nil { - return x.UtilMemoryAvgUsage + return x.ResourceSummary } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilGpuVramAvgUsage() float32 { +func (x *GetWorkloadResponse) GetCostDataPoints() []*CostDataPoint { if x != nil { - return x.UtilGpuVramAvgUsage + return x.CostDataPoints } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilGpuDevice() float32 { +func (x *GetWorkloadResponse) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.UtilGpuDevice + return x.ResourceDataPoints } - return 0 + return nil } -func (x *NodeGroupMetric) GetHourlyCost() *money.Money { +// GetWorkloadContainerPercentilesRequest requests per-container percentile metrics for a workload. +type GetWorkloadContainerPercentilesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` +} + +func (x *GetWorkloadContainerPercentilesRequest) Reset() { + *x = GetWorkloadContainerPercentilesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerPercentilesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerPercentilesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetWorkloadContainerPercentilesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerPercentilesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{44} +} + +func (x *GetWorkloadContainerPercentilesRequest) GetTeamId() string { if x != nil { - return x.HourlyCost + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime } return nil } -func (x *NodeGroupMetric) GetHourlyCpuCost() *money.Money { +func (x *GetWorkloadContainerPercentilesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.HourlyCpuCost + return x.EndTime } return nil } -func (x *NodeGroupMetric) GetHourlyMemoryCost() *money.Money { +// GetWorkloadContainerPercentilesResponse returns per-container percentile statistics. +type GetWorkloadContainerPercentilesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerPercentileSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` +} + +func (x *GetWorkloadContainerPercentilesResponse) Reset() { + *x = GetWorkloadContainerPercentilesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerPercentilesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerPercentilesResponse) ProtoMessage() {} + +func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetWorkloadContainerPercentilesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerPercentilesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{45} +} + +func (x *GetWorkloadContainerPercentilesResponse) GetContainers() []*ContainerPercentileSummary { + if x != nil { + return x.Containers + } + return nil +} + +// GetWorkloadContainerTimeSeriesRequest requests per-container time-series metrics for a workload. +type GetWorkloadContainerTimeSeriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` +} + +func (x *GetWorkloadContainerTimeSeriesRequest) Reset() { + *x = GetWorkloadContainerTimeSeriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerTimeSeriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerTimeSeriesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_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 GetWorkloadContainerTimeSeriesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerTimeSeriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{46} +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetUid() string { if x != nil { - return x.HourlyMemoryCost + return x.Uid } - return nil + return "" } -func (x *NodeGroupMetric) GetHourlyGpuCost() *money.Money { +func (x *GetWorkloadContainerTimeSeriesRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.HourlyGpuCost + return x.StartTime } return nil } -func (x *NodeGroupMetric) GetBucketTime() *timestamppb.Timestamp { +func (x *GetWorkloadContainerTimeSeriesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.BucketTime + return x.EndTime } return nil } -// GetNodeGroupResponse contains node group for a specific cluster. -type GetNodeGroupResponse struct { +// GetWorkloadContainerTimeSeriesResponse returns per-container time-series data. +type GetWorkloadContainerTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroup *NodeGroup `protobuf:"bytes,1,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` // Node Group + Containers []*ContainerTimeSeries `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` } -func (x *GetNodeGroupResponse) Reset() { - *x = GetNodeGroupResponse{} +func (x *GetWorkloadContainerTimeSeriesResponse) Reset() { + *x = GetWorkloadContainerTimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[29] + mi := &file_api_v1_k8s_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupResponse) String() string { +func (x *GetWorkloadContainerTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupResponse) ProtoMessage() {} +func (*GetWorkloadContainerTimeSeriesResponse) ProtoMessage() {} -func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[29] +func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2412,44 +3880,46 @@ func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{29} +// Deprecated: Use GetWorkloadContainerTimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerTimeSeriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{47} } -func (x *GetNodeGroupResponse) GetNodeGroup() *NodeGroup { +func (x *GetWorkloadContainerTimeSeriesResponse) GetContainers() []*ContainerTimeSeries { if x != nil { - return x.NodeGroup + return x.Containers } return nil } -// GetClusterResponse contains details of a specific cluster for a team. -type GetClusterResponse struct { +// GetLatestContainerRequestLimitsRequest requests the most recent request/limit values per container. +type GetLatestContainerRequestLimitsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetClusterResponse) Reset() { - *x = GetClusterResponse{} +func (x *GetLatestContainerRequestLimitsRequest) Reset() { + *x = GetLatestContainerRequestLimitsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[30] + mi := &file_api_v1_k8s_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterResponse) String() string { +func (x *GetLatestContainerRequestLimitsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterResponse) ProtoMessage() {} +func (*GetLatestContainerRequestLimitsRequest) ProtoMessage() {} -func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[30] +func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2460,49 +3930,58 @@ func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterResponse.ProtoReflect.Descriptor instead. -func (*GetClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{30} +// Deprecated: Use GetLatestContainerRequestLimitsRequest.ProtoReflect.Descriptor instead. +func (*GetLatestContainerRequestLimitsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{48} } -func (x *GetClusterResponse) GetCluster() *Cluster { +func (x *GetLatestContainerRequestLimitsRequest) GetTeamId() string { if x != nil { - return x.Cluster + return x.TeamId } - return nil + return "" } -// GetClustersResponse contains the list of clusters and aggregated metrics for a team. -type GetClustersResponse struct { +func (x *GetLatestContainerRequestLimitsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetLatestContainerRequestLimitsRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +// GetLatestContainerRequestLimitsResponse returns per-container request/limit values. +type GetLatestContainerRequestLimitsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics across clusters. - CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information across clusters. - NodeInfo *NodeInfo `protobuf:"bytes,4,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Aggregated node information across clusters. - CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource utilization data points. + Containers []*ContainerRequestLimits `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` } -func (x *GetClustersResponse) Reset() { - *x = GetClustersResponse{} +func (x *GetLatestContainerRequestLimitsResponse) Reset() { + *x = GetLatestContainerRequestLimitsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[31] + mi := &file_api_v1_k8s_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClustersResponse) String() string { +func (x *GetLatestContainerRequestLimitsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClustersResponse) ProtoMessage() {} +func (*GetLatestContainerRequestLimitsResponse) ProtoMessage() {} -func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[31] +func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2513,83 +3992,47 @@ func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClustersResponse.ProtoReflect.Descriptor instead. -func (*GetClustersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{31} -} - -func (x *GetClustersResponse) GetClusters() []*Cluster { - if x != nil { - return x.Clusters - } - return nil -} - -func (x *GetClustersResponse) GetResourceMetrics() *ResourceMetrics { - if x != nil { - return x.ResourceMetrics - } - return nil -} - -func (x *GetClustersResponse) GetCostInfo() *CostInfo { - if x != nil { - return x.CostInfo - } - return nil -} - -func (x *GetClustersResponse) GetNodeInfo() *NodeInfo { - if x != nil { - return x.NodeInfo - } - return nil -} - -func (x *GetClustersResponse) GetCostDataPoints() []*CostDataPoint { - if x != nil { - return x.CostDataPoints - } - return nil +// Deprecated: Use GetLatestContainerRequestLimitsResponse.ProtoReflect.Descriptor instead. +func (*GetLatestContainerRequestLimitsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{49} } -func (x *GetClustersResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GetLatestContainerRequestLimitsResponse) GetContainers() []*ContainerRequestLimits { if x != nil { - return x.ResourceDataPoints + return x.Containers } return nil } -// ListClustersResponse contains the paginated list of clusters for a team. -// Deprecated: Use GetClustersResponse instead. -// -// Deprecated: Marked as deprecated in api/v1/k8s.proto. -type ListClustersResponse struct { +// GetNodeGPUMigInstancesRequest requests the most recent MIG-instance telemetry for a node. +type GetNodeGPUMigInstancesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeId *string `protobuf:"bytes,3,opt,name=node_id,json=nodeId,proto3,oneof" json:"node_id,omitempty"` // Unique identifier for the node. + NodeUid *string `protobuf:"bytes,4,opt,name=node_uid,json=nodeUid,proto3,oneof" json:"node_uid,omitempty"` // alternatively -> Unique identifier for the node. } -func (x *ListClustersResponse) Reset() { - *x = ListClustersResponse{} +func (x *GetNodeGPUMigInstancesRequest) Reset() { + *x = GetNodeGPUMigInstancesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[32] + mi := &file_api_v1_k8s_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListClustersResponse) String() string { +func (x *GetNodeGPUMigInstancesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListClustersResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstancesRequest) ProtoMessage() {} -func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[32] +func (x *GetNodeGPUMigInstancesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2600,55 +4043,66 @@ func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListClustersResponse.ProtoReflect.Descriptor instead. -func (*ListClustersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{32} +// Deprecated: Use GetNodeGPUMigInstancesRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstancesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{50} } -func (x *ListClustersResponse) GetClusters() []*Cluster { +func (x *GetNodeGPUMigInstancesRequest) GetTeamId() string { if x != nil { - return x.Clusters + return x.TeamId } - return nil + return "" } -func (x *ListClustersResponse) GetPagination() *Pagination { +func (x *GetNodeGPUMigInstancesRequest) GetClusterId() string { if x != nil { - return x.Pagination + return x.ClusterId } - return nil + return "" } -// GetNodeResponse contains details and metrics for a specific node in a cluster. -type GetNodeResponse struct { +func (x *GetNodeGPUMigInstancesRequest) GetNodeId() string { + if x != nil && x.NodeId != nil { + return *x.NodeId + } + return "" +} + +func (x *GetNodeGPUMigInstancesRequest) GetNodeUid() string { + if x != nil && x.NodeUid != nil { + return *x.NodeUid + } + return "" +} + +// GetNodeGPUMigInstancesResponse returns the node's most recent MIG-instance telemetry. +type GetNodeGPUMigInstancesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Details of the node. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the node. - CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost details for the node. - CostDataPoints []*CostDataPoint `protobuf:"bytes,4,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,5,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node. + Instances []*GPUMigInstance `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=collected_at,json=collectedAt,proto3,oneof" json:"collected_at,omitempty"` } -func (x *GetNodeResponse) Reset() { - *x = GetNodeResponse{} +func (x *GetNodeGPUMigInstancesResponse) Reset() { + *x = GetNodeGPUMigInstancesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[33] + mi := &file_api_v1_k8s_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeResponse) String() string { +func (x *GetNodeGPUMigInstancesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstancesResponse) ProtoMessage() {} -func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[33] +func (x *GetNodeGPUMigInstancesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,75 +4113,57 @@ func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeResponse.ProtoReflect.Descriptor instead. -func (*GetNodeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{33} -} - -func (x *GetNodeResponse) GetNode() *Node { - if x != nil { - return x.Node - } - return nil -} - -func (x *GetNodeResponse) GetResourceMetrics() *ResourceMetrics { - if x != nil { - return x.ResourceMetrics - } - return nil -} - -func (x *GetNodeResponse) GetCostInfo() *CostInfo { - if x != nil { - return x.CostInfo - } - return nil +// Deprecated: Use GetNodeGPUMigInstancesResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstancesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{51} } -func (x *GetNodeResponse) GetCostDataPoints() []*CostDataPoint { +func (x *GetNodeGPUMigInstancesResponse) GetInstances() []*GPUMigInstance { if x != nil { - return x.CostDataPoints + return x.Instances } return nil } -func (x *GetNodeResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GetNodeGPUMigInstancesResponse) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.ResourceDataPoints + return x.CollectedAt } return nil } -// GetWorkloadsResponse contains a list of workloads and aggregated metrics for a cluster. -type GetWorkloadsResponse struct { +// GetNodeGPUMigInstanceTimeseriesRequest requests per-MIG-instance +// utilization as a time series for a node over a time range. +type GetNodeGPUMigInstanceTimeseriesRequest struct { state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of workload hierarchy items. - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for workloads. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for workloads. - ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses. + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeId *string `protobuf:"bytes,3,opt,name=node_id,json=nodeId,proto3,oneof" json:"node_id,omitempty"` + NodeUid *string `protobuf:"bytes,4,opt,name=node_uid,json=nodeUid,proto3,oneof" json:"node_uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` } -func (x *GetWorkloadsResponse) Reset() { - *x = GetWorkloadsResponse{} +func (x *GetNodeGPUMigInstanceTimeseriesRequest) Reset() { + *x = GetNodeGPUMigInstanceTimeseriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[34] + mi := &file_api_v1_k8s_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadsResponse) String() string { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadsResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstanceTimeseriesRequest) ProtoMessage() {} -func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[34] +func (x *GetNodeGPUMigInstanceTimeseriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2738,70 +4174,85 @@ func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadsResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{34} +// Deprecated: Use GetNodeGPUMigInstanceTimeseriesRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstanceTimeseriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{52} } -func (x *GetWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetTeamId() string { if x != nil { - return x.WorkloadItems + return x.TeamId } - return nil + return "" } -func (x *GetWorkloadsResponse) GetCostInfo() *CostInfo { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetClusterId() string { if x != nil { - return x.CostInfo + return x.ClusterId } - return nil + return "" } -func (x *GetWorkloadsResponse) GetResourceMetrics() *ResourceMetrics { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetNodeId() string { + if x != nil && x.NodeId != nil { + return *x.NodeId + } + return "" +} + +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetNodeUid() string { + if x != nil && x.NodeUid != nil { + return *x.NodeUid + } + return "" +} + +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.ResourceMetrics + return x.StartTime } return nil } -func (x *GetWorkloadsResponse) GetResourceSummary() *ResourceSummary { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.ResourceSummary + return x.EndTime } return nil } -// GetWorkloadResponse contains details and metrics for a specific workload in a cluster. -type GetWorkloadResponse struct { +// GPUMigInstanceDataPoint is one timestamped sample of a single MIG +// instance's utilization. +type GPUMigInstanceDataPoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItem *WorkloadItem `protobuf:"bytes,1,opt,name=workload_item,json=workloadItem,proto3" json:"workload_item,omitempty"` // Details of the workload hierarchy. - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the workload. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the workload. - ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses for the workload. - CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + TensorActive float64 `protobuf:"fixed64,2,opt,name=tensor_active,json=tensorActive,proto3" json:"tensor_active,omitempty"` + DramActive float64 `protobuf:"fixed64,3,opt,name=dram_active,json=dramActive,proto3" json:"dram_active,omitempty"` + GraphicsEngineActive float64 `protobuf:"fixed64,4,opt,name=graphics_engine_active,json=graphicsEngineActive,proto3" json:"graphics_engine_active,omitempty"` + FramebufferUsed float64 `protobuf:"fixed64,5,opt,name=framebuffer_used,json=framebufferUsed,proto3" json:"framebuffer_used,omitempty"` + FramebufferTotal float64 `protobuf:"fixed64,6,opt,name=framebuffer_total,json=framebufferTotal,proto3" json:"framebuffer_total,omitempty"` } -func (x *GetWorkloadResponse) Reset() { - *x = GetWorkloadResponse{} +func (x *GPUMigInstanceDataPoint) Reset() { + *x = GPUMigInstanceDataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[35] + mi := &file_api_v1_k8s_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadResponse) String() string { +func (x *GPUMigInstanceDataPoint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadResponse) ProtoMessage() {} +func (*GPUMigInstanceDataPoint) ProtoMessage() {} -func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[35] +func (x *GPUMigInstanceDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2812,84 +4263,84 @@ func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{35} +// Deprecated: Use GPUMigInstanceDataPoint.ProtoReflect.Descriptor instead. +func (*GPUMigInstanceDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{53} } -func (x *GetWorkloadResponse) GetWorkloadItem() *WorkloadItem { +func (x *GPUMigInstanceDataPoint) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.WorkloadItem + return x.Timestamp } return nil } -func (x *GetWorkloadResponse) GetCostInfo() *CostInfo { +func (x *GPUMigInstanceDataPoint) GetTensorActive() float64 { if x != nil { - return x.CostInfo + return x.TensorActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceMetrics() *ResourceMetrics { +func (x *GPUMigInstanceDataPoint) GetDramActive() float64 { if x != nil { - return x.ResourceMetrics + return x.DramActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceSummary() *ResourceSummary { +func (x *GPUMigInstanceDataPoint) GetGraphicsEngineActive() float64 { if x != nil { - return x.ResourceSummary + return x.GraphicsEngineActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetCostDataPoints() []*CostDataPoint { +func (x *GPUMigInstanceDataPoint) GetFramebufferUsed() float64 { if x != nil { - return x.CostDataPoints + return x.FramebufferUsed } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GPUMigInstanceDataPoint) GetFramebufferTotal() float64 { if x != nil { - return x.ResourceDataPoints + return x.FramebufferTotal } - return nil + return 0 } -// GetWorkloadContainerPercentilesRequest requests per-container percentile metrics for a workload. -type GetWorkloadContainerPercentilesRequest struct { +// GPUMigInstanceTimeseries is one MIG instance's identity plus its +// utilization samples over the requested time range. +type GPUMigInstanceTimeseries struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + MigInstanceId string `protobuf:"bytes,1,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + MigProfile string `protobuf:"bytes,2,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + DeviceUuid string `protobuf:"bytes,3,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"` + ModelName string `protobuf:"bytes,4,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + Points []*GPUMigInstanceDataPoint `protobuf:"bytes,5,rep,name=points,proto3" json:"points,omitempty"` } -func (x *GetWorkloadContainerPercentilesRequest) Reset() { - *x = GetWorkloadContainerPercentilesRequest{} +func (x *GPUMigInstanceTimeseries) Reset() { + *x = GPUMigInstanceTimeseries{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[36] + mi := &file_api_v1_k8s_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerPercentilesRequest) String() string { +func (x *GPUMigInstanceTimeseries) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerPercentilesRequest) ProtoMessage() {} +func (*GPUMigInstanceTimeseries) ProtoMessage() {} -func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[36] +func (x *GPUMigInstanceTimeseries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2900,79 +4351,73 @@ func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerPercentilesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerPercentilesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{36} +// Deprecated: Use GPUMigInstanceTimeseries.ProtoReflect.Descriptor instead. +func (*GPUMigInstanceTimeseries) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{54} } -func (x *GetWorkloadContainerPercentilesRequest) GetTeamId() string { +func (x *GPUMigInstanceTimeseries) GetMigInstanceId() string { if x != nil { - return x.TeamId + return x.MigInstanceId } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetClusterId() string { +func (x *GPUMigInstanceTimeseries) GetMigProfile() string { if x != nil { - return x.ClusterId + return x.MigProfile } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetKind() string { +func (x *GPUMigInstanceTimeseries) GetDeviceUuid() string { if x != nil { - return x.Kind + return x.DeviceUuid } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetUid() string { +func (x *GPUMigInstanceTimeseries) GetModelName() string { if x != nil { - return x.Uid + return x.ModelName } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime - } - return nil -} - -func (x *GetWorkloadContainerPercentilesRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GPUMigInstanceTimeseries) GetPoints() []*GPUMigInstanceDataPoint { if x != nil { - return x.EndTime + return x.Points } return nil } -// GetWorkloadContainerPercentilesResponse returns per-container percentile statistics. -type GetWorkloadContainerPercentilesResponse struct { +// GetNodeGPUMigInstanceTimeseriesResponse returns one series per MIG +// instance present on the node during the requested range. +type GetNodeGPUMigInstanceTimeseriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerPercentileSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Instances []*GPUMigInstanceTimeseries `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty"` } -func (x *GetWorkloadContainerPercentilesResponse) Reset() { - *x = GetWorkloadContainerPercentilesResponse{} +func (x *GetNodeGPUMigInstanceTimeseriesResponse) Reset() { + *x = GetNodeGPUMigInstanceTimeseriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[37] + mi := &file_api_v1_k8s_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerPercentilesResponse) String() string { +func (x *GetNodeGPUMigInstanceTimeseriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerPercentilesResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstanceTimeseriesResponse) ProtoMessage() {} -func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[37] +func (x *GetNodeGPUMigInstanceTimeseriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2983,49 +4428,46 @@ func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerPercentilesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerPercentilesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{37} +// Deprecated: Use GetNodeGPUMigInstanceTimeseriesResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstanceTimeseriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{55} } -func (x *GetWorkloadContainerPercentilesResponse) GetContainers() []*ContainerPercentileSummary { +func (x *GetNodeGPUMigInstanceTimeseriesResponse) GetInstances() []*GPUMigInstanceTimeseries { if x != nil { - return x.Containers + return x.Instances } return nil } -// GetWorkloadContainerTimeSeriesRequest requests per-container time-series metrics for a workload. -type GetWorkloadContainerTimeSeriesRequest struct { +// GetContainerIndividualGPUMetricsRequest requests the most recent per-GPU breakdown per container. +type GetContainerIndividualGPUMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetWorkloadContainerTimeSeriesRequest) Reset() { - *x = GetWorkloadContainerTimeSeriesRequest{} +func (x *GetContainerIndividualGPUMetricsRequest) Reset() { + *x = GetContainerIndividualGPUMetricsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[38] + mi := &file_api_v1_k8s_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerTimeSeriesRequest) String() string { +func (x *GetContainerIndividualGPUMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerTimeSeriesRequest) ProtoMessage() {} +func (*GetContainerIndividualGPUMetricsRequest) ProtoMessage() {} -func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[38] +func (x *GetContainerIndividualGPUMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3036,79 +4478,108 @@ func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerTimeSeriesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerTimeSeriesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{38} +// Deprecated: Use GetContainerIndividualGPUMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetContainerIndividualGPUMetricsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{56} } -func (x *GetWorkloadContainerTimeSeriesRequest) GetTeamId() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetClusterId() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetKind() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetUid() string { if x != nil { - return x.Kind + return x.Uid } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetUid() string { - if x != nil { - return x.Uid +// GetContainerIndividualGPUMetricsResponse returns per-container per-GPU breakdowns. +type GetContainerIndividualGPUMetricsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerIndividualGPUMetrics `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` +} + +func (x *GetContainerIndividualGPUMetricsResponse) Reset() { + *x = GetContainerIndividualGPUMetricsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime +func (x *GetContainerIndividualGPUMetricsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetContainerIndividualGPUMetricsResponse) ProtoMessage() {} + +func (x *GetContainerIndividualGPUMetricsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *GetWorkloadContainerTimeSeriesRequest) GetEndTime() *timestamppb.Timestamp { +// Deprecated: Use GetContainerIndividualGPUMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetContainerIndividualGPUMetricsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{57} +} + +func (x *GetContainerIndividualGPUMetricsResponse) GetContainers() []*ContainerIndividualGPUMetrics { if x != nil { - return x.EndTime + return x.Containers } return nil } -// GetWorkloadContainerTimeSeriesResponse returns per-container time-series data. -type GetWorkloadContainerTimeSeriesResponse struct { +// LanguageVersions holds every distinct version detected for one language +// across a cluster's workloads. +type LanguageVersions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTimeSeries `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"` + Versions []string `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` } -func (x *GetWorkloadContainerTimeSeriesResponse) Reset() { - *x = GetWorkloadContainerTimeSeriesResponse{} +func (x *LanguageVersions) Reset() { + *x = LanguageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[39] + mi := &file_api_v1_k8s_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerTimeSeriesResponse) String() string { +func (x *LanguageVersions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerTimeSeriesResponse) ProtoMessage() {} +func (*LanguageVersions) ProtoMessage() {} -func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[39] +func (x *LanguageVersions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3119,46 +4590,53 @@ func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerTimeSeriesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerTimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{39} +// Deprecated: Use LanguageVersions.ProtoReflect.Descriptor instead. +func (*LanguageVersions) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{58} } -func (x *GetWorkloadContainerTimeSeriesResponse) GetContainers() []*ContainerTimeSeries { +func (x *LanguageVersions) GetLanguage() string { if x != nil { - return x.Containers + return x.Language + } + return "" +} + +func (x *LanguageVersions) GetVersions() []string { + if x != nil { + return x.Versions } return nil } -// GetLatestContainerRequestLimitsRequest requests the most recent request/limit values per container. -type GetLatestContainerRequestLimitsRequest struct { +// GetWorkloadLanguagesRequest requests the distinct languages/versions +// detected across a cluster's workloads (used to populate filter dropdowns). +type GetWorkloadLanguagesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetLatestContainerRequestLimitsRequest) Reset() { - *x = GetLatestContainerRequestLimitsRequest{} +func (x *GetWorkloadLanguagesRequest) Reset() { + *x = GetWorkloadLanguagesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[40] + mi := &file_api_v1_k8s_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetLatestContainerRequestLimitsRequest) String() string { +func (x *GetWorkloadLanguagesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLatestContainerRequestLimitsRequest) ProtoMessage() {} +func (*GetWorkloadLanguagesRequest) ProtoMessage() {} -func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[40] +func (x *GetWorkloadLanguagesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3169,58 +4647,52 @@ func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetLatestContainerRequestLimitsRequest.ProtoReflect.Descriptor instead. -func (*GetLatestContainerRequestLimitsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{40} -} - -func (x *GetLatestContainerRequestLimitsRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use GetWorkloadLanguagesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadLanguagesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{59} } -func (x *GetLatestContainerRequestLimitsRequest) GetClusterId() string { +func (x *GetWorkloadLanguagesRequest) GetTeamId() string { if x != nil { - return x.ClusterId + return x.TeamId } return "" } -func (x *GetLatestContainerRequestLimitsRequest) GetUid() string { +func (x *GetWorkloadLanguagesRequest) GetClusterId() string { if x != nil { - return x.Uid + return x.ClusterId } return "" } -// GetLatestContainerRequestLimitsResponse returns per-container request/limit values. -type GetLatestContainerRequestLimitsResponse struct { +// GetWorkloadLanguagesResponse returns every distinct language and its +// detected versions for the requested cluster. +type GetWorkloadLanguagesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerRequestLimits `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Languages []*LanguageVersions `protobuf:"bytes,1,rep,name=languages,proto3" json:"languages,omitempty"` } -func (x *GetLatestContainerRequestLimitsResponse) Reset() { - *x = GetLatestContainerRequestLimitsResponse{} +func (x *GetWorkloadLanguagesResponse) Reset() { + *x = GetWorkloadLanguagesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[41] + mi := &file_api_v1_k8s_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetLatestContainerRequestLimitsResponse) String() string { +func (x *GetWorkloadLanguagesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLatestContainerRequestLimitsResponse) ProtoMessage() {} +func (*GetWorkloadLanguagesResponse) ProtoMessage() {} -func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[41] +func (x *GetWorkloadLanguagesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3231,14 +4703,14 @@ func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GetLatestContainerRequestLimitsResponse.ProtoReflect.Descriptor instead. -func (*GetLatestContainerRequestLimitsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{41} +// Deprecated: Use GetWorkloadLanguagesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadLanguagesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{60} } -func (x *GetLatestContainerRequestLimitsResponse) GetContainers() []*ContainerRequestLimits { +func (x *GetWorkloadLanguagesResponse) GetLanguages() []*LanguageVersions { if x != nil { - return x.Containers + return x.Languages } return nil } @@ -3259,7 +4731,7 @@ type GetForecastWorkloadsRequest struct { func (x *GetForecastWorkloadsRequest) Reset() { *x = GetForecastWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[42] + mi := &file_api_v1_k8s_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3272,7 +4744,7 @@ func (x *GetForecastWorkloadsRequest) String() string { func (*GetForecastWorkloadsRequest) ProtoMessage() {} func (x *GetForecastWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[42] + mi := &file_api_v1_k8s_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3285,7 +4757,7 @@ func (x *GetForecastWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadsRequest.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{42} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{61} } func (x *GetForecastWorkloadsRequest) GetTeamId() string { @@ -3338,7 +4810,7 @@ type GetForecastWorkloadsResponse struct { func (x *GetForecastWorkloadsResponse) Reset() { *x = GetForecastWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[43] + mi := &file_api_v1_k8s_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3351,7 +4823,7 @@ func (x *GetForecastWorkloadsResponse) String() string { func (*GetForecastWorkloadsResponse) ProtoMessage() {} func (x *GetForecastWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[43] + mi := &file_api_v1_k8s_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3364,7 +4836,7 @@ func (x *GetForecastWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadsResponse.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{43} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{62} } func (x *GetForecastWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { @@ -3413,7 +4885,7 @@ type GetForecastWorkloadRequest struct { func (x *GetForecastWorkloadRequest) Reset() { *x = GetForecastWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[44] + mi := &file_api_v1_k8s_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +4898,7 @@ func (x *GetForecastWorkloadRequest) String() string { func (*GetForecastWorkloadRequest) ProtoMessage() {} func (x *GetForecastWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[44] + mi := &file_api_v1_k8s_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3439,7 +4911,7 @@ func (x *GetForecastWorkloadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadRequest.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{44} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{63} } func (x *GetForecastWorkloadRequest) GetTeamId() string { @@ -3508,7 +4980,7 @@ type GetForecastWorkloadResponse struct { func (x *GetForecastWorkloadResponse) Reset() { *x = GetForecastWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[45] + mi := &file_api_v1_k8s_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3521,7 +4993,7 @@ func (x *GetForecastWorkloadResponse) String() string { func (*GetForecastWorkloadResponse) ProtoMessage() {} func (x *GetForecastWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[45] + mi := &file_api_v1_k8s_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3534,7 +5006,7 @@ func (x *GetForecastWorkloadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadResponse.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{45} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{64} } func (x *GetForecastWorkloadResponse) GetWorkloadItem() *WorkloadItem { @@ -3591,7 +5063,7 @@ type GetClusterMetadataResponse struct { func (x *GetClusterMetadataResponse) Reset() { *x = GetClusterMetadataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[46] + mi := &file_api_v1_k8s_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3604,7 +5076,7 @@ func (x *GetClusterMetadataResponse) String() string { func (*GetClusterMetadataResponse) ProtoMessage() {} func (x *GetClusterMetadataResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[46] + mi := &file_api_v1_k8s_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3617,7 +5089,7 @@ func (x *GetClusterMetadataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClusterMetadataResponse.ProtoReflect.Descriptor instead. func (*GetClusterMetadataResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{46} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{65} } func (x *GetClusterMetadataResponse) GetClusters() []*Cluster { @@ -3639,7 +5111,7 @@ type ClusterElement struct { func (x *ClusterElement) Reset() { *x = ClusterElement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[47] + mi := &file_api_v1_k8s_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3652,7 +5124,7 @@ func (x *ClusterElement) String() string { func (*ClusterElement) ProtoMessage() {} func (x *ClusterElement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[47] + mi := &file_api_v1_k8s_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3665,7 +5137,7 @@ func (x *ClusterElement) ProtoReflect() protoreflect.Message { // Deprecated: Use ClusterElement.ProtoReflect.Descriptor instead. func (*ClusterElement) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{47} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{66} } func (x *ClusterElement) GetClusterId() string { @@ -3696,7 +5168,7 @@ type GetAllNamespacesRequest struct { func (x *GetAllNamespacesRequest) Reset() { *x = GetAllNamespacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[48] + mi := &file_api_v1_k8s_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3709,7 +5181,7 @@ func (x *GetAllNamespacesRequest) String() string { func (*GetAllNamespacesRequest) ProtoMessage() {} func (x *GetAllNamespacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[48] + mi := &file_api_v1_k8s_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3722,7 +5194,7 @@ func (x *GetAllNamespacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNamespacesRequest.ProtoReflect.Descriptor instead. func (*GetAllNamespacesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{48} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{67} } func (x *GetAllNamespacesRequest) GetTeamId() string { @@ -3764,7 +5236,7 @@ type GetAllNamespacesResponse struct { func (x *GetAllNamespacesResponse) Reset() { *x = GetAllNamespacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[49] + mi := &file_api_v1_k8s_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3777,7 +5249,7 @@ func (x *GetAllNamespacesResponse) String() string { func (*GetAllNamespacesResponse) ProtoMessage() {} func (x *GetAllNamespacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[49] + mi := &file_api_v1_k8s_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,7 +5262,7 @@ func (x *GetAllNamespacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNamespacesResponse.ProtoReflect.Descriptor instead. func (*GetAllNamespacesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{49} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{68} } func (x *GetAllNamespacesResponse) GetClusterIdWithNamespaces() []*ClusterElement { @@ -3814,7 +5286,7 @@ type SearchNamespacesByClusterRequest struct { func (x *SearchNamespacesByClusterRequest) Reset() { *x = SearchNamespacesByClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[50] + mi := &file_api_v1_k8s_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +5299,7 @@ func (x *SearchNamespacesByClusterRequest) String() string { func (*SearchNamespacesByClusterRequest) ProtoMessage() {} func (x *SearchNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[50] + mi := &file_api_v1_k8s_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +5312,7 @@ func (x *SearchNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchNamespacesByClusterRequest.ProtoReflect.Descriptor instead. func (*SearchNamespacesByClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{50} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{69} } func (x *SearchNamespacesByClusterRequest) GetTeamId() string { @@ -3876,7 +5348,7 @@ type SearchNamespacesByClusterResponse struct { func (x *SearchNamespacesByClusterResponse) Reset() { *x = SearchNamespacesByClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[51] + mi := &file_api_v1_k8s_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3889,7 +5361,7 @@ func (x *SearchNamespacesByClusterResponse) String() string { func (*SearchNamespacesByClusterResponse) ProtoMessage() {} func (x *SearchNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[51] + mi := &file_api_v1_k8s_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3902,7 +5374,7 @@ func (x *SearchNamespacesByClusterResponse) ProtoReflect() protoreflect.Message // Deprecated: Use SearchNamespacesByClusterResponse.ProtoReflect.Descriptor instead. func (*SearchNamespacesByClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{51} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{70} } func (x *SearchNamespacesByClusterResponse) GetNamespaces() []string { @@ -3925,7 +5397,7 @@ type ListNamespacesByClusterRequest struct { func (x *ListNamespacesByClusterRequest) Reset() { *x = ListNamespacesByClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[52] + mi := &file_api_v1_k8s_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3938,7 +5410,7 @@ func (x *ListNamespacesByClusterRequest) String() string { func (*ListNamespacesByClusterRequest) ProtoMessage() {} func (x *ListNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[52] + mi := &file_api_v1_k8s_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3951,7 +5423,7 @@ func (x *ListNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNamespacesByClusterRequest.ProtoReflect.Descriptor instead. func (*ListNamespacesByClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{52} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{71} } func (x *ListNamespacesByClusterRequest) GetTeamId() string { @@ -3980,7 +5452,7 @@ type ListNamespacesByClusterResponse struct { func (x *ListNamespacesByClusterResponse) Reset() { *x = ListNamespacesByClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[53] + mi := &file_api_v1_k8s_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3993,7 +5465,7 @@ func (x *ListNamespacesByClusterResponse) String() string { func (*ListNamespacesByClusterResponse) ProtoMessage() {} func (x *ListNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[53] + mi := &file_api_v1_k8s_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4006,7 +5478,7 @@ func (x *ListNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNamespacesByClusterResponse.ProtoReflect.Descriptor instead. func (*ListNamespacesByClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{53} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{72} } func (x *ListNamespacesByClusterResponse) GetNamespaces() []*NamespaceItem { @@ -4029,7 +5501,7 @@ type NamespaceItem struct { func (x *NamespaceItem) Reset() { *x = NamespaceItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[54] + mi := &file_api_v1_k8s_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +5514,7 @@ func (x *NamespaceItem) String() string { func (*NamespaceItem) ProtoMessage() {} func (x *NamespaceItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[54] + mi := &file_api_v1_k8s_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +5527,7 @@ func (x *NamespaceItem) ProtoReflect() protoreflect.Message { // Deprecated: Use NamespaceItem.ProtoReflect.Descriptor instead. func (*NamespaceItem) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{54} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{73} } func (x *NamespaceItem) GetId() string { @@ -4091,7 +5563,7 @@ type GetAllWorkloadNamesRequest struct { func (x *GetAllWorkloadNamesRequest) Reset() { *x = GetAllWorkloadNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[55] + mi := &file_api_v1_k8s_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4104,7 +5576,7 @@ func (x *GetAllWorkloadNamesRequest) String() string { func (*GetAllWorkloadNamesRequest) ProtoMessage() {} func (x *GetAllWorkloadNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[55] + mi := &file_api_v1_k8s_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4117,7 +5589,7 @@ func (x *GetAllWorkloadNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadNamesRequest.ProtoReflect.Descriptor instead. func (*GetAllWorkloadNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{55} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{74} } func (x *GetAllWorkloadNamesRequest) GetTeamId() string { @@ -4194,7 +5666,7 @@ type GetAllWorkloadNamesResponse struct { func (x *GetAllWorkloadNamesResponse) Reset() { *x = GetAllWorkloadNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[56] + mi := &file_api_v1_k8s_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4207,7 +5679,7 @@ func (x *GetAllWorkloadNamesResponse) String() string { func (*GetAllWorkloadNamesResponse) ProtoMessage() {} func (x *GetAllWorkloadNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[56] + mi := &file_api_v1_k8s_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4220,7 +5692,7 @@ func (x *GetAllWorkloadNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadNamesResponse.ProtoReflect.Descriptor instead. func (*GetAllWorkloadNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{56} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{75} } func (x *GetAllWorkloadNamesResponse) GetClusterIdWithWorkloadName() []*ClusterElement { @@ -4248,7 +5720,7 @@ type GetAllWorkloadLabelsRequest struct { func (x *GetAllWorkloadLabelsRequest) Reset() { *x = GetAllWorkloadLabelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[57] + mi := &file_api_v1_k8s_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +5733,7 @@ func (x *GetAllWorkloadLabelsRequest) String() string { func (*GetAllWorkloadLabelsRequest) ProtoMessage() {} func (x *GetAllWorkloadLabelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[57] + mi := &file_api_v1_k8s_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +5746,7 @@ func (x *GetAllWorkloadLabelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadLabelsRequest.ProtoReflect.Descriptor instead. func (*GetAllWorkloadLabelsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{57} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{76} } func (x *GetAllWorkloadLabelsRequest) GetTeamId() string { @@ -4344,7 +5816,7 @@ type GetAllWorkloadLabelsResponse struct { func (x *GetAllWorkloadLabelsResponse) Reset() { *x = GetAllWorkloadLabelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[58] + mi := &file_api_v1_k8s_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4357,7 +5829,7 @@ func (x *GetAllWorkloadLabelsResponse) String() string { func (*GetAllWorkloadLabelsResponse) ProtoMessage() {} func (x *GetAllWorkloadLabelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[58] + mi := &file_api_v1_k8s_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4370,7 +5842,7 @@ func (x *GetAllWorkloadLabelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadLabelsResponse.ProtoReflect.Descriptor instead. func (*GetAllWorkloadLabelsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{58} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{77} } func (x *GetAllWorkloadLabelsResponse) GetClusterIdWithLabels() []*ClusterElement { @@ -4395,7 +5867,7 @@ type GetAllNodeGroupNamesRequest struct { func (x *GetAllNodeGroupNamesRequest) Reset() { *x = GetAllNodeGroupNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[59] + mi := &file_api_v1_k8s_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4408,7 +5880,7 @@ func (x *GetAllNodeGroupNamesRequest) String() string { func (*GetAllNodeGroupNamesRequest) ProtoMessage() {} func (x *GetAllNodeGroupNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[59] + mi := &file_api_v1_k8s_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4421,7 +5893,7 @@ func (x *GetAllNodeGroupNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNodeGroupNamesRequest.ProtoReflect.Descriptor instead. func (*GetAllNodeGroupNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{59} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{78} } func (x *GetAllNodeGroupNamesRequest) GetTeamId() string { @@ -4470,7 +5942,7 @@ type GetAllNodeGroupNamesResponse struct { func (x *GetAllNodeGroupNamesResponse) Reset() { *x = GetAllNodeGroupNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[60] + mi := &file_api_v1_k8s_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4483,7 +5955,7 @@ func (x *GetAllNodeGroupNamesResponse) String() string { func (*GetAllNodeGroupNamesResponse) ProtoMessage() {} func (x *GetAllNodeGroupNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[60] + mi := &file_api_v1_k8s_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4496,7 +5968,7 @@ func (x *GetAllNodeGroupNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNodeGroupNamesResponse.ProtoReflect.Descriptor instead. func (*GetAllNodeGroupNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{60} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{79} } func (x *GetAllNodeGroupNamesResponse) GetClusterIdWithNodeGroupNames() []*ClusterElement { @@ -4554,7 +6026,7 @@ type Cluster struct { func (x *Cluster) Reset() { *x = Cluster{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[61] + mi := &file_api_v1_k8s_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4567,7 +6039,7 @@ func (x *Cluster) String() string { func (*Cluster) ProtoMessage() {} func (x *Cluster) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[61] + mi := &file_api_v1_k8s_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4580,7 +6052,7 @@ func (x *Cluster) ProtoReflect() protoreflect.Message { // Deprecated: Use Cluster.ProtoReflect.Descriptor instead. func (*Cluster) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{61} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{80} } func (x *Cluster) GetId() string { @@ -4855,7 +6327,7 @@ type OperatorInfo struct { func (x *OperatorInfo) Reset() { *x = OperatorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[62] + mi := &file_api_v1_k8s_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4868,7 +6340,7 @@ func (x *OperatorInfo) String() string { func (*OperatorInfo) ProtoMessage() {} func (x *OperatorInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[62] + mi := &file_api_v1_k8s_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4881,7 +6353,7 @@ func (x *OperatorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OperatorInfo.ProtoReflect.Descriptor instead. func (*OperatorInfo) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{62} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{81} } func (x *OperatorInfo) GetVersion() string { @@ -4919,7 +6391,7 @@ type Container struct { func (x *Container) Reset() { *x = Container{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[63] + mi := &file_api_v1_k8s_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4932,7 +6404,7 @@ func (x *Container) String() string { func (*Container) ProtoMessage() {} func (x *Container) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[63] + mi := &file_api_v1_k8s_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4945,7 +6417,7 @@ func (x *Container) ProtoReflect() protoreflect.Message { // Deprecated: Use Container.ProtoReflect.Descriptor instead. func (*Container) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{63} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{82} } func (x *Container) GetId() string { @@ -4978,7 +6450,7 @@ type GetLatestOperatorVersionRequest struct { func (x *GetLatestOperatorVersionRequest) Reset() { *x = GetLatestOperatorVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[64] + mi := &file_api_v1_k8s_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4991,7 +6463,7 @@ func (x *GetLatestOperatorVersionRequest) String() string { func (*GetLatestOperatorVersionRequest) ProtoMessage() {} func (x *GetLatestOperatorVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[64] + mi := &file_api_v1_k8s_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5004,7 +6476,7 @@ func (x *GetLatestOperatorVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestOperatorVersionRequest.ProtoReflect.Descriptor instead. func (*GetLatestOperatorVersionRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{64} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{83} } type GetLatestOperatorVersionResponse struct { @@ -5026,12 +6498,15 @@ type GetLatestOperatorVersionResponse struct { SecurityOpHelmInfo *OperatorInfo `protobuf:"bytes,32,opt,name=security_op_helm_info,json=securityOpHelmInfo,proto3" json:"security_op_helm_info,omitempty"` TrezrInfo *OperatorInfo `protobuf:"bytes,41,opt,name=trezr_info,json=trezrInfo,proto3" json:"trezr_info,omitempty"` TrezrHelmInfo *OperatorInfo `protobuf:"bytes,42,opt,name=trezr_helm_info,json=trezrHelmInfo,proto3" json:"trezr_helm_info,omitempty"` + // checkpoint-restore-operator helm chart (snapshot policies). Placeholder + // version until the DevZero-authored chart is published. + SnapshotHelmInfo *OperatorInfo `protobuf:"bytes,51,opt,name=snapshot_helm_info,json=snapshotHelmInfo,proto3" json:"snapshot_helm_info,omitempty"` } func (x *GetLatestOperatorVersionResponse) Reset() { *x = GetLatestOperatorVersionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[65] + mi := &file_api_v1_k8s_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5044,7 +6519,7 @@ func (x *GetLatestOperatorVersionResponse) String() string { func (*GetLatestOperatorVersionResponse) ProtoMessage() {} func (x *GetLatestOperatorVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[65] + mi := &file_api_v1_k8s_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5057,7 +6532,7 @@ func (x *GetLatestOperatorVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestOperatorVersionResponse.ProtoReflect.Descriptor instead. func (*GetLatestOperatorVersionResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{65} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{84} } func (x *GetLatestOperatorVersionResponse) GetZxpInfo() *OperatorInfo { @@ -5158,6 +6633,13 @@ func (x *GetLatestOperatorVersionResponse) GetTrezrHelmInfo() *OperatorInfo { return nil } +func (x *GetLatestOperatorVersionResponse) GetSnapshotHelmInfo() *OperatorInfo { + if x != nil { + return x.SnapshotHelmInfo + } + return nil +} + type GalaxyGetWorkloadPerspectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5172,7 +6654,7 @@ type GalaxyGetWorkloadPerspectiveRequest struct { func (x *GalaxyGetWorkloadPerspectiveRequest) Reset() { *x = GalaxyGetWorkloadPerspectiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[66] + mi := &file_api_v1_k8s_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5185,7 +6667,7 @@ func (x *GalaxyGetWorkloadPerspectiveRequest) String() string { func (*GalaxyGetWorkloadPerspectiveRequest) ProtoMessage() {} func (x *GalaxyGetWorkloadPerspectiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[66] + mi := &file_api_v1_k8s_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5198,7 +6680,7 @@ func (x *GalaxyGetWorkloadPerspectiveRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GalaxyGetWorkloadPerspectiveRequest.ProtoReflect.Descriptor instead. func (*GalaxyGetWorkloadPerspectiveRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{66} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{85} } func (x *GalaxyGetWorkloadPerspectiveRequest) GetTeamId() string { @@ -5242,7 +6724,7 @@ type GalaxyGetWorkloadPerspectiveResponse struct { func (x *GalaxyGetWorkloadPerspectiveResponse) Reset() { *x = GalaxyGetWorkloadPerspectiveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[67] + mi := &file_api_v1_k8s_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5255,7 +6737,7 @@ func (x *GalaxyGetWorkloadPerspectiveResponse) String() string { func (*GalaxyGetWorkloadPerspectiveResponse) ProtoMessage() {} func (x *GalaxyGetWorkloadPerspectiveResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[67] + mi := &file_api_v1_k8s_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5268,7 +6750,7 @@ func (x *GalaxyGetWorkloadPerspectiveResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GalaxyGetWorkloadPerspectiveResponse.ProtoReflect.Descriptor instead. func (*GalaxyGetWorkloadPerspectiveResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{67} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{86} } func (x *GalaxyGetWorkloadPerspectiveResponse) GetGroupings() []*GalaxyWorkloadGroup { @@ -5310,7 +6792,7 @@ type GalaxyWorkloadGroup struct { func (x *GalaxyWorkloadGroup) Reset() { *x = GalaxyWorkloadGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[68] + mi := &file_api_v1_k8s_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5323,7 +6805,7 @@ func (x *GalaxyWorkloadGroup) String() string { func (*GalaxyWorkloadGroup) ProtoMessage() {} func (x *GalaxyWorkloadGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[68] + mi := &file_api_v1_k8s_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5336,7 +6818,7 @@ func (x *GalaxyWorkloadGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use GalaxyWorkloadGroup.ProtoReflect.Descriptor instead. func (*GalaxyWorkloadGroup) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{68} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{87} } func (x *GalaxyWorkloadGroup) GetGroupKey() string { @@ -5394,7 +6876,7 @@ type PerspectiveDatapointOpts struct { func (x *PerspectiveDatapointOpts) Reset() { *x = PerspectiveDatapointOpts{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[69] + mi := &file_api_v1_k8s_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5407,7 +6889,7 @@ func (x *PerspectiveDatapointOpts) String() string { func (*PerspectiveDatapointOpts) ProtoMessage() {} func (x *PerspectiveDatapointOpts) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[69] + mi := &file_api_v1_k8s_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5420,7 +6902,7 @@ func (x *PerspectiveDatapointOpts) ProtoReflect() protoreflect.Message { // Deprecated: Use PerspectiveDatapointOpts.ProtoReflect.Descriptor instead. func (*PerspectiveDatapointOpts) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{69} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{88} } func (x *PerspectiveDatapointOpts) GetTimeStart() int64 { @@ -5471,7 +6953,7 @@ type ListAuditLogsRequest struct { func (x *ListAuditLogsRequest) Reset() { *x = ListAuditLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[70] + mi := &file_api_v1_k8s_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5484,7 +6966,7 @@ func (x *ListAuditLogsRequest) String() string { func (*ListAuditLogsRequest) ProtoMessage() {} func (x *ListAuditLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[70] + mi := &file_api_v1_k8s_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5497,7 +6979,7 @@ func (x *ListAuditLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogsRequest.ProtoReflect.Descriptor instead. func (*ListAuditLogsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{70} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{89} } func (x *ListAuditLogsRequest) GetTeamId() string { @@ -5619,7 +7101,7 @@ type ListAuditLogsResponse struct { func (x *ListAuditLogsResponse) Reset() { *x = ListAuditLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[71] + mi := &file_api_v1_k8s_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5632,7 +7114,7 @@ func (x *ListAuditLogsResponse) String() string { func (*ListAuditLogsResponse) ProtoMessage() {} func (x *ListAuditLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[71] + mi := &file_api_v1_k8s_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5645,7 +7127,7 @@ func (x *ListAuditLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogsResponse.ProtoReflect.Descriptor instead. func (*ListAuditLogsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{71} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{90} } func (x *ListAuditLogsResponse) GetLogs() []*AuditLogEntry { @@ -5687,7 +7169,7 @@ type ListAuditLogOriginatorsRequest struct { func (x *ListAuditLogOriginatorsRequest) Reset() { *x = ListAuditLogOriginatorsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[72] + mi := &file_api_v1_k8s_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5700,7 +7182,7 @@ func (x *ListAuditLogOriginatorsRequest) String() string { func (*ListAuditLogOriginatorsRequest) ProtoMessage() {} func (x *ListAuditLogOriginatorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[72] + mi := &file_api_v1_k8s_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5713,7 +7195,7 @@ func (x *ListAuditLogOriginatorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogOriginatorsRequest.ProtoReflect.Descriptor instead. func (*ListAuditLogOriginatorsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{72} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{91} } func (x *ListAuditLogOriginatorsRequest) GetTeamId() string { @@ -5820,7 +7302,7 @@ type ListAuditLogOriginatorsResponse struct { func (x *ListAuditLogOriginatorsResponse) Reset() { *x = ListAuditLogOriginatorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[73] + mi := &file_api_v1_k8s_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5833,7 +7315,7 @@ func (x *ListAuditLogOriginatorsResponse) String() string { func (*ListAuditLogOriginatorsResponse) ProtoMessage() {} func (x *ListAuditLogOriginatorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[73] + mi := &file_api_v1_k8s_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5846,7 +7328,7 @@ func (x *ListAuditLogOriginatorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogOriginatorsResponse.ProtoReflect.Descriptor instead. func (*ListAuditLogOriginatorsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{73} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{92} } func (x *ListAuditLogOriginatorsResponse) GetEmailAddresses() []string { @@ -5872,7 +7354,7 @@ type SendWorkloadEmailRequest struct { func (x *SendWorkloadEmailRequest) Reset() { *x = SendWorkloadEmailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[74] + mi := &file_api_v1_k8s_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5885,7 +7367,7 @@ func (x *SendWorkloadEmailRequest) String() string { func (*SendWorkloadEmailRequest) ProtoMessage() {} func (x *SendWorkloadEmailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[74] + mi := &file_api_v1_k8s_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5898,7 +7380,7 @@ func (x *SendWorkloadEmailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWorkloadEmailRequest.ProtoReflect.Descriptor instead. func (*SendWorkloadEmailRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{74} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{93} } func (x *SendWorkloadEmailRequest) GetTeamId() string { @@ -5948,7 +7430,7 @@ type SendWorkloadEmailResponse struct { func (x *SendWorkloadEmailResponse) Reset() { *x = SendWorkloadEmailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[75] + mi := &file_api_v1_k8s_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5961,7 +7443,7 @@ func (x *SendWorkloadEmailResponse) String() string { func (*SendWorkloadEmailResponse) ProtoMessage() {} func (x *SendWorkloadEmailResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[75] + mi := &file_api_v1_k8s_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5974,7 +7456,7 @@ func (x *SendWorkloadEmailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWorkloadEmailResponse.ProtoReflect.Descriptor instead. func (*SendWorkloadEmailResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{75} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{94} } func (x *SendWorkloadEmailResponse) GetMessage() string { @@ -5996,7 +7478,7 @@ type SendWeeklySummaryEmailRequest struct { func (x *SendWeeklySummaryEmailRequest) Reset() { *x = SendWeeklySummaryEmailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[76] + mi := &file_api_v1_k8s_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6009,7 +7491,7 @@ func (x *SendWeeklySummaryEmailRequest) String() string { func (*SendWeeklySummaryEmailRequest) ProtoMessage() {} func (x *SendWeeklySummaryEmailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[76] + mi := &file_api_v1_k8s_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6022,7 +7504,7 @@ func (x *SendWeeklySummaryEmailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWeeklySummaryEmailRequest.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{76} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{95} } func (x *SendWeeklySummaryEmailRequest) GetRequest() *SendWeeklySummaryEmailRequestData { @@ -6045,7 +7527,7 @@ type SendWeeklySummaryEmailRequestData struct { func (x *SendWeeklySummaryEmailRequestData) Reset() { *x = SendWeeklySummaryEmailRequestData{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[77] + mi := &file_api_v1_k8s_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6058,7 +7540,7 @@ func (x *SendWeeklySummaryEmailRequestData) String() string { func (*SendWeeklySummaryEmailRequestData) ProtoMessage() {} func (x *SendWeeklySummaryEmailRequestData) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[77] + mi := &file_api_v1_k8s_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6071,7 +7553,7 @@ func (x *SendWeeklySummaryEmailRequestData) ProtoReflect() protoreflect.Message // Deprecated: Use SendWeeklySummaryEmailRequestData.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailRequestData) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{77} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{96} } func (x *SendWeeklySummaryEmailRequestData) GetTeamId() string { @@ -6100,7 +7582,7 @@ type SendWeeklySummaryEmailResponse struct { func (x *SendWeeklySummaryEmailResponse) Reset() { *x = SendWeeklySummaryEmailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[78] + mi := &file_api_v1_k8s_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6113,7 +7595,7 @@ func (x *SendWeeklySummaryEmailResponse) String() string { func (*SendWeeklySummaryEmailResponse) ProtoMessage() {} func (x *SendWeeklySummaryEmailResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[78] + mi := &file_api_v1_k8s_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6126,7 +7608,7 @@ func (x *SendWeeklySummaryEmailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWeeklySummaryEmailResponse.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{78} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{97} } func (x *SendWeeklySummaryEmailResponse) GetMessage() string { @@ -6154,7 +7636,7 @@ type GetClustersNodeInfoRequest struct { func (x *GetClustersNodeInfoRequest) Reset() { *x = GetClustersNodeInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[79] + mi := &file_api_v1_k8s_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6167,7 +7649,7 @@ func (x *GetClustersNodeInfoRequest) String() string { func (*GetClustersNodeInfoRequest) ProtoMessage() {} func (x *GetClustersNodeInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[79] + mi := &file_api_v1_k8s_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6180,7 +7662,7 @@ func (x *GetClustersNodeInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersNodeInfoRequest.ProtoReflect.Descriptor instead. func (*GetClustersNodeInfoRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{79} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{98} } func (x *GetClustersNodeInfoRequest) GetTeamId() string { @@ -6247,7 +7729,7 @@ type GetClustersNodeInfoResponse struct { func (x *GetClustersNodeInfoResponse) Reset() { *x = GetClustersNodeInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[80] + mi := &file_api_v1_k8s_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6260,7 +7742,7 @@ func (x *GetClustersNodeInfoResponse) String() string { func (*GetClustersNodeInfoResponse) ProtoMessage() {} func (x *GetClustersNodeInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[80] + mi := &file_api_v1_k8s_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6273,7 +7755,7 @@ func (x *GetClustersNodeInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersNodeInfoResponse.ProtoReflect.Descriptor instead. func (*GetClustersNodeInfoResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{80} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{99} } func (x *GetClustersNodeInfoResponse) GetNodeInfo() *NodeInfo { @@ -6318,7 +7800,7 @@ type SearchK8SResourcesRequest struct { func (x *SearchK8SResourcesRequest) Reset() { *x = SearchK8SResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[81] + mi := &file_api_v1_k8s_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6331,7 +7813,7 @@ func (x *SearchK8SResourcesRequest) String() string { func (*SearchK8SResourcesRequest) ProtoMessage() {} func (x *SearchK8SResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[81] + mi := &file_api_v1_k8s_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6344,7 +7826,7 @@ func (x *SearchK8SResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SResourcesRequest.ProtoReflect.Descriptor instead. func (*SearchK8SResourcesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{81} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{100} } func (x *SearchK8SResourcesRequest) GetTeamId() string { @@ -6386,7 +7868,7 @@ type SearchK8SResourcesResponse struct { func (x *SearchK8SResourcesResponse) Reset() { *x = SearchK8SResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[82] + mi := &file_api_v1_k8s_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6399,7 +7881,7 @@ func (x *SearchK8SResourcesResponse) String() string { func (*SearchK8SResourcesResponse) ProtoMessage() {} func (x *SearchK8SResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[82] + mi := &file_api_v1_k8s_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6412,7 +7894,7 @@ func (x *SearchK8SResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SResourcesResponse.ProtoReflect.Descriptor instead. func (*SearchK8SResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{82} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{101} } func (x *SearchK8SResourcesResponse) GetResults() []*K8SSearchResult { @@ -6437,7 +7919,7 @@ type K8SSearchResult struct { func (x *K8SSearchResult) Reset() { *x = K8SSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[83] + mi := &file_api_v1_k8s_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6450,7 +7932,7 @@ func (x *K8SSearchResult) String() string { func (*K8SSearchResult) ProtoMessage() {} func (x *K8SSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[83] + mi := &file_api_v1_k8s_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6463,7 +7945,7 @@ func (x *K8SSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SSearchResult.ProtoReflect.Descriptor instead. func (*K8SSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{83} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{102} } func (x *K8SSearchResult) GetUid() string { @@ -6514,7 +7996,7 @@ type SearchK8SWorkloadsRequest struct { func (x *SearchK8SWorkloadsRequest) Reset() { *x = SearchK8SWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[84] + mi := &file_api_v1_k8s_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6527,7 +8009,7 @@ func (x *SearchK8SWorkloadsRequest) String() string { func (*SearchK8SWorkloadsRequest) ProtoMessage() {} func (x *SearchK8SWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[84] + mi := &file_api_v1_k8s_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6540,7 +8022,7 @@ func (x *SearchK8SWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SWorkloadsRequest.ProtoReflect.Descriptor instead. func (*SearchK8SWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{84} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{103} } func (x *SearchK8SWorkloadsRequest) GetTeamId() string { @@ -6575,7 +8057,7 @@ type SearchK8SWorkloadsResponse struct { func (x *SearchK8SWorkloadsResponse) Reset() { *x = SearchK8SWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[85] + mi := &file_api_v1_k8s_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6588,7 +8070,7 @@ func (x *SearchK8SWorkloadsResponse) String() string { func (*SearchK8SWorkloadsResponse) ProtoMessage() {} func (x *SearchK8SWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[85] + mi := &file_api_v1_k8s_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6601,7 +8083,7 @@ func (x *SearchK8SWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SWorkloadsResponse.ProtoReflect.Descriptor instead. func (*SearchK8SWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{85} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{104} } func (x *SearchK8SWorkloadsResponse) GetResults() []*K8SWorkloadSearchResult { @@ -6623,7 +8105,7 @@ type K8SWorkloadSearchResult struct { func (x *K8SWorkloadSearchResult) Reset() { *x = K8SWorkloadSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[86] + mi := &file_api_v1_k8s_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6636,7 +8118,7 @@ func (x *K8SWorkloadSearchResult) String() string { func (*K8SWorkloadSearchResult) ProtoMessage() {} func (x *K8SWorkloadSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[86] + mi := &file_api_v1_k8s_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6649,7 +8131,7 @@ func (x *K8SWorkloadSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SWorkloadSearchResult.ProtoReflect.Descriptor instead. func (*K8SWorkloadSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{86} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{105} } func (x *K8SWorkloadSearchResult) GetKind() string { @@ -6680,7 +8162,7 @@ type MetadataForWorkloadsRequest struct { func (x *MetadataForWorkloadsRequest) Reset() { *x = MetadataForWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[87] + mi := &file_api_v1_k8s_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6693,7 +8175,7 @@ func (x *MetadataForWorkloadsRequest) String() string { func (*MetadataForWorkloadsRequest) ProtoMessage() {} func (x *MetadataForWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[87] + mi := &file_api_v1_k8s_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6706,7 +8188,7 @@ func (x *MetadataForWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetadataForWorkloadsRequest.ProtoReflect.Descriptor instead. func (*MetadataForWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{87} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{106} } func (x *MetadataForWorkloadsRequest) GetTeamId() string { @@ -6748,7 +8230,7 @@ type MetadataForWorkloadsResponse struct { func (x *MetadataForWorkloadsResponse) Reset() { *x = MetadataForWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[88] + mi := &file_api_v1_k8s_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6761,7 +8243,7 @@ func (x *MetadataForWorkloadsResponse) String() string { func (*MetadataForWorkloadsResponse) ProtoMessage() {} func (x *MetadataForWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[88] + mi := &file_api_v1_k8s_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6774,7 +8256,7 @@ func (x *MetadataForWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetadataForWorkloadsResponse.ProtoReflect.Descriptor instead. func (*MetadataForWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{88} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{107} } func (x *MetadataForWorkloadsResponse) GetWorkloadUidToMetadata() map[string]*WorkloadMetadata { @@ -6797,7 +8279,7 @@ type AddClusterTagsRequest struct { func (x *AddClusterTagsRequest) Reset() { *x = AddClusterTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[89] + mi := &file_api_v1_k8s_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6810,7 +8292,7 @@ func (x *AddClusterTagsRequest) String() string { func (*AddClusterTagsRequest) ProtoMessage() {} func (x *AddClusterTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[89] + mi := &file_api_v1_k8s_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6823,7 +8305,7 @@ func (x *AddClusterTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddClusterTagsRequest.ProtoReflect.Descriptor instead. func (*AddClusterTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{89} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{108} } func (x *AddClusterTagsRequest) GetTeamId() string { @@ -6858,7 +8340,7 @@ type AddClusterTagsResponse struct { func (x *AddClusterTagsResponse) Reset() { *x = AddClusterTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[90] + mi := &file_api_v1_k8s_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6871,7 +8353,7 @@ func (x *AddClusterTagsResponse) String() string { func (*AddClusterTagsResponse) ProtoMessage() {} func (x *AddClusterTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[90] + mi := &file_api_v1_k8s_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6884,7 +8366,7 @@ func (x *AddClusterTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddClusterTagsResponse.ProtoReflect.Descriptor instead. func (*AddClusterTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{90} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{109} } func (x *AddClusterTagsResponse) GetCluster() *Cluster { @@ -6907,7 +8389,7 @@ type RemoveClusterTagsRequest struct { func (x *RemoveClusterTagsRequest) Reset() { *x = RemoveClusterTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[91] + mi := &file_api_v1_k8s_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6920,7 +8402,7 @@ func (x *RemoveClusterTagsRequest) String() string { func (*RemoveClusterTagsRequest) ProtoMessage() {} func (x *RemoveClusterTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[91] + mi := &file_api_v1_k8s_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6933,7 +8415,7 @@ func (x *RemoveClusterTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveClusterTagsRequest.ProtoReflect.Descriptor instead. func (*RemoveClusterTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{91} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{110} } func (x *RemoveClusterTagsRequest) GetTeamId() string { @@ -6968,7 +8450,7 @@ type RemoveClusterTagsResponse struct { func (x *RemoveClusterTagsResponse) Reset() { *x = RemoveClusterTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[92] + mi := &file_api_v1_k8s_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6981,7 +8463,7 @@ func (x *RemoveClusterTagsResponse) String() string { func (*RemoveClusterTagsResponse) ProtoMessage() {} func (x *RemoveClusterTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[92] + mi := &file_api_v1_k8s_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6994,7 +8476,7 @@ func (x *RemoveClusterTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveClusterTagsResponse.ProtoReflect.Descriptor instead. func (*RemoveClusterTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{92} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{111} } func (x *RemoveClusterTagsResponse) GetCluster() *Cluster { @@ -7015,7 +8497,7 @@ type ListTagsRequest struct { func (x *ListTagsRequest) Reset() { *x = ListTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[93] + mi := &file_api_v1_k8s_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7028,7 +8510,7 @@ func (x *ListTagsRequest) String() string { func (*ListTagsRequest) ProtoMessage() {} func (x *ListTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[93] + mi := &file_api_v1_k8s_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7041,7 +8523,7 @@ func (x *ListTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTagsRequest.ProtoReflect.Descriptor instead. func (*ListTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{93} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{112} } func (x *ListTagsRequest) GetTeamId() string { @@ -7063,7 +8545,7 @@ type TagSummary struct { func (x *TagSummary) Reset() { *x = TagSummary{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[94] + mi := &file_api_v1_k8s_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7076,7 +8558,7 @@ func (x *TagSummary) String() string { func (*TagSummary) ProtoMessage() {} func (x *TagSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[94] + mi := &file_api_v1_k8s_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7089,7 +8571,7 @@ func (x *TagSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use TagSummary.ProtoReflect.Descriptor instead. func (*TagSummary) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{94} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{113} } func (x *TagSummary) GetTag() string { @@ -7117,7 +8599,7 @@ type ListTagsResponse struct { func (x *ListTagsResponse) Reset() { *x = ListTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[95] + mi := &file_api_v1_k8s_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7130,7 +8612,7 @@ func (x *ListTagsResponse) String() string { func (*ListTagsResponse) ProtoMessage() {} func (x *ListTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[95] + mi := &file_api_v1_k8s_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7143,7 +8625,7 @@ func (x *ListTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTagsResponse.ProtoReflect.Descriptor instead. func (*ListTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{95} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{114} } func (x *ListTagsResponse) GetTags() []*TagSummary { @@ -7171,7 +8653,7 @@ type WorkloadMetadata struct { func (x *WorkloadMetadata) Reset() { *x = WorkloadMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[96] + mi := &file_api_v1_k8s_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7184,7 +8666,7 @@ func (x *WorkloadMetadata) String() string { func (*WorkloadMetadata) ProtoMessage() {} func (x *WorkloadMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[96] + mi := &file_api_v1_k8s_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7197,7 +8679,7 @@ func (x *WorkloadMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadMetadata.ProtoReflect.Descriptor instead. func (*WorkloadMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{96} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{115} } func (x *WorkloadMetadata) GetPodUidToNodeMetadata() map[string]*NodeMetadata { @@ -7272,7 +8754,7 @@ type PodMetadata struct { func (x *PodMetadata) Reset() { *x = PodMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[97] + mi := &file_api_v1_k8s_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7285,7 +8767,7 @@ func (x *PodMetadata) String() string { func (*PodMetadata) ProtoMessage() {} func (x *PodMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[97] + mi := &file_api_v1_k8s_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7298,7 +8780,7 @@ func (x *PodMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use PodMetadata.ProtoReflect.Descriptor instead. func (*PodMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{97} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{116} } func (x *PodMetadata) GetName() string { @@ -7362,7 +8844,7 @@ type NodeMetadata struct { func (x *NodeMetadata) Reset() { *x = NodeMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[98] + mi := &file_api_v1_k8s_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7375,7 +8857,7 @@ func (x *NodeMetadata) String() string { func (*NodeMetadata) ProtoMessage() {} func (x *NodeMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[98] + mi := &file_api_v1_k8s_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7388,7 +8870,7 @@ func (x *NodeMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeMetadata.ProtoReflect.Descriptor instead. func (*NodeMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{98} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{117} } func (x *NodeMetadata) GetNodeName() string { @@ -7470,7 +8952,7 @@ type GetRelatedResourcesRequest struct { func (x *GetRelatedResourcesRequest) Reset() { *x = GetRelatedResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[99] + mi := &file_api_v1_k8s_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7483,7 +8965,7 @@ func (x *GetRelatedResourcesRequest) String() string { func (*GetRelatedResourcesRequest) ProtoMessage() {} func (x *GetRelatedResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[99] + mi := &file_api_v1_k8s_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7496,7 +8978,7 @@ func (x *GetRelatedResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRelatedResourcesRequest.ProtoReflect.Descriptor instead. func (*GetRelatedResourcesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{99} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{118} } func (x *GetRelatedResourcesRequest) GetTeamId() string { @@ -7548,7 +9030,7 @@ type GetWorkloadPodHistoryResponse struct { func (x *GetWorkloadPodHistoryResponse) Reset() { *x = GetWorkloadPodHistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[100] + mi := &file_api_v1_k8s_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7561,7 +9043,7 @@ func (x *GetWorkloadPodHistoryResponse) String() string { func (*GetWorkloadPodHistoryResponse) ProtoMessage() {} func (x *GetWorkloadPodHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[100] + mi := &file_api_v1_k8s_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7574,7 +9056,7 @@ func (x *GetWorkloadPodHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadPodHistoryResponse.ProtoReflect.Descriptor instead. func (*GetWorkloadPodHistoryResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{100} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{119} } func (x *GetWorkloadPodHistoryResponse) GetWorkloadUid() string { @@ -7621,7 +9103,7 @@ type JobHistory struct { func (x *JobHistory) Reset() { *x = JobHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[101] + mi := &file_api_v1_k8s_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7634,7 +9116,7 @@ func (x *JobHistory) String() string { func (*JobHistory) ProtoMessage() {} func (x *JobHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[101] + mi := &file_api_v1_k8s_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7647,7 +9129,7 @@ func (x *JobHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use JobHistory.ProtoReflect.Descriptor instead. func (*JobHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{101} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{120} } func (x *JobHistory) GetUid() string { @@ -7708,7 +9190,7 @@ type ReplicaSetHistory struct { func (x *ReplicaSetHistory) Reset() { *x = ReplicaSetHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[102] + mi := &file_api_v1_k8s_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7721,7 +9203,7 @@ func (x *ReplicaSetHistory) String() string { func (*ReplicaSetHistory) ProtoMessage() {} func (x *ReplicaSetHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[102] + mi := &file_api_v1_k8s_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7734,7 +9216,7 @@ func (x *ReplicaSetHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaSetHistory.ProtoReflect.Descriptor instead. func (*ReplicaSetHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{102} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{121} } func (x *ReplicaSetHistory) GetUid() string { @@ -7796,7 +9278,7 @@ type PodHistory struct { func (x *PodHistory) Reset() { *x = PodHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[103] + mi := &file_api_v1_k8s_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7809,7 +9291,7 @@ func (x *PodHistory) String() string { func (*PodHistory) ProtoMessage() {} func (x *PodHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[103] + mi := &file_api_v1_k8s_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7822,7 +9304,7 @@ func (x *PodHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use PodHistory.ProtoReflect.Descriptor instead. func (*PodHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{103} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{122} } func (x *PodHistory) GetUid() string { @@ -7887,7 +9369,7 @@ type GetRelatedResourcesResponse struct { func (x *GetRelatedResourcesResponse) Reset() { *x = GetRelatedResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[104] + mi := &file_api_v1_k8s_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7900,7 +9382,7 @@ func (x *GetRelatedResourcesResponse) String() string { func (*GetRelatedResourcesResponse) ProtoMessage() {} func (x *GetRelatedResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[104] + mi := &file_api_v1_k8s_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7913,7 +9395,7 @@ func (x *GetRelatedResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRelatedResourcesResponse.ProtoReflect.Descriptor instead. func (*GetRelatedResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{104} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{123} } func (x *GetRelatedResourcesResponse) GetRelations() []*K8SRelatedResource { @@ -7955,7 +9437,7 @@ type K8SRelatedResource struct { func (x *K8SRelatedResource) Reset() { *x = K8SRelatedResource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[105] + mi := &file_api_v1_k8s_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7968,7 +9450,7 @@ func (x *K8SRelatedResource) String() string { func (*K8SRelatedResource) ProtoMessage() {} func (x *K8SRelatedResource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[105] + mi := &file_api_v1_k8s_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7981,7 +9463,7 @@ func (x *K8SRelatedResource) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SRelatedResource.ProtoReflect.Descriptor instead. func (*K8SRelatedResource) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{105} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{124} } func (x *K8SRelatedResource) GetSourceKind() string { @@ -8047,7 +9529,7 @@ type K8SResourceNode struct { func (x *K8SResourceNode) Reset() { *x = K8SResourceNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[106] + mi := &file_api_v1_k8s_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8060,7 +9542,7 @@ func (x *K8SResourceNode) String() string { func (*K8SResourceNode) ProtoMessage() {} func (x *K8SResourceNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[106] + mi := &file_api_v1_k8s_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8073,7 +9555,7 @@ func (x *K8SResourceNode) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SResourceNode.ProtoReflect.Descriptor instead. func (*K8SResourceNode) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{106} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{125} } func (x *K8SResourceNode) GetId() string { @@ -8112,7 +9594,7 @@ type K8SResourceEdge struct { func (x *K8SResourceEdge) Reset() { *x = K8SResourceEdge{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[107] + mi := &file_api_v1_k8s_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8125,7 +9607,7 @@ func (x *K8SResourceEdge) String() string { func (*K8SResourceEdge) ProtoMessage() {} func (x *K8SResourceEdge) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[107] + mi := &file_api_v1_k8s_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8138,7 +9620,7 @@ func (x *K8SResourceEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SResourceEdge.ProtoReflect.Descriptor instead. func (*K8SResourceEdge) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{107} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{126} } func (x *K8SResourceEdge) GetId() string { @@ -8155,47 +9637,158 @@ func (x *K8SResourceEdge) GetSource() string { return "" } -func (x *K8SResourceEdge) GetTarget() string { +func (x *K8SResourceEdge) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *K8SResourceEdge) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +// GetClusterTypeRequest is used to determine the cluster type based on kubelet version +type GetClusterTypeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. +} + +func (x *GetClusterTypeRequest) Reset() { + *x = GetClusterTypeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterTypeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterTypeRequest) ProtoMessage() {} + +func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[127] + 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 GetClusterTypeRequest.ProtoReflect.Descriptor instead. +func (*GetClusterTypeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{127} +} + +func (x *GetClusterTypeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetClusterTypeRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// GetClusterTypeResponse returns the determined cluster type +type GetClusterTypeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterType ClusterType `protobuf:"varint,1,opt,name=cluster_type,json=clusterType,proto3,enum=api.v1.ClusterType" json:"cluster_type,omitempty"` // Detected cluster type + KubeletVersion string `protobuf:"bytes,2,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // The raw kubelet version string +} + +func (x *GetClusterTypeResponse) Reset() { + *x = GetClusterTypeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterTypeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterTypeResponse) ProtoMessage() {} + +func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[128] + 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 GetClusterTypeResponse.ProtoReflect.Descriptor instead. +func (*GetClusterTypeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{128} +} + +func (x *GetClusterTypeResponse) GetClusterType() ClusterType { if x != nil { - return x.Target + return x.ClusterType } - return "" + return ClusterType_CLUSTER_TYPE_UNSPECIFIED } -func (x *K8SResourceEdge) GetLabel() string { +func (x *GetClusterTypeResponse) GetKubeletVersion() string { if x != nil { - return x.Label + return x.KubeletVersion } return "" } -// GetClusterTypeRequest is used to determine the cluster type based on kubelet version -type GetClusterTypeRequest struct { +type GetMigPartedConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetClusterTypeRequest) Reset() { - *x = GetClusterTypeRequest{} +func (x *GetMigPartedConfigRequest) Reset() { + *x = GetMigPartedConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[108] + mi := &file_api_v1_k8s_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterTypeRequest) String() string { +func (x *GetMigPartedConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterTypeRequest) ProtoMessage() {} +func (*GetMigPartedConfigRequest) ProtoMessage() {} -func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[108] +func (x *GetMigPartedConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8206,52 +9799,62 @@ func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterTypeRequest.ProtoReflect.Descriptor instead. -func (*GetClusterTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{108} +// Deprecated: Use GetMigPartedConfigRequest.ProtoReflect.Descriptor instead. +func (*GetMigPartedConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{129} } -func (x *GetClusterTypeRequest) GetTeamId() string { +func (x *GetMigPartedConfigRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetClusterTypeRequest) GetClusterId() string { +func (x *GetMigPartedConfigRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -// GetClusterTypeResponse returns the determined cluster type -type GetClusterTypeResponse struct { +type GetMigPartedConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterType ClusterType `protobuf:"varint,1,opt,name=cluster_type,json=clusterType,proto3,enum=api.v1.ClusterType" json:"cluster_type,omitempty"` // Detected cluster type - KubeletVersion string `protobuf:"bytes,2,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // The raw kubelet version string + // Whether a mig-parted ConfigMap has been collected for this cluster. + Found bool `protobuf:"varint,1,opt,name=found,proto3" json:"found,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + // Config schema version (e.g. v1). + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + // Parsed profile map from config.yaml as JSON: + // {profile-name: [{devices, mig-enabled, mig-devices}, ...]}. + MigConfigsJson string `protobuf:"bytes,5,opt,name=mig_configs_json,json=migConfigsJson,proto3" json:"mig_configs_json,omitempty"` + // Original config.yaml text; authoritative when parse_error is set. + Raw string `protobuf:"bytes,6,opt,name=raw,proto3" json:"raw,omitempty"` + ParseError string `protobuf:"bytes,7,opt,name=parse_error,json=parseError,proto3" json:"parse_error,omitempty"` + LastSeen *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` } -func (x *GetClusterTypeResponse) Reset() { - *x = GetClusterTypeResponse{} +func (x *GetMigPartedConfigResponse) Reset() { + *x = GetMigPartedConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[109] + mi := &file_api_v1_k8s_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterTypeResponse) String() string { +func (x *GetMigPartedConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterTypeResponse) ProtoMessage() {} +func (*GetMigPartedConfigResponse) ProtoMessage() {} -func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[109] +func (x *GetMigPartedConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8262,25 +9865,67 @@ func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterTypeResponse.ProtoReflect.Descriptor instead. -func (*GetClusterTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{109} +// Deprecated: Use GetMigPartedConfigResponse.ProtoReflect.Descriptor instead. +func (*GetMigPartedConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{130} } -func (x *GetClusterTypeResponse) GetClusterType() ClusterType { +func (x *GetMigPartedConfigResponse) GetFound() bool { if x != nil { - return x.ClusterType + return x.Found } - return ClusterType_CLUSTER_TYPE_UNSPECIFIED + return false } -func (x *GetClusterTypeResponse) GetKubeletVersion() string { +func (x *GetMigPartedConfigResponse) GetName() string { if x != nil { - return x.KubeletVersion + return x.Name + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetMigConfigsJson() string { + if x != nil { + return x.MigConfigsJson + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetRaw() string { + if x != nil { + return x.Raw + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetParseError() string { + if x != nil { + return x.ParseError } return "" } +func (x *GetMigPartedConfigResponse) GetLastSeen() *timestamppb.Timestamp { + if x != nil { + return x.LastSeen + } + return nil +} + type GetWorkloadsStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8295,7 +9940,7 @@ type GetWorkloadsStatsRequest struct { func (x *GetWorkloadsStatsRequest) Reset() { *x = GetWorkloadsStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[110] + mi := &file_api_v1_k8s_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8308,7 +9953,7 @@ func (x *GetWorkloadsStatsRequest) String() string { func (*GetWorkloadsStatsRequest) ProtoMessage() {} func (x *GetWorkloadsStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[110] + mi := &file_api_v1_k8s_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8321,7 +9966,7 @@ func (x *GetWorkloadsStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadsStatsRequest.ProtoReflect.Descriptor instead. func (*GetWorkloadsStatsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{110} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{131} } func (x *GetWorkloadsStatsRequest) GetTeamId() string { @@ -8367,7 +10012,7 @@ type GetWorkloadsStatsResponse struct { func (x *GetWorkloadsStatsResponse) Reset() { *x = GetWorkloadsStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[111] + mi := &file_api_v1_k8s_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8380,7 +10025,7 @@ func (x *GetWorkloadsStatsResponse) String() string { func (*GetWorkloadsStatsResponse) ProtoMessage() {} func (x *GetWorkloadsStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[111] + mi := &file_api_v1_k8s_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8393,7 +10038,7 @@ func (x *GetWorkloadsStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadsStatsResponse.ProtoReflect.Descriptor instead. func (*GetWorkloadsStatsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{111} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{132} } func (x *GetWorkloadsStatsResponse) GetTotal() int32 { @@ -8445,7 +10090,7 @@ type DailyUtilizationRequest struct { func (x *DailyUtilizationRequest) Reset() { *x = DailyUtilizationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[112] + mi := &file_api_v1_k8s_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8458,7 +10103,7 @@ func (x *DailyUtilizationRequest) String() string { func (*DailyUtilizationRequest) ProtoMessage() {} func (x *DailyUtilizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[112] + mi := &file_api_v1_k8s_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8471,7 +10116,7 @@ func (x *DailyUtilizationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{112} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{133} } func (x *DailyUtilizationRequest) GetTeamId() string { @@ -8515,7 +10160,7 @@ type DailyUtilizationResponse struct { func (x *DailyUtilizationResponse) Reset() { *x = DailyUtilizationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[113] + mi := &file_api_v1_k8s_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8528,7 +10173,7 @@ func (x *DailyUtilizationResponse) String() string { func (*DailyUtilizationResponse) ProtoMessage() {} func (x *DailyUtilizationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[113] + mi := &file_api_v1_k8s_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8541,7 +10186,7 @@ func (x *DailyUtilizationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134} } func (x *DailyUtilizationResponse) GetClusterIdToDailyTotalCoreMinutes() map[string]*DailyUtilizationResponse_Datapoints { @@ -8579,7 +10224,7 @@ type DailyUtilizationInstanceTypeRequest struct { func (x *DailyUtilizationInstanceTypeRequest) Reset() { *x = DailyUtilizationInstanceTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[114] + mi := &file_api_v1_k8s_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8592,7 +10237,7 @@ func (x *DailyUtilizationInstanceTypeRequest) String() string { func (*DailyUtilizationInstanceTypeRequest) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[114] + mi := &file_api_v1_k8s_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8605,7 +10250,7 @@ func (x *DailyUtilizationInstanceTypeRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use DailyUtilizationInstanceTypeRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{114} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{135} } func (x *DailyUtilizationInstanceTypeRequest) GetTeamId() string { @@ -8648,7 +10293,7 @@ type DailyUtilizationInstanceTypeResponse struct { func (x *DailyUtilizationInstanceTypeResponse) Reset() { *x = DailyUtilizationInstanceTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[115] + mi := &file_api_v1_k8s_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8661,7 +10306,7 @@ func (x *DailyUtilizationInstanceTypeResponse) String() string { func (*DailyUtilizationInstanceTypeResponse) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[115] + mi := &file_api_v1_k8s_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8674,7 +10319,7 @@ func (x *DailyUtilizationInstanceTypeResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use DailyUtilizationInstanceTypeResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136} } func (x *DailyUtilizationInstanceTypeResponse) GetClusterIdToDatapoints() map[string]*DailyUtilizationInstanceTypeResponse_Datapoints { @@ -8705,7 +10350,7 @@ type DailyUtilizationNodeTypeRequest struct { func (x *DailyUtilizationNodeTypeRequest) Reset() { *x = DailyUtilizationNodeTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[116] + mi := &file_api_v1_k8s_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8718,7 +10363,7 @@ func (x *DailyUtilizationNodeTypeRequest) String() string { func (*DailyUtilizationNodeTypeRequest) ProtoMessage() {} func (x *DailyUtilizationNodeTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[116] + mi := &file_api_v1_k8s_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8731,7 +10376,7 @@ func (x *DailyUtilizationNodeTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationNodeTypeRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{116} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{137} } func (x *DailyUtilizationNodeTypeRequest) GetTeamId() string { @@ -8774,7 +10419,7 @@ type DailyUtilizationNodeTypeResponse struct { func (x *DailyUtilizationNodeTypeResponse) Reset() { *x = DailyUtilizationNodeTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[117] + mi := &file_api_v1_k8s_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8787,7 +10432,7 @@ func (x *DailyUtilizationNodeTypeResponse) String() string { func (*DailyUtilizationNodeTypeResponse) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[117] + mi := &file_api_v1_k8s_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8800,7 +10445,7 @@ func (x *DailyUtilizationNodeTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationNodeTypeResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138} } func (x *DailyUtilizationNodeTypeResponse) GetClusterIdToDatapoints() map[string]*DailyUtilizationNodeTypeResponse_Datapoints { @@ -8831,7 +10476,7 @@ type LookupNodeInstanceRequest struct { func (x *LookupNodeInstanceRequest) Reset() { *x = LookupNodeInstanceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[118] + mi := &file_api_v1_k8s_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8844,7 +10489,7 @@ func (x *LookupNodeInstanceRequest) String() string { func (*LookupNodeInstanceRequest) ProtoMessage() {} func (x *LookupNodeInstanceRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[118] + mi := &file_api_v1_k8s_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8857,7 +10502,7 @@ func (x *LookupNodeInstanceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupNodeInstanceRequest.ProtoReflect.Descriptor instead. func (*LookupNodeInstanceRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{118} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{139} } func (x *LookupNodeInstanceRequest) GetTeamId() string { @@ -8897,7 +10542,7 @@ type InstanceLookupParams struct { func (x *InstanceLookupParams) Reset() { *x = InstanceLookupParams{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[119] + mi := &file_api_v1_k8s_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8910,7 +10555,7 @@ func (x *InstanceLookupParams) String() string { func (*InstanceLookupParams) ProtoMessage() {} func (x *InstanceLookupParams) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[119] + mi := &file_api_v1_k8s_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8923,7 +10568,7 @@ func (x *InstanceLookupParams) ProtoReflect() protoreflect.Message { // Deprecated: Use InstanceLookupParams.ProtoReflect.Descriptor instead. func (*InstanceLookupParams) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{119} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{140} } func (x *InstanceLookupParams) GetCloudProviderId() int64 { @@ -8977,7 +10622,7 @@ type LookupNodeInstanceResponse struct { func (x *LookupNodeInstanceResponse) Reset() { *x = LookupNodeInstanceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[120] + mi := &file_api_v1_k8s_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8990,7 +10635,7 @@ func (x *LookupNodeInstanceResponse) String() string { func (*LookupNodeInstanceResponse) ProtoMessage() {} func (x *LookupNodeInstanceResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[120] + mi := &file_api_v1_k8s_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9003,7 +10648,7 @@ func (x *LookupNodeInstanceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupNodeInstanceResponse.ProtoReflect.Descriptor instead. func (*LookupNodeInstanceResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{120} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{141} } func (x *LookupNodeInstanceResponse) GetDynamicInstance() *Instance { @@ -9052,7 +10697,7 @@ type GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics struct { func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) Reset() { *x = GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[122] + mi := &file_api_v1_k8s_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9065,7 +10710,7 @@ func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) String() string func (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoMessage() {} func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[122] + mi := &file_api_v1_k8s_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9078,7 +10723,7 @@ func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoReflect() p // Deprecated: Use GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics.ProtoReflect.Descriptor instead. func (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{27, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{35, 0} } func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) GetNodeGroupMetrics() []*NodeGroupMetric { @@ -9099,7 +10744,7 @@ type DailyUtilizationResponse_Datapoints struct { func (x *DailyUtilizationResponse_Datapoints) Reset() { *x = DailyUtilizationResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[133] + mi := &file_api_v1_k8s_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9112,7 +10757,7 @@ func (x *DailyUtilizationResponse_Datapoints) String() string { func (*DailyUtilizationResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[133] + mi := &file_api_v1_k8s_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9125,7 +10770,7 @@ func (x *DailyUtilizationResponse_Datapoints) ProtoReflect() protoreflect.Messag // Deprecated: Use DailyUtilizationResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134, 0} } func (x *DailyUtilizationResponse_Datapoints) GetDatapoints() []*DailyUtilizationResponse_Datapoint { @@ -9147,7 +10792,7 @@ type DailyUtilizationResponse_Datapoint struct { func (x *DailyUtilizationResponse_Datapoint) Reset() { *x = DailyUtilizationResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[134] + mi := &file_api_v1_k8s_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9160,7 +10805,7 @@ func (x *DailyUtilizationResponse_Datapoint) String() string { func (*DailyUtilizationResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[134] + mi := &file_api_v1_k8s_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9173,7 +10818,7 @@ func (x *DailyUtilizationResponse_Datapoint) ProtoReflect() protoreflect.Message // Deprecated: Use DailyUtilizationResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134, 1} } func (x *DailyUtilizationResponse_Datapoint) GetTimestamp() int64 { @@ -9201,7 +10846,7 @@ type DailyUtilizationInstanceTypeResponse_Datapoints struct { func (x *DailyUtilizationInstanceTypeResponse_Datapoints) Reset() { *x = DailyUtilizationInstanceTypeResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[137] + mi := &file_api_v1_k8s_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9214,7 +10859,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoints) String() string { func (*DailyUtilizationInstanceTypeResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[137] + mi := &file_api_v1_k8s_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9227,7 +10872,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoints) ProtoReflect() protore // Deprecated: Use DailyUtilizationInstanceTypeResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136, 0} } func (x *DailyUtilizationInstanceTypeResponse_Datapoints) GetDatapoints() []*DailyUtilizationInstanceTypeResponse_Datapoint { @@ -9249,7 +10894,7 @@ type DailyUtilizationInstanceTypeResponse_Datapoint struct { func (x *DailyUtilizationInstanceTypeResponse_Datapoint) Reset() { *x = DailyUtilizationInstanceTypeResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[138] + mi := &file_api_v1_k8s_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9262,7 +10907,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoint) String() string { func (*DailyUtilizationInstanceTypeResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[138] + mi := &file_api_v1_k8s_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9275,7 +10920,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoint) ProtoReflect() protoref // Deprecated: Use DailyUtilizationInstanceTypeResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136, 1} } func (x *DailyUtilizationInstanceTypeResponse_Datapoint) GetTimestamp() int64 { @@ -9303,7 +10948,7 @@ type DailyUtilizationNodeTypeResponse_Datapoints struct { func (x *DailyUtilizationNodeTypeResponse_Datapoints) Reset() { *x = DailyUtilizationNodeTypeResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[142] + mi := &file_api_v1_k8s_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9316,7 +10961,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoints) String() string { func (*DailyUtilizationNodeTypeResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[142] + mi := &file_api_v1_k8s_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9329,7 +10974,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoints) ProtoReflect() protoreflec // Deprecated: Use DailyUtilizationNodeTypeResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138, 0} } func (x *DailyUtilizationNodeTypeResponse_Datapoints) GetDatapoints() []*DailyUtilizationNodeTypeResponse_Datapoint { @@ -9351,7 +10996,7 @@ type DailyUtilizationNodeTypeResponse_Datapoint struct { func (x *DailyUtilizationNodeTypeResponse_Datapoint) Reset() { *x = DailyUtilizationNodeTypeResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[143] + mi := &file_api_v1_k8s_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9364,7 +11009,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoint) String() string { func (*DailyUtilizationNodeTypeResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[143] + mi := &file_api_v1_k8s_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9377,7 +11022,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoint) ProtoReflect() protoreflect // Deprecated: Use DailyUtilizationNodeTypeResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138, 1} } func (x *DailyUtilizationNodeTypeResponse_Datapoint) GetTimestamp() int64 { @@ -9471,7 +11116,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x22, 0xfe, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x04, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, @@ -9492,48 +11137,313 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, - 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, + 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x32, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xbf, 0x04, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, + 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, + 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x32, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x56, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 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, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x1a, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xa0, 0x02, 0x0a, 0x17, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x70, 0x38, 0x30, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x38, 0x30, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc8, + 0x05, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x19, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x1a, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x18, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, 0x63, 0x0a, 0x1d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x1b, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x5d, 0x0a, 0x1a, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x47, 0x70, 0x75, 0x22, 0xc3, 0x01, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0x9f, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x35, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x22, 0xef, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfb, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, + 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, + 0x74, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x22, 0xef, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x8e, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x02, 0x18, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, + 0xc3, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, + 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, + 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x29, + 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, 0x42, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x87, 0x01, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, @@ -9541,249 +11451,149 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x65, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfb, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, - 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, - 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x8e, 0x01, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, - 0x02, 0x18, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0xc3, - 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, - 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, - 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x60, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, 0x01, - 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2f, 0x0a, 0x14, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x68, 0x6f, 0x75, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x29, 0x0a, - 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x73, - 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, 0x42, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x87, 0x01, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, - 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x15, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x31, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, - 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xc8, - 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x61, 0x70, 0x1a, 0x52, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xa7, 0x02, - 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xdd, 0x09, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, - 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x89, 0x01, 0x0a, 0x1d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, - 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, - 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x20, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x31, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, + 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xc8, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x61, 0x70, 0x1a, 0x52, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x1c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x80, 0x01, 0x0a, 0x1a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x61, 0x7a, 0x5f, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xdd, 0x09, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x1a, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x89, 0x01, + 0x0a, 0x1d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6c, 0x6f, 0x67, - 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x1a, 0x5d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, + 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x1c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x80, + 0x01, 0x0a, 0x1a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x61, 0x7a, 0x5f, 0x74, 0x6f, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8b, 0x01, - 0x0a, 0x1e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x1a, 0x5d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x10, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -9791,245 +11601,364 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8e, 0x01, 0x0a, 0x21, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, - 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, - 0x1b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x06, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, - 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x30, 0x0a, - 0x14, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x61, 0x67, 0x67, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x12, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x43, 0x70, 0x75, - 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x74, 0x69, 0x6c, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x75, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x17, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x76, 0x67, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x75, 0x74, - 0x69, 0x6c, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x75, 0x74, 0x69, 0x6c, - 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x68, 0x6f, 0x75, - 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, - 0x65, 0x79, 0x52, 0x0a, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, - 0x0a, 0x0f, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, - 0x72, 0x6c, 0x79, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x12, 0x68, 0x6f, - 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, - 0x6c, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, - 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, - 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8b, 0x01, 0x0a, 0x1e, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8e, 0x01, 0x0a, 0x21, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, + 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4c, + 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x06, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, + 0x63, 0x70, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x76, 0x72, 0x61, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, 0x0a, + 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, + 0x26, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, + 0x67, 0x67, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, + 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x75, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x17, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x75, 0x74, 0x69, 0x6c, + 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x26, 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x75, 0x74, 0x69, 0x6c, 0x47, 0x70, + 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x68, 0x6f, 0x75, 0x72, 0x6c, + 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, + 0x52, 0x0a, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, + 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, + 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, - 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, - 0x3f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x22, 0xf2, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, - 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x02, - 0x18, 0x01, 0x22, 0xb4, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, - 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, - 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, - 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x95, 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, - 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, - 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x9e, - 0x02, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x79, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, + 0x6c, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, 0x68, 0x6f, + 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x35, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x47, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3f, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xf2, + 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x02, 0x18, 0x01, + 0x22, 0xb4, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2d, 0x0a, + 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0x95, 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3f, + 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x9e, 0x02, 0x0a, + 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x6d, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x9d, - 0x02, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x6d, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x9d, 0x02, 0x0a, + 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x65, - 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x72, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, - 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x26, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x22, 0x72, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, + 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x75, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x22, 0xa9, 0x02, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x55, 0x69, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x22, 0xa7, 0x02, + 0x0a, 0x17, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x74, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x72, 0x61, 0x6d, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, + 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x75, + 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xdc, 0x01, 0x0a, 0x18, 0x47, 0x50, 0x55, 0x4d, + 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, + 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, + 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x50, + 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x22, 0x73, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, + 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x4a, 0x0a, 0x10, 0x4c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x55, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x1c, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x09, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, @@ -10362,7 +12291,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x87, 0x07, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, + 0xcb, 0x07, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x7a, 0x78, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, @@ -10418,543 +12347,570 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x72, 0x65, 0x7a, 0x72, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x74, 0x72, 0x65, 0x7a, - 0x72, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x23, 0x47, 0x61, - 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x50, 0x4f, 0x56, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x47, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, - 0x74, 0x73, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, - 0x73, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, + 0x72, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x12, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe5, 0x01, + 0x0a, 0x23, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, + 0x3b, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, + 0x79, 0x50, 0x4f, 0x56, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x42, 0x79, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x47, 0x0a, 0x0e, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, + 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x4f, 0x70, 0x74, 0x73, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0x4c, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x13, 0x47, - 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, + 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x59, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, + 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0x4c, 0x0a, 0x0d, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, + 0x02, 0x0a, 0x13, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x98, 0x01, 0x0a, - 0x18, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x40, 0x0a, 0x1d, 0x6e, 0x75, 0x6d, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x6e, 0x75, - 0x6d, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x49, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xa3, 0x05, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, - 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x76, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6c, 0x6f, 0x67, - 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x04, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x4a, 0x0a, - 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x53, 0x65, - 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, - 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x19, 0x53, 0x65, - 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x64, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5c, 0x0a, 0x21, 0x53, 0x65, 0x6e, 0x64, 0x57, - 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, - 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x1e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, - 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x95, 0x03, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x98, 0x01, 0x0a, 0x18, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x40, 0x0a, 0x1d, 0x6e, 0x75, 0x6d, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x19, 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x49, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xa3, 0x05, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, - 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3d, - 0x0a, 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, 0x73, 0x74, - 0x55, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x13, 0x6d, 0x6f, 0x73, 0x74, - 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x11, 0x6d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x14, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, - 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x12, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x17, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x6d, 0x6f, 0x73, 0x74, 0x55, 0x6e, 0x64, 0x65, 0x72, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x9f, 0x01, 0x0a, - 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x75, + 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x73, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x76, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x04, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, + 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x4a, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x9e, 0x01, + 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x4f, - 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0x8e, 0x01, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x78, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x57, 0x0a, 0x1a, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x35, + 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x64, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, + 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5c, 0x0a, 0x21, 0x53, + 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, + 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x1e, 0x53, 0x65, 0x6e, + 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x95, 0x03, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x4d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, + 0x16, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x4d, 0x6f, 0x73, 0x74, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x4e, 0x6f, 0x64, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x02, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, + 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x13, + 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x11, 0x6d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x14, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x17, 0x6d, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x6d, 0x6f, 0x73, 0x74, 0x55, + 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0x4f, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x17, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x6b, - 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, - 0x6f, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, - 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x1a, 0x5b, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, - 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6c, 0x74, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x78, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, + 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x57, + 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x17, 0x4b, 0x38, 0x73, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x1b, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x6b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x1a, 0x5b, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, - 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x62, 0x0a, 0x1a, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x63, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x18, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x22, 0x46, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x1a, 0x62, 0x0a, 0x1a, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, + 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x63, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x0a, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x22, 0xcc, 0x04, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x6a, 0x0a, 0x18, 0x70, 0x6f, 0x64, 0x5f, - 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, - 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x17, 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, - 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, - 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x5d, 0x0a, 0x19, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, - 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, - 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0xce, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0d, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, - 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, - 0x6e, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, - 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, - 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x6a, 0x6f, - 0x62, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x6a, 0x6f, - 0x62, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xf3, 0x01, - 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, - 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, - 0x6f, 0x64, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, - 0xb5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, - 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x12, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x69, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x69, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x54, 0x79, 0x70, 0x65, 0x22, 0x49, 0x0a, - 0x0f, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x67, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x22, 0x4f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x16, 0x41, 0x64, 0x64, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, + 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x22, 0x79, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, - 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x46, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2a, + 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x0a, 0x54, 0x61, + 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3a, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x26, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xcc, 0x04, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x6a, 0x0a, 0x18, + 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, + 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x14, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x17, 0x70, 0x6f, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x70, 0x6f, + 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x5d, 0x0a, 0x19, 0x50, 0x6f, + 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x50, 0x6f, 0x64, + 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, + 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xce, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0d, 0x6b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0d, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, + 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, + 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, + 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, + 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x12, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, + 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x55, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x49, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x67, 0x0a, 0x0f, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x4f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x79, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x53, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x94, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x69, + 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x69, 0x67, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x4a, 0x73, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x72, 0x61, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, @@ -11308,7 +13264,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4b, 0x45, 0x32, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x44, 0x10, 0x03, 0x32, - 0xca, 0x1e, 0x0a, 0x0a, 0x4b, 0x38, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, + 0xb8, 0x25, 0x0a, 0x0a, 0x4b, 0x38, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, @@ -11408,204 +13364,259 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, - 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x46, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, + 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, - 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, - 0x01, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x49, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, - 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, + 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x49, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, + 0x1c, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x53, - 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, + 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, + 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, + 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, + 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x46, 0x6f, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5b, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, - 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdc, 0x02, 0x0a, - 0x16, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdc, 0x02, 0x0a, 0x16, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd5, 0x02, 0x0a, 0x12, - 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd5, 0x02, 0x0a, 0x12, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x55, 0x0a, 0x10, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x44, 0x61, 0x69, 0x6c, 0x79, + 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x44, 0x61, 0x69, - 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, + 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x86, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x08, 0x4b, 0x38, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, - 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, - 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, - 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, - 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x42, 0x86, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x42, 0x08, 0x4b, 0x38, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, + 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, + 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, + 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, + 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -11621,7 +13632,7 @@ func file_api_v1_k8s_proto_rawDescGZIP() []byte { } var file_api_v1_k8s_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_api_v1_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 147) +var file_api_v1_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 168) var file_api_v1_k8s_proto_goTypes = []interface{}{ (GalaxyPOVNodeGroupBy)(0), // 0: api.v1.GalaxyPOVNodeGroupBy (GalaxyPOVWorkloadGroupBy)(0), // 1: api.v1.GalaxyPOVWorkloadGroupBy @@ -11631,490 +13642,561 @@ var file_api_v1_k8s_proto_goTypes = []interface{}{ (*GetClusterMetadataRequest)(nil), // 5: api.v1.GetClusterMetadataRequest (*GetNodeGroupRequest)(nil), // 6: api.v1.GetNodeGroupRequest (*GetWorkloadsRequest)(nil), // 7: api.v1.GetWorkloadsRequest - (*GetResourcesRequest)(nil), // 8: api.v1.GetResourcesRequest - (*GetPodsRequest)(nil), // 9: api.v1.GetPodsRequest - (*GetPodsResponse)(nil), // 10: api.v1.GetPodsResponse - (*GetWorkloadRequest)(nil), // 11: api.v1.GetWorkloadRequest - (*GetClustersRequest)(nil), // 12: api.v1.GetClustersRequest - (*ListClustersRequest)(nil), // 13: api.v1.ListClustersRequest - (*GetClusterRequest)(nil), // 14: api.v1.GetClusterRequest - (*DeleteClusterRequest)(nil), // 15: api.v1.DeleteClusterRequest - (*DeleteClusterResponse)(nil), // 16: api.v1.DeleteClusterResponse - (*UpdateClusterRequest)(nil), // 17: api.v1.UpdateClusterRequest - (*UpdateClusterResponse)(nil), // 18: api.v1.UpdateClusterResponse - (*GetResourcesResponse)(nil), // 19: api.v1.GetResourcesResponse - (*CreateClusterRequest)(nil), // 20: api.v1.CreateClusterRequest - (*CreateClusterResponse)(nil), // 21: api.v1.CreateClusterResponse - (*ResetClusterTokenRequest)(nil), // 22: api.v1.ResetClusterTokenRequest - (*ResetClusterTokenResponse)(nil), // 23: api.v1.ResetClusterTokenResponse - (*GetNodeGroupsRequest)(nil), // 24: api.v1.GetNodeGroupsRequest - (*GetAllNodeGroupsRequest)(nil), // 25: api.v1.GetAllNodeGroupsRequest - (*GetNodeGroupsResponse)(nil), // 26: api.v1.GetNodeGroupsResponse - (*GetAllNodeGroupsResponse)(nil), // 27: api.v1.GetAllNodeGroupsResponse - (*NodeGroupSet)(nil), // 28: api.v1.NodeGroupSet - (*GetNodeGroupsUtilizationRequest)(nil), // 29: api.v1.GetNodeGroupsUtilizationRequest - (*GetNodeGroupsUtilizationResponse)(nil), // 30: api.v1.GetNodeGroupsUtilizationResponse - (*NodeGroupMetric)(nil), // 31: api.v1.NodeGroupMetric - (*GetNodeGroupResponse)(nil), // 32: api.v1.GetNodeGroupResponse - (*GetClusterResponse)(nil), // 33: api.v1.GetClusterResponse - (*GetClustersResponse)(nil), // 34: api.v1.GetClustersResponse - (*ListClustersResponse)(nil), // 35: api.v1.ListClustersResponse - (*GetNodeResponse)(nil), // 36: api.v1.GetNodeResponse - (*GetWorkloadsResponse)(nil), // 37: api.v1.GetWorkloadsResponse - (*GetWorkloadResponse)(nil), // 38: api.v1.GetWorkloadResponse - (*GetWorkloadContainerPercentilesRequest)(nil), // 39: api.v1.GetWorkloadContainerPercentilesRequest - (*GetWorkloadContainerPercentilesResponse)(nil), // 40: api.v1.GetWorkloadContainerPercentilesResponse - (*GetWorkloadContainerTimeSeriesRequest)(nil), // 41: api.v1.GetWorkloadContainerTimeSeriesRequest - (*GetWorkloadContainerTimeSeriesResponse)(nil), // 42: api.v1.GetWorkloadContainerTimeSeriesResponse - (*GetLatestContainerRequestLimitsRequest)(nil), // 43: api.v1.GetLatestContainerRequestLimitsRequest - (*GetLatestContainerRequestLimitsResponse)(nil), // 44: api.v1.GetLatestContainerRequestLimitsResponse - (*GetForecastWorkloadsRequest)(nil), // 45: api.v1.GetForecastWorkloadsRequest - (*GetForecastWorkloadsResponse)(nil), // 46: api.v1.GetForecastWorkloadsResponse - (*GetForecastWorkloadRequest)(nil), // 47: api.v1.GetForecastWorkloadRequest - (*GetForecastWorkloadResponse)(nil), // 48: api.v1.GetForecastWorkloadResponse - (*GetClusterMetadataResponse)(nil), // 49: api.v1.GetClusterMetadataResponse - (*ClusterElement)(nil), // 50: api.v1.ClusterElement - (*GetAllNamespacesRequest)(nil), // 51: api.v1.GetAllNamespacesRequest - (*GetAllNamespacesResponse)(nil), // 52: api.v1.GetAllNamespacesResponse - (*SearchNamespacesByClusterRequest)(nil), // 53: api.v1.SearchNamespacesByClusterRequest - (*SearchNamespacesByClusterResponse)(nil), // 54: api.v1.SearchNamespacesByClusterResponse - (*ListNamespacesByClusterRequest)(nil), // 55: api.v1.ListNamespacesByClusterRequest - (*ListNamespacesByClusterResponse)(nil), // 56: api.v1.ListNamespacesByClusterResponse - (*NamespaceItem)(nil), // 57: api.v1.NamespaceItem - (*GetAllWorkloadNamesRequest)(nil), // 58: api.v1.GetAllWorkloadNamesRequest - (*GetAllWorkloadNamesResponse)(nil), // 59: api.v1.GetAllWorkloadNamesResponse - (*GetAllWorkloadLabelsRequest)(nil), // 60: api.v1.GetAllWorkloadLabelsRequest - (*GetAllWorkloadLabelsResponse)(nil), // 61: api.v1.GetAllWorkloadLabelsResponse - (*GetAllNodeGroupNamesRequest)(nil), // 62: api.v1.GetAllNodeGroupNamesRequest - (*GetAllNodeGroupNamesResponse)(nil), // 63: api.v1.GetAllNodeGroupNamesResponse - (*Cluster)(nil), // 64: api.v1.Cluster - (*OperatorInfo)(nil), // 65: api.v1.OperatorInfo - (*Container)(nil), // 66: api.v1.Container - (*GetLatestOperatorVersionRequest)(nil), // 67: api.v1.GetLatestOperatorVersionRequest - (*GetLatestOperatorVersionResponse)(nil), // 68: api.v1.GetLatestOperatorVersionResponse - (*GalaxyGetWorkloadPerspectiveRequest)(nil), // 69: api.v1.GalaxyGetWorkloadPerspectiveRequest - (*GalaxyGetWorkloadPerspectiveResponse)(nil), // 70: api.v1.GalaxyGetWorkloadPerspectiveResponse - (*GalaxyWorkloadGroup)(nil), // 71: api.v1.GalaxyWorkloadGroup - (*PerspectiveDatapointOpts)(nil), // 72: api.v1.PerspectiveDatapointOpts - (*ListAuditLogsRequest)(nil), // 73: api.v1.ListAuditLogsRequest - (*ListAuditLogsResponse)(nil), // 74: api.v1.ListAuditLogsResponse - (*ListAuditLogOriginatorsRequest)(nil), // 75: api.v1.ListAuditLogOriginatorsRequest - (*ListAuditLogOriginatorsResponse)(nil), // 76: api.v1.ListAuditLogOriginatorsResponse - (*SendWorkloadEmailRequest)(nil), // 77: api.v1.SendWorkloadEmailRequest - (*SendWorkloadEmailResponse)(nil), // 78: api.v1.SendWorkloadEmailResponse - (*SendWeeklySummaryEmailRequest)(nil), // 79: api.v1.SendWeeklySummaryEmailRequest - (*SendWeeklySummaryEmailRequestData)(nil), // 80: api.v1.SendWeeklySummaryEmailRequestData - (*SendWeeklySummaryEmailResponse)(nil), // 81: api.v1.SendWeeklySummaryEmailResponse - (*GetClustersNodeInfoRequest)(nil), // 82: api.v1.GetClustersNodeInfoRequest - (*GetClustersNodeInfoResponse)(nil), // 83: api.v1.GetClustersNodeInfoResponse - (*SearchK8SResourcesRequest)(nil), // 84: api.v1.SearchK8sResourcesRequest - (*SearchK8SResourcesResponse)(nil), // 85: api.v1.SearchK8sResourcesResponse - (*K8SSearchResult)(nil), // 86: api.v1.K8sSearchResult - (*SearchK8SWorkloadsRequest)(nil), // 87: api.v1.SearchK8sWorkloadsRequest - (*SearchK8SWorkloadsResponse)(nil), // 88: api.v1.SearchK8sWorkloadsResponse - (*K8SWorkloadSearchResult)(nil), // 89: api.v1.K8sWorkloadSearchResult - (*MetadataForWorkloadsRequest)(nil), // 90: api.v1.MetadataForWorkloadsRequest - (*MetadataForWorkloadsResponse)(nil), // 91: api.v1.MetadataForWorkloadsResponse - (*AddClusterTagsRequest)(nil), // 92: api.v1.AddClusterTagsRequest - (*AddClusterTagsResponse)(nil), // 93: api.v1.AddClusterTagsResponse - (*RemoveClusterTagsRequest)(nil), // 94: api.v1.RemoveClusterTagsRequest - (*RemoveClusterTagsResponse)(nil), // 95: api.v1.RemoveClusterTagsResponse - (*ListTagsRequest)(nil), // 96: api.v1.ListTagsRequest - (*TagSummary)(nil), // 97: api.v1.TagSummary - (*ListTagsResponse)(nil), // 98: api.v1.ListTagsResponse - (*WorkloadMetadata)(nil), // 99: api.v1.WorkloadMetadata - (*PodMetadata)(nil), // 100: api.v1.PodMetadata - (*NodeMetadata)(nil), // 101: api.v1.NodeMetadata - (*GetRelatedResourcesRequest)(nil), // 102: api.v1.GetRelatedResourcesRequest - (*GetWorkloadPodHistoryResponse)(nil), // 103: api.v1.GetWorkloadPodHistoryResponse - (*JobHistory)(nil), // 104: api.v1.JobHistory - (*ReplicaSetHistory)(nil), // 105: api.v1.ReplicaSetHistory - (*PodHistory)(nil), // 106: api.v1.PodHistory - (*GetRelatedResourcesResponse)(nil), // 107: api.v1.GetRelatedResourcesResponse - (*K8SRelatedResource)(nil), // 108: api.v1.K8sRelatedResource - (*K8SResourceNode)(nil), // 109: api.v1.K8sResourceNode - (*K8SResourceEdge)(nil), // 110: api.v1.K8sResourceEdge - (*GetClusterTypeRequest)(nil), // 111: api.v1.GetClusterTypeRequest - (*GetClusterTypeResponse)(nil), // 112: api.v1.GetClusterTypeResponse - (*GetWorkloadsStatsRequest)(nil), // 113: api.v1.GetWorkloadsStatsRequest - (*GetWorkloadsStatsResponse)(nil), // 114: api.v1.GetWorkloadsStatsResponse - (*DailyUtilizationRequest)(nil), // 115: api.v1.DailyUtilizationRequest - (*DailyUtilizationResponse)(nil), // 116: api.v1.DailyUtilizationResponse - (*DailyUtilizationInstanceTypeRequest)(nil), // 117: api.v1.DailyUtilizationInstanceTypeRequest - (*DailyUtilizationInstanceTypeResponse)(nil), // 118: api.v1.DailyUtilizationInstanceTypeResponse - (*DailyUtilizationNodeTypeRequest)(nil), // 119: api.v1.DailyUtilizationNodeTypeRequest - (*DailyUtilizationNodeTypeResponse)(nil), // 120: api.v1.DailyUtilizationNodeTypeResponse - (*LookupNodeInstanceRequest)(nil), // 121: api.v1.LookupNodeInstanceRequest - (*InstanceLookupParams)(nil), // 122: api.v1.InstanceLookupParams - (*LookupNodeInstanceResponse)(nil), // 123: api.v1.LookupNodeInstanceResponse - nil, // 124: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry - (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics)(nil), // 125: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - nil, // 126: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry - nil, // 127: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry - nil, // 128: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry - nil, // 129: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry - nil, // 130: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry - nil, // 131: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry - nil, // 132: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry - nil, // 133: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry - nil, // 134: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry - nil, // 135: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry - (*DailyUtilizationResponse_Datapoints)(nil), // 136: api.v1.DailyUtilizationResponse.Datapoints - (*DailyUtilizationResponse_Datapoint)(nil), // 137: api.v1.DailyUtilizationResponse.Datapoint - nil, // 138: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry - nil, // 139: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry - (*DailyUtilizationInstanceTypeResponse_Datapoints)(nil), // 140: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints - (*DailyUtilizationInstanceTypeResponse_Datapoint)(nil), // 141: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint - nil, // 142: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry - nil, // 143: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry - nil, // 144: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry - (*DailyUtilizationNodeTypeResponse_Datapoints)(nil), // 145: api.v1.DailyUtilizationNodeTypeResponse.Datapoints - (*DailyUtilizationNodeTypeResponse_Datapoint)(nil), // 146: api.v1.DailyUtilizationNodeTypeResponse.Datapoint - nil, // 147: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry - nil, // 148: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry - nil, // 149: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry - (*timestamppb.Timestamp)(nil), // 150: google.protobuf.Timestamp - (*WorkloadFilters)(nil), // 151: api.v1.WorkloadFilters - (K8SObjectKind)(0), // 152: api.v1.K8sObjectKind - (*Pagination)(nil), // 153: api.v1.Pagination - (*WorkloadItem)(nil), // 154: api.v1.WorkloadItem - (*NodeGroup)(nil), // 155: api.v1.NodeGroup - (*money.Money)(nil), // 156: google.type.Money - (*ResourceMetrics)(nil), // 157: api.v1.ResourceMetrics - (*CostInfo)(nil), // 158: api.v1.CostInfo - (*NodeInfo)(nil), // 159: api.v1.NodeInfo - (*CostDataPoint)(nil), // 160: api.v1.CostDataPoint - (*ResourceDataPoint)(nil), // 161: api.v1.ResourceDataPoint - (*Node)(nil), // 162: api.v1.Node - (*ResourceSummary)(nil), // 163: api.v1.ResourceSummary - (*ContainerPercentileSummary)(nil), // 164: api.v1.ContainerPercentileSummary - (*ContainerTimeSeries)(nil), // 165: api.v1.ContainerTimeSeries - (*ContainerRequestLimits)(nil), // 166: api.v1.ContainerRequestLimits - (*ForecastResourceMetrics)(nil), // 167: api.v1.ForecastResourceMetrics - (*AuditLogEntry)(nil), // 168: api.v1.AuditLogEntry - (*Instance)(nil), // 169: api.v1.Instance + (*ListWorkloadsPaginatedRequest)(nil), // 8: api.v1.ListWorkloadsPaginatedRequest + (*GetWorkloadsSummaryRequest)(nil), // 9: api.v1.GetWorkloadsSummaryRequest + (*WorkloadMetricEntry)(nil), // 10: api.v1.WorkloadMetricEntry + (*WorkloadMetricBreakdown)(nil), // 11: api.v1.WorkloadMetricBreakdown + (*GetWorkloadsSummaryResponse)(nil), // 12: api.v1.GetWorkloadsSummaryResponse + (*ListWorkloadsPaginatedResponse)(nil), // 13: api.v1.ListWorkloadsPaginatedResponse + (*GetResourcesRequest)(nil), // 14: api.v1.GetResourcesRequest + (*GetPodsRequest)(nil), // 15: api.v1.GetPodsRequest + (*GetPodsResponse)(nil), // 16: api.v1.GetPodsResponse + (*GetWorkloadRequest)(nil), // 17: api.v1.GetWorkloadRequest + (*GetClustersRequest)(nil), // 18: api.v1.GetClustersRequest + (*ListClustersRequest)(nil), // 19: api.v1.ListClustersRequest + (*GetClusterRequest)(nil), // 20: api.v1.GetClusterRequest + (*DeleteClusterRequest)(nil), // 21: api.v1.DeleteClusterRequest + (*DeleteClusterResponse)(nil), // 22: api.v1.DeleteClusterResponse + (*UpdateClusterRequest)(nil), // 23: api.v1.UpdateClusterRequest + (*UpdateClusterResponse)(nil), // 24: api.v1.UpdateClusterResponse + (*GetResourcesResponse)(nil), // 25: api.v1.GetResourcesResponse + (*GetResourceFilterOptionsRequest)(nil), // 26: api.v1.GetResourceFilterOptionsRequest + (*GetResourceFilterOptionsResponse)(nil), // 27: api.v1.GetResourceFilterOptionsResponse + (*CreateClusterRequest)(nil), // 28: api.v1.CreateClusterRequest + (*CreateClusterResponse)(nil), // 29: api.v1.CreateClusterResponse + (*ResetClusterTokenRequest)(nil), // 30: api.v1.ResetClusterTokenRequest + (*ResetClusterTokenResponse)(nil), // 31: api.v1.ResetClusterTokenResponse + (*GetNodeGroupsRequest)(nil), // 32: api.v1.GetNodeGroupsRequest + (*GetAllNodeGroupsRequest)(nil), // 33: api.v1.GetAllNodeGroupsRequest + (*GetNodeGroupsResponse)(nil), // 34: api.v1.GetNodeGroupsResponse + (*GetAllNodeGroupsResponse)(nil), // 35: api.v1.GetAllNodeGroupsResponse + (*NodeGroupSet)(nil), // 36: api.v1.NodeGroupSet + (*GetNodeGroupsUtilizationRequest)(nil), // 37: api.v1.GetNodeGroupsUtilizationRequest + (*GetNodeGroupsUtilizationResponse)(nil), // 38: api.v1.GetNodeGroupsUtilizationResponse + (*NodeGroupMetric)(nil), // 39: api.v1.NodeGroupMetric + (*GetNodeGroupResponse)(nil), // 40: api.v1.GetNodeGroupResponse + (*GetClusterResponse)(nil), // 41: api.v1.GetClusterResponse + (*GetClustersResponse)(nil), // 42: api.v1.GetClustersResponse + (*ListClustersResponse)(nil), // 43: api.v1.ListClustersResponse + (*GetNodeResponse)(nil), // 44: api.v1.GetNodeResponse + (*GetWorkloadsResponse)(nil), // 45: api.v1.GetWorkloadsResponse + (*GetWorkloadResponse)(nil), // 46: api.v1.GetWorkloadResponse + (*GetWorkloadContainerPercentilesRequest)(nil), // 47: api.v1.GetWorkloadContainerPercentilesRequest + (*GetWorkloadContainerPercentilesResponse)(nil), // 48: api.v1.GetWorkloadContainerPercentilesResponse + (*GetWorkloadContainerTimeSeriesRequest)(nil), // 49: api.v1.GetWorkloadContainerTimeSeriesRequest + (*GetWorkloadContainerTimeSeriesResponse)(nil), // 50: api.v1.GetWorkloadContainerTimeSeriesResponse + (*GetLatestContainerRequestLimitsRequest)(nil), // 51: api.v1.GetLatestContainerRequestLimitsRequest + (*GetLatestContainerRequestLimitsResponse)(nil), // 52: api.v1.GetLatestContainerRequestLimitsResponse + (*GetNodeGPUMigInstancesRequest)(nil), // 53: api.v1.GetNodeGPUMigInstancesRequest + (*GetNodeGPUMigInstancesResponse)(nil), // 54: api.v1.GetNodeGPUMigInstancesResponse + (*GetNodeGPUMigInstanceTimeseriesRequest)(nil), // 55: api.v1.GetNodeGPUMigInstanceTimeseriesRequest + (*GPUMigInstanceDataPoint)(nil), // 56: api.v1.GPUMigInstanceDataPoint + (*GPUMigInstanceTimeseries)(nil), // 57: api.v1.GPUMigInstanceTimeseries + (*GetNodeGPUMigInstanceTimeseriesResponse)(nil), // 58: api.v1.GetNodeGPUMigInstanceTimeseriesResponse + (*GetContainerIndividualGPUMetricsRequest)(nil), // 59: api.v1.GetContainerIndividualGPUMetricsRequest + (*GetContainerIndividualGPUMetricsResponse)(nil), // 60: api.v1.GetContainerIndividualGPUMetricsResponse + (*LanguageVersions)(nil), // 61: api.v1.LanguageVersions + (*GetWorkloadLanguagesRequest)(nil), // 62: api.v1.GetWorkloadLanguagesRequest + (*GetWorkloadLanguagesResponse)(nil), // 63: api.v1.GetWorkloadLanguagesResponse + (*GetForecastWorkloadsRequest)(nil), // 64: api.v1.GetForecastWorkloadsRequest + (*GetForecastWorkloadsResponse)(nil), // 65: api.v1.GetForecastWorkloadsResponse + (*GetForecastWorkloadRequest)(nil), // 66: api.v1.GetForecastWorkloadRequest + (*GetForecastWorkloadResponse)(nil), // 67: api.v1.GetForecastWorkloadResponse + (*GetClusterMetadataResponse)(nil), // 68: api.v1.GetClusterMetadataResponse + (*ClusterElement)(nil), // 69: api.v1.ClusterElement + (*GetAllNamespacesRequest)(nil), // 70: api.v1.GetAllNamespacesRequest + (*GetAllNamespacesResponse)(nil), // 71: api.v1.GetAllNamespacesResponse + (*SearchNamespacesByClusterRequest)(nil), // 72: api.v1.SearchNamespacesByClusterRequest + (*SearchNamespacesByClusterResponse)(nil), // 73: api.v1.SearchNamespacesByClusterResponse + (*ListNamespacesByClusterRequest)(nil), // 74: api.v1.ListNamespacesByClusterRequest + (*ListNamespacesByClusterResponse)(nil), // 75: api.v1.ListNamespacesByClusterResponse + (*NamespaceItem)(nil), // 76: api.v1.NamespaceItem + (*GetAllWorkloadNamesRequest)(nil), // 77: api.v1.GetAllWorkloadNamesRequest + (*GetAllWorkloadNamesResponse)(nil), // 78: api.v1.GetAllWorkloadNamesResponse + (*GetAllWorkloadLabelsRequest)(nil), // 79: api.v1.GetAllWorkloadLabelsRequest + (*GetAllWorkloadLabelsResponse)(nil), // 80: api.v1.GetAllWorkloadLabelsResponse + (*GetAllNodeGroupNamesRequest)(nil), // 81: api.v1.GetAllNodeGroupNamesRequest + (*GetAllNodeGroupNamesResponse)(nil), // 82: api.v1.GetAllNodeGroupNamesResponse + (*Cluster)(nil), // 83: api.v1.Cluster + (*OperatorInfo)(nil), // 84: api.v1.OperatorInfo + (*Container)(nil), // 85: api.v1.Container + (*GetLatestOperatorVersionRequest)(nil), // 86: api.v1.GetLatestOperatorVersionRequest + (*GetLatestOperatorVersionResponse)(nil), // 87: api.v1.GetLatestOperatorVersionResponse + (*GalaxyGetWorkloadPerspectiveRequest)(nil), // 88: api.v1.GalaxyGetWorkloadPerspectiveRequest + (*GalaxyGetWorkloadPerspectiveResponse)(nil), // 89: api.v1.GalaxyGetWorkloadPerspectiveResponse + (*GalaxyWorkloadGroup)(nil), // 90: api.v1.GalaxyWorkloadGroup + (*PerspectiveDatapointOpts)(nil), // 91: api.v1.PerspectiveDatapointOpts + (*ListAuditLogsRequest)(nil), // 92: api.v1.ListAuditLogsRequest + (*ListAuditLogsResponse)(nil), // 93: api.v1.ListAuditLogsResponse + (*ListAuditLogOriginatorsRequest)(nil), // 94: api.v1.ListAuditLogOriginatorsRequest + (*ListAuditLogOriginatorsResponse)(nil), // 95: api.v1.ListAuditLogOriginatorsResponse + (*SendWorkloadEmailRequest)(nil), // 96: api.v1.SendWorkloadEmailRequest + (*SendWorkloadEmailResponse)(nil), // 97: api.v1.SendWorkloadEmailResponse + (*SendWeeklySummaryEmailRequest)(nil), // 98: api.v1.SendWeeklySummaryEmailRequest + (*SendWeeklySummaryEmailRequestData)(nil), // 99: api.v1.SendWeeklySummaryEmailRequestData + (*SendWeeklySummaryEmailResponse)(nil), // 100: api.v1.SendWeeklySummaryEmailResponse + (*GetClustersNodeInfoRequest)(nil), // 101: api.v1.GetClustersNodeInfoRequest + (*GetClustersNodeInfoResponse)(nil), // 102: api.v1.GetClustersNodeInfoResponse + (*SearchK8SResourcesRequest)(nil), // 103: api.v1.SearchK8sResourcesRequest + (*SearchK8SResourcesResponse)(nil), // 104: api.v1.SearchK8sResourcesResponse + (*K8SSearchResult)(nil), // 105: api.v1.K8sSearchResult + (*SearchK8SWorkloadsRequest)(nil), // 106: api.v1.SearchK8sWorkloadsRequest + (*SearchK8SWorkloadsResponse)(nil), // 107: api.v1.SearchK8sWorkloadsResponse + (*K8SWorkloadSearchResult)(nil), // 108: api.v1.K8sWorkloadSearchResult + (*MetadataForWorkloadsRequest)(nil), // 109: api.v1.MetadataForWorkloadsRequest + (*MetadataForWorkloadsResponse)(nil), // 110: api.v1.MetadataForWorkloadsResponse + (*AddClusterTagsRequest)(nil), // 111: api.v1.AddClusterTagsRequest + (*AddClusterTagsResponse)(nil), // 112: api.v1.AddClusterTagsResponse + (*RemoveClusterTagsRequest)(nil), // 113: api.v1.RemoveClusterTagsRequest + (*RemoveClusterTagsResponse)(nil), // 114: api.v1.RemoveClusterTagsResponse + (*ListTagsRequest)(nil), // 115: api.v1.ListTagsRequest + (*TagSummary)(nil), // 116: api.v1.TagSummary + (*ListTagsResponse)(nil), // 117: api.v1.ListTagsResponse + (*WorkloadMetadata)(nil), // 118: api.v1.WorkloadMetadata + (*PodMetadata)(nil), // 119: api.v1.PodMetadata + (*NodeMetadata)(nil), // 120: api.v1.NodeMetadata + (*GetRelatedResourcesRequest)(nil), // 121: api.v1.GetRelatedResourcesRequest + (*GetWorkloadPodHistoryResponse)(nil), // 122: api.v1.GetWorkloadPodHistoryResponse + (*JobHistory)(nil), // 123: api.v1.JobHistory + (*ReplicaSetHistory)(nil), // 124: api.v1.ReplicaSetHistory + (*PodHistory)(nil), // 125: api.v1.PodHistory + (*GetRelatedResourcesResponse)(nil), // 126: api.v1.GetRelatedResourcesResponse + (*K8SRelatedResource)(nil), // 127: api.v1.K8sRelatedResource + (*K8SResourceNode)(nil), // 128: api.v1.K8sResourceNode + (*K8SResourceEdge)(nil), // 129: api.v1.K8sResourceEdge + (*GetClusterTypeRequest)(nil), // 130: api.v1.GetClusterTypeRequest + (*GetClusterTypeResponse)(nil), // 131: api.v1.GetClusterTypeResponse + (*GetMigPartedConfigRequest)(nil), // 132: api.v1.GetMigPartedConfigRequest + (*GetMigPartedConfigResponse)(nil), // 133: api.v1.GetMigPartedConfigResponse + (*GetWorkloadsStatsRequest)(nil), // 134: api.v1.GetWorkloadsStatsRequest + (*GetWorkloadsStatsResponse)(nil), // 135: api.v1.GetWorkloadsStatsResponse + (*DailyUtilizationRequest)(nil), // 136: api.v1.DailyUtilizationRequest + (*DailyUtilizationResponse)(nil), // 137: api.v1.DailyUtilizationResponse + (*DailyUtilizationInstanceTypeRequest)(nil), // 138: api.v1.DailyUtilizationInstanceTypeRequest + (*DailyUtilizationInstanceTypeResponse)(nil), // 139: api.v1.DailyUtilizationInstanceTypeResponse + (*DailyUtilizationNodeTypeRequest)(nil), // 140: api.v1.DailyUtilizationNodeTypeRequest + (*DailyUtilizationNodeTypeResponse)(nil), // 141: api.v1.DailyUtilizationNodeTypeResponse + (*LookupNodeInstanceRequest)(nil), // 142: api.v1.LookupNodeInstanceRequest + (*InstanceLookupParams)(nil), // 143: api.v1.InstanceLookupParams + (*LookupNodeInstanceResponse)(nil), // 144: api.v1.LookupNodeInstanceResponse + nil, // 145: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry + (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics)(nil), // 146: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + nil, // 147: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry + nil, // 148: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry + nil, // 149: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry + nil, // 150: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry + nil, // 151: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry + nil, // 152: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry + nil, // 153: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry + nil, // 154: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry + nil, // 155: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry + nil, // 156: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry + (*DailyUtilizationResponse_Datapoints)(nil), // 157: api.v1.DailyUtilizationResponse.Datapoints + (*DailyUtilizationResponse_Datapoint)(nil), // 158: api.v1.DailyUtilizationResponse.Datapoint + nil, // 159: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry + nil, // 160: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry + (*DailyUtilizationInstanceTypeResponse_Datapoints)(nil), // 161: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints + (*DailyUtilizationInstanceTypeResponse_Datapoint)(nil), // 162: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint + nil, // 163: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry + nil, // 164: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry + nil, // 165: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry + (*DailyUtilizationNodeTypeResponse_Datapoints)(nil), // 166: api.v1.DailyUtilizationNodeTypeResponse.Datapoints + (*DailyUtilizationNodeTypeResponse_Datapoint)(nil), // 167: api.v1.DailyUtilizationNodeTypeResponse.Datapoint + nil, // 168: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry + nil, // 169: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry + nil, // 170: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry + (*timestamppb.Timestamp)(nil), // 171: google.protobuf.Timestamp + (*WorkloadFilters)(nil), // 172: api.v1.WorkloadFilters + (*WorkloadItem)(nil), // 173: api.v1.WorkloadItem + (K8SObjectKind)(0), // 174: api.v1.K8sObjectKind + (*Pagination)(nil), // 175: api.v1.Pagination + (*ResourceFieldFilter)(nil), // 176: api.v1.ResourceFieldFilter + (*ResourceFilterFieldOptions)(nil), // 177: api.v1.ResourceFilterFieldOptions + (*NodeGroup)(nil), // 178: api.v1.NodeGroup + (*money.Money)(nil), // 179: google.type.Money + (*ResourceMetrics)(nil), // 180: api.v1.ResourceMetrics + (*CostInfo)(nil), // 181: api.v1.CostInfo + (*NodeInfo)(nil), // 182: api.v1.NodeInfo + (*CostDataPoint)(nil), // 183: api.v1.CostDataPoint + (*ResourceDataPoint)(nil), // 184: api.v1.ResourceDataPoint + (*Node)(nil), // 185: api.v1.Node + (*ResourceSummary)(nil), // 186: api.v1.ResourceSummary + (*ContainerPercentileSummary)(nil), // 187: api.v1.ContainerPercentileSummary + (*ContainerTimeSeries)(nil), // 188: api.v1.ContainerTimeSeries + (*ContainerRequestLimits)(nil), // 189: api.v1.ContainerRequestLimits + (*GPUMigInstance)(nil), // 190: api.v1.GPUMigInstance + (*ContainerIndividualGPUMetrics)(nil), // 191: api.v1.ContainerIndividualGPUMetrics + (*ForecastResourceMetrics)(nil), // 192: api.v1.ForecastResourceMetrics + (*AuditLogEntry)(nil), // 193: api.v1.AuditLogEntry + (*Instance)(nil), // 194: api.v1.Instance } var file_api_v1_k8s_proto_depIdxs = []int32{ - 150, // 0: api.v1.GetNodeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 1: api.v1.GetNodeRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 2: api.v1.GetWorkloadPodHistoryRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 3: api.v1.GetWorkloadPodHistoryRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 4: api.v1.GetNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 5: api.v1.GetNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 6: api.v1.GetWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 7: api.v1.GetWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp - 151, // 8: api.v1.GetWorkloadsRequest.filters:type_name -> api.v1.WorkloadFilters - 152, // 9: api.v1.GetResourcesRequest.kind:type_name -> api.v1.K8sObjectKind - 153, // 10: api.v1.GetResourcesRequest.pagination:type_name -> api.v1.Pagination - 153, // 11: api.v1.GetPodsRequest.pagination:type_name -> api.v1.Pagination - 150, // 12: api.v1.GetPodsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 13: api.v1.GetPodsRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 14: api.v1.GetPodsResponse.workload_items:type_name -> api.v1.WorkloadItem - 153, // 15: api.v1.GetPodsResponse.pagination:type_name -> api.v1.Pagination - 150, // 16: api.v1.GetWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 17: api.v1.GetWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 18: api.v1.GetClustersRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 19: api.v1.GetClustersRequest.end_time:type_name -> google.protobuf.Timestamp - 153, // 20: api.v1.ListClustersRequest.pagination:type_name -> api.v1.Pagination - 150, // 21: api.v1.GetClusterRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 22: api.v1.GetClusterRequest.end_time:type_name -> google.protobuf.Timestamp - 64, // 23: api.v1.UpdateClusterResponse.cluster:type_name -> api.v1.Cluster - 154, // 24: api.v1.GetResourcesResponse.workload_items:type_name -> api.v1.WorkloadItem - 153, // 25: api.v1.GetResourcesResponse.pagination:type_name -> api.v1.Pagination - 64, // 26: api.v1.CreateClusterResponse.cluster:type_name -> api.v1.Cluster - 150, // 27: api.v1.GetNodeGroupsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 28: api.v1.GetNodeGroupsRequest.end_time:type_name -> google.protobuf.Timestamp - 155, // 29: api.v1.GetNodeGroupsResponse.node_groups:type_name -> api.v1.NodeGroup - 124, // 30: api.v1.GetAllNodeGroupsResponse.node_group_map:type_name -> api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry - 155, // 31: api.v1.NodeGroupSet.node_groups:type_name -> api.v1.NodeGroup - 150, // 32: api.v1.GetNodeGroupsUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 33: api.v1.GetNodeGroupsUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp - 126, // 34: api.v1.GetNodeGroupsUtilizationResponse.node_group_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry - 127, // 35: api.v1.GetNodeGroupsUtilizationResponse.instance_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry - 128, // 36: api.v1.GetNodeGroupsUtilizationResponse.reservation_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry - 129, // 37: api.v1.GetNodeGroupsUtilizationResponse.logical_az_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry - 156, // 38: api.v1.NodeGroupMetric.hourly_cost:type_name -> google.type.Money - 156, // 39: api.v1.NodeGroupMetric.hourly_cpu_cost:type_name -> google.type.Money - 156, // 40: api.v1.NodeGroupMetric.hourly_memory_cost:type_name -> google.type.Money - 156, // 41: api.v1.NodeGroupMetric.hourly_gpu_cost:type_name -> google.type.Money - 150, // 42: api.v1.NodeGroupMetric.bucket_time:type_name -> google.protobuf.Timestamp - 155, // 43: api.v1.GetNodeGroupResponse.node_group:type_name -> api.v1.NodeGroup - 64, // 44: api.v1.GetClusterResponse.cluster:type_name -> api.v1.Cluster - 64, // 45: api.v1.GetClustersResponse.clusters:type_name -> api.v1.Cluster - 157, // 46: api.v1.GetClustersResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 47: api.v1.GetClustersResponse.cost_info:type_name -> api.v1.CostInfo - 159, // 48: api.v1.GetClustersResponse.node_info:type_name -> api.v1.NodeInfo - 160, // 49: api.v1.GetClustersResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 50: api.v1.GetClustersResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 64, // 51: api.v1.ListClustersResponse.clusters:type_name -> api.v1.Cluster - 153, // 52: api.v1.ListClustersResponse.pagination:type_name -> api.v1.Pagination - 162, // 53: api.v1.GetNodeResponse.node:type_name -> api.v1.Node - 157, // 54: api.v1.GetNodeResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 55: api.v1.GetNodeResponse.cost_info:type_name -> api.v1.CostInfo - 160, // 56: api.v1.GetNodeResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 57: api.v1.GetNodeResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 154, // 58: api.v1.GetWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem - 158, // 59: api.v1.GetWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo - 157, // 60: api.v1.GetWorkloadsResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 61: api.v1.GetWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary - 154, // 62: api.v1.GetWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem - 158, // 63: api.v1.GetWorkloadResponse.cost_info:type_name -> api.v1.CostInfo - 157, // 64: api.v1.GetWorkloadResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 65: api.v1.GetWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary - 160, // 66: api.v1.GetWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 67: api.v1.GetWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 150, // 68: api.v1.GetWorkloadContainerPercentilesRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 69: api.v1.GetWorkloadContainerPercentilesRequest.end_time:type_name -> google.protobuf.Timestamp - 164, // 70: api.v1.GetWorkloadContainerPercentilesResponse.containers:type_name -> api.v1.ContainerPercentileSummary - 150, // 71: api.v1.GetWorkloadContainerTimeSeriesRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 72: api.v1.GetWorkloadContainerTimeSeriesRequest.end_time:type_name -> google.protobuf.Timestamp - 165, // 73: api.v1.GetWorkloadContainerTimeSeriesResponse.containers:type_name -> api.v1.ContainerTimeSeries - 166, // 74: api.v1.GetLatestContainerRequestLimitsResponse.containers:type_name -> api.v1.ContainerRequestLimits - 150, // 75: api.v1.GetForecastWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 76: api.v1.GetForecastWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 77: api.v1.GetForecastWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem - 158, // 78: api.v1.GetForecastWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo - 167, // 79: api.v1.GetForecastWorkloadsResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics - 163, // 80: api.v1.GetForecastWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary - 150, // 81: api.v1.GetForecastWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 82: api.v1.GetForecastWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 83: api.v1.GetForecastWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem - 158, // 84: api.v1.GetForecastWorkloadResponse.cost_info:type_name -> api.v1.CostInfo - 167, // 85: api.v1.GetForecastWorkloadResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics - 163, // 86: api.v1.GetForecastWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary - 160, // 87: api.v1.GetForecastWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 88: api.v1.GetForecastWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 64, // 89: api.v1.GetClusterMetadataResponse.clusters:type_name -> api.v1.Cluster - 50, // 90: api.v1.GetAllNamespacesResponse.cluster_id_with_namespaces:type_name -> api.v1.ClusterElement - 57, // 91: api.v1.ListNamespacesByClusterResponse.namespaces:type_name -> api.v1.NamespaceItem - 152, // 92: api.v1.GetAllWorkloadNamesRequest.kinds:type_name -> api.v1.K8sObjectKind - 50, // 93: api.v1.GetAllWorkloadNamesResponse.cluster_id_with_workload_name:type_name -> api.v1.ClusterElement - 152, // 94: api.v1.GetAllWorkloadLabelsRequest.kinds:type_name -> api.v1.K8sObjectKind - 50, // 95: api.v1.GetAllWorkloadLabelsResponse.cluster_id_with_labels:type_name -> api.v1.ClusterElement - 50, // 96: api.v1.GetAllNodeGroupNamesResponse.cluster_id_with_node_group_names:type_name -> api.v1.ClusterElement - 157, // 97: api.v1.Cluster.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 98: api.v1.Cluster.cost_info:type_name -> api.v1.CostInfo - 159, // 99: api.v1.Cluster.node_info:type_name -> api.v1.NodeInfo - 160, // 100: api.v1.Cluster.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 101: api.v1.Cluster.resource_data_points:type_name -> api.v1.ResourceDataPoint - 162, // 102: api.v1.Cluster.most_expensive_node:type_name -> api.v1.Node - 162, // 103: api.v1.Cluster.least_expensive_node:type_name -> api.v1.Node - 162, // 104: api.v1.Cluster.most_underutilized_node:type_name -> api.v1.Node - 66, // 105: api.v1.Cluster.most_underutilized_container:type_name -> api.v1.Container - 65, // 106: api.v1.Cluster.zxp_info:type_name -> api.v1.OperatorInfo - 65, // 107: api.v1.Cluster.zxp_helm_info:type_name -> api.v1.OperatorInfo - 65, // 108: api.v1.Cluster.dakr_op_info:type_name -> api.v1.OperatorInfo - 65, // 109: api.v1.Cluster.node_op_info:type_name -> api.v1.OperatorInfo - 65, // 110: api.v1.Cluster.security_op_info:type_name -> api.v1.OperatorInfo - 65, // 111: api.v1.Cluster.network_op_info:type_name -> api.v1.OperatorInfo - 157, // 112: api.v1.Container.resource_metrics:type_name -> api.v1.ResourceMetrics - 65, // 113: api.v1.GetLatestOperatorVersionResponse.zxp_info:type_name -> api.v1.OperatorInfo - 65, // 114: api.v1.GetLatestOperatorVersionResponse.zxp_helm_info:type_name -> api.v1.OperatorInfo - 65, // 115: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_info:type_name -> api.v1.OperatorInfo - 65, // 116: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_helm_info:type_name -> api.v1.OperatorInfo - 65, // 117: api.v1.GetLatestOperatorVersionResponse.dakr_op_info:type_name -> api.v1.OperatorInfo - 65, // 118: api.v1.GetLatestOperatorVersionResponse.dakr_op_helm_info:type_name -> api.v1.OperatorInfo - 65, // 119: api.v1.GetLatestOperatorVersionResponse.node_op_info_aws:type_name -> api.v1.OperatorInfo - 65, // 120: api.v1.GetLatestOperatorVersionResponse.node_op_info_azure:type_name -> api.v1.OperatorInfo - 65, // 121: api.v1.GetLatestOperatorVersionResponse.node_op_info_gcp:type_name -> api.v1.OperatorInfo - 65, // 122: api.v1.GetLatestOperatorVersionResponse.node_op_info_oci:type_name -> api.v1.OperatorInfo - 65, // 123: api.v1.GetLatestOperatorVersionResponse.security_op_info:type_name -> api.v1.OperatorInfo - 65, // 124: api.v1.GetLatestOperatorVersionResponse.security_op_helm_info:type_name -> api.v1.OperatorInfo - 65, // 125: api.v1.GetLatestOperatorVersionResponse.trezr_info:type_name -> api.v1.OperatorInfo - 65, // 126: api.v1.GetLatestOperatorVersionResponse.trezr_helm_info:type_name -> api.v1.OperatorInfo - 1, // 127: api.v1.GalaxyGetWorkloadPerspectiveRequest.group_by:type_name -> api.v1.GalaxyPOVWorkloadGroupBy - 72, // 128: api.v1.GalaxyGetWorkloadPerspectiveRequest.datapoint_opts:type_name -> api.v1.PerspectiveDatapointOpts - 71, // 129: api.v1.GalaxyGetWorkloadPerspectiveResponse.groupings:type_name -> api.v1.GalaxyWorkloadGroup - 130, // 130: api.v1.GalaxyGetWorkloadPerspectiveResponse.clusters:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry - 131, // 131: api.v1.GalaxyGetWorkloadPerspectiveResponse.workloads:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry - 158, // 132: api.v1.GalaxyWorkloadGroup.cost_info:type_name -> api.v1.CostInfo - 157, // 133: api.v1.GalaxyWorkloadGroup.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 134: api.v1.GalaxyWorkloadGroup.resource_summary:type_name -> api.v1.ResourceSummary - 152, // 135: api.v1.ListAuditLogsRequest.workload_type:type_name -> api.v1.K8sObjectKind - 150, // 136: api.v1.ListAuditLogsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 137: api.v1.ListAuditLogsRequest.end_time:type_name -> google.protobuf.Timestamp - 153, // 138: api.v1.ListAuditLogsRequest.pagination:type_name -> api.v1.Pagination - 168, // 139: api.v1.ListAuditLogsResponse.logs:type_name -> api.v1.AuditLogEntry - 153, // 140: api.v1.ListAuditLogsResponse.pagination:type_name -> api.v1.Pagination - 152, // 141: api.v1.ListAuditLogOriginatorsRequest.workload_type:type_name -> api.v1.K8sObjectKind - 150, // 142: api.v1.ListAuditLogOriginatorsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 143: api.v1.ListAuditLogOriginatorsRequest.end_time:type_name -> google.protobuf.Timestamp - 80, // 144: api.v1.SendWeeklySummaryEmailRequest.request:type_name -> api.v1.SendWeeklySummaryEmailRequestData - 150, // 145: api.v1.GetClustersNodeInfoRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 146: api.v1.GetClustersNodeInfoRequest.end_time:type_name -> google.protobuf.Timestamp - 159, // 147: api.v1.GetClustersNodeInfoResponse.node_info:type_name -> api.v1.NodeInfo - 162, // 148: api.v1.GetClustersNodeInfoResponse.most_expensive_node:type_name -> api.v1.Node - 162, // 149: api.v1.GetClustersNodeInfoResponse.least_expensive_node:type_name -> api.v1.Node - 162, // 150: api.v1.GetClustersNodeInfoResponse.most_underutilized_node:type_name -> api.v1.Node - 86, // 151: api.v1.SearchK8sResourcesResponse.results:type_name -> api.v1.K8sSearchResult - 89, // 152: api.v1.SearchK8sWorkloadsResponse.results:type_name -> api.v1.K8sWorkloadSearchResult - 132, // 153: api.v1.MetadataForWorkloadsRequest.workload_uid_to_kind:type_name -> api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry - 133, // 154: api.v1.MetadataForWorkloadsResponse.workload_uid_to_metadata:type_name -> api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry - 64, // 155: api.v1.AddClusterTagsResponse.cluster:type_name -> api.v1.Cluster - 64, // 156: api.v1.RemoveClusterTagsResponse.cluster:type_name -> api.v1.Cluster - 97, // 157: api.v1.ListTagsResponse.tags:type_name -> api.v1.TagSummary - 134, // 158: api.v1.WorkloadMetadata.pod_uid_to_node_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry - 135, // 159: api.v1.WorkloadMetadata.pod_uid_to_pod_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToPodMetadataEntry - 152, // 160: api.v1.WorkloadMetadata.kind:type_name -> api.v1.K8sObjectKind - 152, // 161: api.v1.GetRelatedResourcesRequest.kind:type_name -> api.v1.K8sObjectKind - 105, // 162: api.v1.GetWorkloadPodHistoryResponse.replica_sets:type_name -> api.v1.ReplicaSetHistory - 106, // 163: api.v1.GetWorkloadPodHistoryResponse.direct_pods:type_name -> api.v1.PodHistory - 104, // 164: api.v1.GetWorkloadPodHistoryResponse.jobs:type_name -> api.v1.JobHistory - 150, // 165: api.v1.JobHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 166: api.v1.JobHistory.deleted_at:type_name -> google.protobuf.Timestamp - 106, // 167: api.v1.JobHistory.pods:type_name -> api.v1.PodHistory - 150, // 168: api.v1.ReplicaSetHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 169: api.v1.ReplicaSetHistory.deleted_at:type_name -> google.protobuf.Timestamp - 106, // 170: api.v1.ReplicaSetHistory.pods:type_name -> api.v1.PodHistory - 150, // 171: api.v1.PodHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 172: api.v1.PodHistory.deleted_at:type_name -> google.protobuf.Timestamp - 108, // 173: api.v1.GetRelatedResourcesResponse.relations:type_name -> api.v1.K8sRelatedResource - 109, // 174: api.v1.GetRelatedResourcesResponse.nodes:type_name -> api.v1.K8sResourceNode - 110, // 175: api.v1.GetRelatedResourcesResponse.edges:type_name -> api.v1.K8sResourceEdge - 2, // 176: api.v1.GetClusterTypeResponse.cluster_type:type_name -> api.v1.ClusterType - 150, // 177: api.v1.GetWorkloadsStatsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 178: api.v1.GetWorkloadsStatsRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 179: api.v1.DailyUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 180: api.v1.DailyUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp - 138, // 181: api.v1.DailyUtilizationResponse.cluster_id_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry - 139, // 182: api.v1.DailyUtilizationResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry - 150, // 183: api.v1.DailyUtilizationInstanceTypeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 184: api.v1.DailyUtilizationInstanceTypeRequest.end_time:type_name -> google.protobuf.Timestamp - 142, // 185: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry - 143, // 186: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry - 150, // 187: api.v1.DailyUtilizationNodeTypeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 188: api.v1.DailyUtilizationNodeTypeRequest.end_time:type_name -> google.protobuf.Timestamp - 147, // 189: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry - 148, // 190: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry - 169, // 191: api.v1.LookupNodeInstanceResponse.dynamic_instance:type_name -> api.v1.Instance - 169, // 192: api.v1.LookupNodeInstanceResponse.cached_instance:type_name -> api.v1.Instance - 122, // 193: api.v1.LookupNodeInstanceResponse.lookup_params:type_name -> api.v1.InstanceLookupParams - 155, // 194: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroup - 31, // 195: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics.node_group_metrics:type_name -> api.v1.NodeGroupMetric - 125, // 196: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 197: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 198: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 199: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 64, // 200: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry.value:type_name -> api.v1.Cluster - 154, // 201: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry.value:type_name -> api.v1.WorkloadItem - 152, // 202: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry.value:type_name -> api.v1.K8sObjectKind - 99, // 203: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry.value:type_name -> api.v1.WorkloadMetadata - 101, // 204: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry.value:type_name -> api.v1.NodeMetadata - 100, // 205: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry.value:type_name -> api.v1.PodMetadata - 137, // 206: api.v1.DailyUtilizationResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationResponse.Datapoint - 136, // 207: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry.value:type_name -> api.v1.DailyUtilizationResponse.Datapoints - 64, // 208: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 141, // 209: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint - 144, // 210: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.instance_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry - 140, // 211: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoints - 64, // 212: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 146, // 213: api.v1.DailyUtilizationNodeTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint - 149, // 214: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.node_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry - 145, // 215: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoints - 64, // 216: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 113, // 217: api.v1.K8SService.GetWorkloadsStats:input_type -> api.v1.GetWorkloadsStatsRequest - 12, // 218: api.v1.K8SService.GetClusters:input_type -> api.v1.GetClustersRequest - 13, // 219: api.v1.K8SService.ListClusters:input_type -> api.v1.ListClustersRequest - 14, // 220: api.v1.K8SService.GetCluster:input_type -> api.v1.GetClusterRequest - 5, // 221: api.v1.K8SService.GetClusterMetadata:input_type -> api.v1.GetClusterMetadataRequest - 51, // 222: api.v1.K8SService.GetAllNamespaces:input_type -> api.v1.GetAllNamespacesRequest - 53, // 223: api.v1.K8SService.SearchNamespacesByCluster:input_type -> api.v1.SearchNamespacesByClusterRequest - 55, // 224: api.v1.K8SService.ListNamespacesByCluster:input_type -> api.v1.ListNamespacesByClusterRequest - 58, // 225: api.v1.K8SService.GetAllWorkloadNames:input_type -> api.v1.GetAllWorkloadNamesRequest - 60, // 226: api.v1.K8SService.GetAllWorkloadLabels:input_type -> api.v1.GetAllWorkloadLabelsRequest - 62, // 227: api.v1.K8SService.GetAllNodeGroupNames:input_type -> api.v1.GetAllNodeGroupNamesRequest - 90, // 228: api.v1.K8SService.MetadataForWorkloads:input_type -> api.v1.MetadataForWorkloadsRequest - 24, // 229: api.v1.K8SService.GetNodeGroups:input_type -> api.v1.GetNodeGroupsRequest - 25, // 230: api.v1.K8SService.GetAllNodeGroups:input_type -> api.v1.GetAllNodeGroupsRequest - 29, // 231: api.v1.K8SService.GetNodeGroupsUtilization:input_type -> api.v1.GetNodeGroupsUtilizationRequest - 6, // 232: api.v1.K8SService.GetNodeGroup:input_type -> api.v1.GetNodeGroupRequest - 3, // 233: api.v1.K8SService.GetNode:input_type -> api.v1.GetNodeRequest - 7, // 234: api.v1.K8SService.GetWorkloads:input_type -> api.v1.GetWorkloadsRequest - 11, // 235: api.v1.K8SService.GetWorkload:input_type -> api.v1.GetWorkloadRequest - 39, // 236: api.v1.K8SService.GetWorkloadContainerPercentiles:input_type -> api.v1.GetWorkloadContainerPercentilesRequest - 41, // 237: api.v1.K8SService.GetWorkloadContainerTimeSeries:input_type -> api.v1.GetWorkloadContainerTimeSeriesRequest - 43, // 238: api.v1.K8SService.GetLatestContainerRequestLimits:input_type -> api.v1.GetLatestContainerRequestLimitsRequest - 45, // 239: api.v1.K8SService.GetForecastWorkloads:input_type -> api.v1.GetForecastWorkloadsRequest - 47, // 240: api.v1.K8SService.GetForecastWorkload:input_type -> api.v1.GetForecastWorkloadRequest - 8, // 241: api.v1.K8SService.GetResources:input_type -> api.v1.GetResourcesRequest - 9, // 242: api.v1.K8SService.GetPods:input_type -> api.v1.GetPodsRequest - 67, // 243: api.v1.K8SService.GetLatestOperatorVersion:input_type -> api.v1.GetLatestOperatorVersionRequest - 69, // 244: api.v1.K8SService.GalaxyGetWorkloadPerspective:input_type -> api.v1.GalaxyGetWorkloadPerspectiveRequest - 73, // 245: api.v1.K8SService.ListAuditLogs:input_type -> api.v1.ListAuditLogsRequest - 75, // 246: api.v1.K8SService.ListAuditLogOriginators:input_type -> api.v1.ListAuditLogOriginatorsRequest - 77, // 247: api.v1.K8SService.SendWorkloadEmail:input_type -> api.v1.SendWorkloadEmailRequest - 79, // 248: api.v1.K8SService.SendWeeklySummaryEmail:input_type -> api.v1.SendWeeklySummaryEmailRequest - 82, // 249: api.v1.K8SService.GetClustersNodeInfo:input_type -> api.v1.GetClustersNodeInfoRequest - 84, // 250: api.v1.K8SService.SearchK8sResources:input_type -> api.v1.SearchK8sResourcesRequest - 87, // 251: api.v1.K8SService.SearchK8sWorkloads:input_type -> api.v1.SearchK8sWorkloadsRequest - 111, // 252: api.v1.K8SService.GetClusterType:input_type -> api.v1.GetClusterTypeRequest - 102, // 253: api.v1.K8SService.GetRelationsForKind:input_type -> api.v1.GetRelatedResourcesRequest - 121, // 254: api.v1.K8SService.LookupNodeInstance:input_type -> api.v1.LookupNodeInstanceRequest - 4, // 255: api.v1.K8SService.GetWorkloadPodHistory:input_type -> api.v1.GetWorkloadPodHistoryRequest - 92, // 256: api.v1.K8SService.AddClusterTags:input_type -> api.v1.AddClusterTagsRequest - 94, // 257: api.v1.K8SService.RemoveClusterTags:input_type -> api.v1.RemoveClusterTagsRequest - 96, // 258: api.v1.K8SService.ListTags:input_type -> api.v1.ListTagsRequest - 20, // 259: api.v1.ClusterMutationService.CreateCluster:input_type -> api.v1.CreateClusterRequest - 15, // 260: api.v1.ClusterMutationService.DeleteCluster:input_type -> api.v1.DeleteClusterRequest - 17, // 261: api.v1.ClusterMutationService.UpdateCluster:input_type -> api.v1.UpdateClusterRequest - 22, // 262: api.v1.ClusterMutationService.ResetClusterToken:input_type -> api.v1.ResetClusterTokenRequest - 115, // 263: api.v1.UtilizationService.DailyUtilization:input_type -> api.v1.DailyUtilizationRequest - 117, // 264: api.v1.UtilizationService.DailyUtilizationInstanceType:input_type -> api.v1.DailyUtilizationInstanceTypeRequest - 119, // 265: api.v1.UtilizationService.DailyUtilizationNodeType:input_type -> api.v1.DailyUtilizationNodeTypeRequest - 114, // 266: api.v1.K8SService.GetWorkloadsStats:output_type -> api.v1.GetWorkloadsStatsResponse - 34, // 267: api.v1.K8SService.GetClusters:output_type -> api.v1.GetClustersResponse - 35, // 268: api.v1.K8SService.ListClusters:output_type -> api.v1.ListClustersResponse - 33, // 269: api.v1.K8SService.GetCluster:output_type -> api.v1.GetClusterResponse - 49, // 270: api.v1.K8SService.GetClusterMetadata:output_type -> api.v1.GetClusterMetadataResponse - 52, // 271: api.v1.K8SService.GetAllNamespaces:output_type -> api.v1.GetAllNamespacesResponse - 54, // 272: api.v1.K8SService.SearchNamespacesByCluster:output_type -> api.v1.SearchNamespacesByClusterResponse - 56, // 273: api.v1.K8SService.ListNamespacesByCluster:output_type -> api.v1.ListNamespacesByClusterResponse - 59, // 274: api.v1.K8SService.GetAllWorkloadNames:output_type -> api.v1.GetAllWorkloadNamesResponse - 61, // 275: api.v1.K8SService.GetAllWorkloadLabels:output_type -> api.v1.GetAllWorkloadLabelsResponse - 63, // 276: api.v1.K8SService.GetAllNodeGroupNames:output_type -> api.v1.GetAllNodeGroupNamesResponse - 91, // 277: api.v1.K8SService.MetadataForWorkloads:output_type -> api.v1.MetadataForWorkloadsResponse - 26, // 278: api.v1.K8SService.GetNodeGroups:output_type -> api.v1.GetNodeGroupsResponse - 27, // 279: api.v1.K8SService.GetAllNodeGroups:output_type -> api.v1.GetAllNodeGroupsResponse - 30, // 280: api.v1.K8SService.GetNodeGroupsUtilization:output_type -> api.v1.GetNodeGroupsUtilizationResponse - 32, // 281: api.v1.K8SService.GetNodeGroup:output_type -> api.v1.GetNodeGroupResponse - 36, // 282: api.v1.K8SService.GetNode:output_type -> api.v1.GetNodeResponse - 37, // 283: api.v1.K8SService.GetWorkloads:output_type -> api.v1.GetWorkloadsResponse - 38, // 284: api.v1.K8SService.GetWorkload:output_type -> api.v1.GetWorkloadResponse - 40, // 285: api.v1.K8SService.GetWorkloadContainerPercentiles:output_type -> api.v1.GetWorkloadContainerPercentilesResponse - 42, // 286: api.v1.K8SService.GetWorkloadContainerTimeSeries:output_type -> api.v1.GetWorkloadContainerTimeSeriesResponse - 44, // 287: api.v1.K8SService.GetLatestContainerRequestLimits:output_type -> api.v1.GetLatestContainerRequestLimitsResponse - 46, // 288: api.v1.K8SService.GetForecastWorkloads:output_type -> api.v1.GetForecastWorkloadsResponse - 48, // 289: api.v1.K8SService.GetForecastWorkload:output_type -> api.v1.GetForecastWorkloadResponse - 19, // 290: api.v1.K8SService.GetResources:output_type -> api.v1.GetResourcesResponse - 10, // 291: api.v1.K8SService.GetPods:output_type -> api.v1.GetPodsResponse - 68, // 292: api.v1.K8SService.GetLatestOperatorVersion:output_type -> api.v1.GetLatestOperatorVersionResponse - 70, // 293: api.v1.K8SService.GalaxyGetWorkloadPerspective:output_type -> api.v1.GalaxyGetWorkloadPerspectiveResponse - 74, // 294: api.v1.K8SService.ListAuditLogs:output_type -> api.v1.ListAuditLogsResponse - 76, // 295: api.v1.K8SService.ListAuditLogOriginators:output_type -> api.v1.ListAuditLogOriginatorsResponse - 78, // 296: api.v1.K8SService.SendWorkloadEmail:output_type -> api.v1.SendWorkloadEmailResponse - 81, // 297: api.v1.K8SService.SendWeeklySummaryEmail:output_type -> api.v1.SendWeeklySummaryEmailResponse - 83, // 298: api.v1.K8SService.GetClustersNodeInfo:output_type -> api.v1.GetClustersNodeInfoResponse - 85, // 299: api.v1.K8SService.SearchK8sResources:output_type -> api.v1.SearchK8sResourcesResponse - 88, // 300: api.v1.K8SService.SearchK8sWorkloads:output_type -> api.v1.SearchK8sWorkloadsResponse - 112, // 301: api.v1.K8SService.GetClusterType:output_type -> api.v1.GetClusterTypeResponse - 107, // 302: api.v1.K8SService.GetRelationsForKind:output_type -> api.v1.GetRelatedResourcesResponse - 123, // 303: api.v1.K8SService.LookupNodeInstance:output_type -> api.v1.LookupNodeInstanceResponse - 103, // 304: api.v1.K8SService.GetWorkloadPodHistory:output_type -> api.v1.GetWorkloadPodHistoryResponse - 93, // 305: api.v1.K8SService.AddClusterTags:output_type -> api.v1.AddClusterTagsResponse - 95, // 306: api.v1.K8SService.RemoveClusterTags:output_type -> api.v1.RemoveClusterTagsResponse - 98, // 307: api.v1.K8SService.ListTags:output_type -> api.v1.ListTagsResponse - 21, // 308: api.v1.ClusterMutationService.CreateCluster:output_type -> api.v1.CreateClusterResponse - 16, // 309: api.v1.ClusterMutationService.DeleteCluster:output_type -> api.v1.DeleteClusterResponse - 18, // 310: api.v1.ClusterMutationService.UpdateCluster:output_type -> api.v1.UpdateClusterResponse - 23, // 311: api.v1.ClusterMutationService.ResetClusterToken:output_type -> api.v1.ResetClusterTokenResponse - 116, // 312: api.v1.UtilizationService.DailyUtilization:output_type -> api.v1.DailyUtilizationResponse - 118, // 313: api.v1.UtilizationService.DailyUtilizationInstanceType:output_type -> api.v1.DailyUtilizationInstanceTypeResponse - 120, // 314: api.v1.UtilizationService.DailyUtilizationNodeType:output_type -> api.v1.DailyUtilizationNodeTypeResponse - 266, // [266:315] is the sub-list for method output_type - 217, // [217:266] is the sub-list for method input_type - 217, // [217:217] is the sub-list for extension type_name - 217, // [217:217] is the sub-list for extension extendee - 0, // [0:217] is the sub-list for field type_name + 171, // 0: api.v1.GetNodeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 1: api.v1.GetNodeRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 2: api.v1.GetWorkloadPodHistoryRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 3: api.v1.GetWorkloadPodHistoryRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 4: api.v1.GetNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 5: api.v1.GetNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 6: api.v1.GetWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 7: api.v1.GetWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 8: api.v1.GetWorkloadsRequest.filters:type_name -> api.v1.WorkloadFilters + 171, // 9: api.v1.ListWorkloadsPaginatedRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 10: api.v1.ListWorkloadsPaginatedRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 11: api.v1.ListWorkloadsPaginatedRequest.filters:type_name -> api.v1.WorkloadFilters + 171, // 12: api.v1.GetWorkloadsSummaryRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 13: api.v1.GetWorkloadsSummaryRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 14: api.v1.GetWorkloadsSummaryRequest.filters:type_name -> api.v1.WorkloadFilters + 10, // 15: api.v1.WorkloadMetricBreakdown.top_entries:type_name -> api.v1.WorkloadMetricEntry + 11, // 16: api.v1.GetWorkloadsSummaryResponse.cost:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 17: api.v1.GetWorkloadsSummaryResponse.cpu_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 18: api.v1.GetWorkloadsSummaryResponse.memory_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 19: api.v1.GetWorkloadsSummaryResponse.gpu_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 20: api.v1.GetWorkloadsSummaryResponse.optimization_potential_cost:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 21: api.v1.GetWorkloadsSummaryResponse.optimization_potential_cpu:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 22: api.v1.GetWorkloadsSummaryResponse.optimization_potential_memory:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 23: api.v1.GetWorkloadsSummaryResponse.optimization_potential_gpu:type_name -> api.v1.WorkloadMetricBreakdown + 173, // 24: api.v1.ListWorkloadsPaginatedResponse.workload_items:type_name -> api.v1.WorkloadItem + 174, // 25: api.v1.GetResourcesRequest.kind:type_name -> api.v1.K8sObjectKind + 175, // 26: api.v1.GetResourcesRequest.pagination:type_name -> api.v1.Pagination + 176, // 27: api.v1.GetResourcesRequest.filters:type_name -> api.v1.ResourceFieldFilter + 175, // 28: api.v1.GetPodsRequest.pagination:type_name -> api.v1.Pagination + 171, // 29: api.v1.GetPodsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 30: api.v1.GetPodsRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 31: api.v1.GetPodsResponse.workload_items:type_name -> api.v1.WorkloadItem + 175, // 32: api.v1.GetPodsResponse.pagination:type_name -> api.v1.Pagination + 171, // 33: api.v1.GetWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 34: api.v1.GetWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 35: api.v1.GetClustersRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 36: api.v1.GetClustersRequest.end_time:type_name -> google.protobuf.Timestamp + 175, // 37: api.v1.ListClustersRequest.pagination:type_name -> api.v1.Pagination + 171, // 38: api.v1.GetClusterRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 39: api.v1.GetClusterRequest.end_time:type_name -> google.protobuf.Timestamp + 83, // 40: api.v1.UpdateClusterResponse.cluster:type_name -> api.v1.Cluster + 173, // 41: api.v1.GetResourcesResponse.workload_items:type_name -> api.v1.WorkloadItem + 175, // 42: api.v1.GetResourcesResponse.pagination:type_name -> api.v1.Pagination + 174, // 43: api.v1.GetResourceFilterOptionsRequest.kind:type_name -> api.v1.K8sObjectKind + 177, // 44: api.v1.GetResourceFilterOptionsResponse.options:type_name -> api.v1.ResourceFilterFieldOptions + 83, // 45: api.v1.CreateClusterResponse.cluster:type_name -> api.v1.Cluster + 171, // 46: api.v1.GetNodeGroupsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 47: api.v1.GetNodeGroupsRequest.end_time:type_name -> google.protobuf.Timestamp + 178, // 48: api.v1.GetNodeGroupsResponse.node_groups:type_name -> api.v1.NodeGroup + 145, // 49: api.v1.GetAllNodeGroupsResponse.node_group_map:type_name -> api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry + 178, // 50: api.v1.NodeGroupSet.node_groups:type_name -> api.v1.NodeGroup + 171, // 51: api.v1.GetNodeGroupsUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 52: api.v1.GetNodeGroupsUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp + 147, // 53: api.v1.GetNodeGroupsUtilizationResponse.node_group_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry + 148, // 54: api.v1.GetNodeGroupsUtilizationResponse.instance_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry + 149, // 55: api.v1.GetNodeGroupsUtilizationResponse.reservation_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry + 150, // 56: api.v1.GetNodeGroupsUtilizationResponse.logical_az_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry + 179, // 57: api.v1.NodeGroupMetric.hourly_cost:type_name -> google.type.Money + 179, // 58: api.v1.NodeGroupMetric.hourly_cpu_cost:type_name -> google.type.Money + 179, // 59: api.v1.NodeGroupMetric.hourly_memory_cost:type_name -> google.type.Money + 179, // 60: api.v1.NodeGroupMetric.hourly_gpu_cost:type_name -> google.type.Money + 171, // 61: api.v1.NodeGroupMetric.bucket_time:type_name -> google.protobuf.Timestamp + 178, // 62: api.v1.GetNodeGroupResponse.node_group:type_name -> api.v1.NodeGroup + 83, // 63: api.v1.GetClusterResponse.cluster:type_name -> api.v1.Cluster + 83, // 64: api.v1.GetClustersResponse.clusters:type_name -> api.v1.Cluster + 180, // 65: api.v1.GetClustersResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 66: api.v1.GetClustersResponse.cost_info:type_name -> api.v1.CostInfo + 182, // 67: api.v1.GetClustersResponse.node_info:type_name -> api.v1.NodeInfo + 183, // 68: api.v1.GetClustersResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 69: api.v1.GetClustersResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 83, // 70: api.v1.ListClustersResponse.clusters:type_name -> api.v1.Cluster + 175, // 71: api.v1.ListClustersResponse.pagination:type_name -> api.v1.Pagination + 185, // 72: api.v1.GetNodeResponse.node:type_name -> api.v1.Node + 180, // 73: api.v1.GetNodeResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 74: api.v1.GetNodeResponse.cost_info:type_name -> api.v1.CostInfo + 183, // 75: api.v1.GetNodeResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 76: api.v1.GetNodeResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 173, // 77: api.v1.GetWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem + 181, // 78: api.v1.GetWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo + 180, // 79: api.v1.GetWorkloadsResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 80: api.v1.GetWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary + 173, // 81: api.v1.GetWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem + 181, // 82: api.v1.GetWorkloadResponse.cost_info:type_name -> api.v1.CostInfo + 180, // 83: api.v1.GetWorkloadResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 84: api.v1.GetWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary + 183, // 85: api.v1.GetWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 86: api.v1.GetWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 171, // 87: api.v1.GetWorkloadContainerPercentilesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 88: api.v1.GetWorkloadContainerPercentilesRequest.end_time:type_name -> google.protobuf.Timestamp + 187, // 89: api.v1.GetWorkloadContainerPercentilesResponse.containers:type_name -> api.v1.ContainerPercentileSummary + 171, // 90: api.v1.GetWorkloadContainerTimeSeriesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 91: api.v1.GetWorkloadContainerTimeSeriesRequest.end_time:type_name -> google.protobuf.Timestamp + 188, // 92: api.v1.GetWorkloadContainerTimeSeriesResponse.containers:type_name -> api.v1.ContainerTimeSeries + 189, // 93: api.v1.GetLatestContainerRequestLimitsResponse.containers:type_name -> api.v1.ContainerRequestLimits + 190, // 94: api.v1.GetNodeGPUMigInstancesResponse.instances:type_name -> api.v1.GPUMigInstance + 171, // 95: api.v1.GetNodeGPUMigInstancesResponse.collected_at:type_name -> google.protobuf.Timestamp + 171, // 96: api.v1.GetNodeGPUMigInstanceTimeseriesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 97: api.v1.GetNodeGPUMigInstanceTimeseriesRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 98: api.v1.GPUMigInstanceDataPoint.timestamp:type_name -> google.protobuf.Timestamp + 56, // 99: api.v1.GPUMigInstanceTimeseries.points:type_name -> api.v1.GPUMigInstanceDataPoint + 57, // 100: api.v1.GetNodeGPUMigInstanceTimeseriesResponse.instances:type_name -> api.v1.GPUMigInstanceTimeseries + 191, // 101: api.v1.GetContainerIndividualGPUMetricsResponse.containers:type_name -> api.v1.ContainerIndividualGPUMetrics + 61, // 102: api.v1.GetWorkloadLanguagesResponse.languages:type_name -> api.v1.LanguageVersions + 171, // 103: api.v1.GetForecastWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 104: api.v1.GetForecastWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 105: api.v1.GetForecastWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem + 181, // 106: api.v1.GetForecastWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo + 192, // 107: api.v1.GetForecastWorkloadsResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics + 186, // 108: api.v1.GetForecastWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary + 171, // 109: api.v1.GetForecastWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 110: api.v1.GetForecastWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 111: api.v1.GetForecastWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem + 181, // 112: api.v1.GetForecastWorkloadResponse.cost_info:type_name -> api.v1.CostInfo + 192, // 113: api.v1.GetForecastWorkloadResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics + 186, // 114: api.v1.GetForecastWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary + 183, // 115: api.v1.GetForecastWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 116: api.v1.GetForecastWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 83, // 117: api.v1.GetClusterMetadataResponse.clusters:type_name -> api.v1.Cluster + 69, // 118: api.v1.GetAllNamespacesResponse.cluster_id_with_namespaces:type_name -> api.v1.ClusterElement + 76, // 119: api.v1.ListNamespacesByClusterResponse.namespaces:type_name -> api.v1.NamespaceItem + 174, // 120: api.v1.GetAllWorkloadNamesRequest.kinds:type_name -> api.v1.K8sObjectKind + 69, // 121: api.v1.GetAllWorkloadNamesResponse.cluster_id_with_workload_name:type_name -> api.v1.ClusterElement + 174, // 122: api.v1.GetAllWorkloadLabelsRequest.kinds:type_name -> api.v1.K8sObjectKind + 69, // 123: api.v1.GetAllWorkloadLabelsResponse.cluster_id_with_labels:type_name -> api.v1.ClusterElement + 69, // 124: api.v1.GetAllNodeGroupNamesResponse.cluster_id_with_node_group_names:type_name -> api.v1.ClusterElement + 180, // 125: api.v1.Cluster.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 126: api.v1.Cluster.cost_info:type_name -> api.v1.CostInfo + 182, // 127: api.v1.Cluster.node_info:type_name -> api.v1.NodeInfo + 183, // 128: api.v1.Cluster.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 129: api.v1.Cluster.resource_data_points:type_name -> api.v1.ResourceDataPoint + 185, // 130: api.v1.Cluster.most_expensive_node:type_name -> api.v1.Node + 185, // 131: api.v1.Cluster.least_expensive_node:type_name -> api.v1.Node + 185, // 132: api.v1.Cluster.most_underutilized_node:type_name -> api.v1.Node + 85, // 133: api.v1.Cluster.most_underutilized_container:type_name -> api.v1.Container + 84, // 134: api.v1.Cluster.zxp_info:type_name -> api.v1.OperatorInfo + 84, // 135: api.v1.Cluster.zxp_helm_info:type_name -> api.v1.OperatorInfo + 84, // 136: api.v1.Cluster.dakr_op_info:type_name -> api.v1.OperatorInfo + 84, // 137: api.v1.Cluster.node_op_info:type_name -> api.v1.OperatorInfo + 84, // 138: api.v1.Cluster.security_op_info:type_name -> api.v1.OperatorInfo + 84, // 139: api.v1.Cluster.network_op_info:type_name -> api.v1.OperatorInfo + 180, // 140: api.v1.Container.resource_metrics:type_name -> api.v1.ResourceMetrics + 84, // 141: api.v1.GetLatestOperatorVersionResponse.zxp_info:type_name -> api.v1.OperatorInfo + 84, // 142: api.v1.GetLatestOperatorVersionResponse.zxp_helm_info:type_name -> api.v1.OperatorInfo + 84, // 143: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_info:type_name -> api.v1.OperatorInfo + 84, // 144: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_helm_info:type_name -> api.v1.OperatorInfo + 84, // 145: api.v1.GetLatestOperatorVersionResponse.dakr_op_info:type_name -> api.v1.OperatorInfo + 84, // 146: api.v1.GetLatestOperatorVersionResponse.dakr_op_helm_info:type_name -> api.v1.OperatorInfo + 84, // 147: api.v1.GetLatestOperatorVersionResponse.node_op_info_aws:type_name -> api.v1.OperatorInfo + 84, // 148: api.v1.GetLatestOperatorVersionResponse.node_op_info_azure:type_name -> api.v1.OperatorInfo + 84, // 149: api.v1.GetLatestOperatorVersionResponse.node_op_info_gcp:type_name -> api.v1.OperatorInfo + 84, // 150: api.v1.GetLatestOperatorVersionResponse.node_op_info_oci:type_name -> api.v1.OperatorInfo + 84, // 151: api.v1.GetLatestOperatorVersionResponse.security_op_info:type_name -> api.v1.OperatorInfo + 84, // 152: api.v1.GetLatestOperatorVersionResponse.security_op_helm_info:type_name -> api.v1.OperatorInfo + 84, // 153: api.v1.GetLatestOperatorVersionResponse.trezr_info:type_name -> api.v1.OperatorInfo + 84, // 154: api.v1.GetLatestOperatorVersionResponse.trezr_helm_info:type_name -> api.v1.OperatorInfo + 84, // 155: api.v1.GetLatestOperatorVersionResponse.snapshot_helm_info:type_name -> api.v1.OperatorInfo + 1, // 156: api.v1.GalaxyGetWorkloadPerspectiveRequest.group_by:type_name -> api.v1.GalaxyPOVWorkloadGroupBy + 91, // 157: api.v1.GalaxyGetWorkloadPerspectiveRequest.datapoint_opts:type_name -> api.v1.PerspectiveDatapointOpts + 90, // 158: api.v1.GalaxyGetWorkloadPerspectiveResponse.groupings:type_name -> api.v1.GalaxyWorkloadGroup + 151, // 159: api.v1.GalaxyGetWorkloadPerspectiveResponse.clusters:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry + 152, // 160: api.v1.GalaxyGetWorkloadPerspectiveResponse.workloads:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry + 181, // 161: api.v1.GalaxyWorkloadGroup.cost_info:type_name -> api.v1.CostInfo + 180, // 162: api.v1.GalaxyWorkloadGroup.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 163: api.v1.GalaxyWorkloadGroup.resource_summary:type_name -> api.v1.ResourceSummary + 174, // 164: api.v1.ListAuditLogsRequest.workload_type:type_name -> api.v1.K8sObjectKind + 171, // 165: api.v1.ListAuditLogsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 166: api.v1.ListAuditLogsRequest.end_time:type_name -> google.protobuf.Timestamp + 175, // 167: api.v1.ListAuditLogsRequest.pagination:type_name -> api.v1.Pagination + 193, // 168: api.v1.ListAuditLogsResponse.logs:type_name -> api.v1.AuditLogEntry + 175, // 169: api.v1.ListAuditLogsResponse.pagination:type_name -> api.v1.Pagination + 174, // 170: api.v1.ListAuditLogOriginatorsRequest.workload_type:type_name -> api.v1.K8sObjectKind + 171, // 171: api.v1.ListAuditLogOriginatorsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 172: api.v1.ListAuditLogOriginatorsRequest.end_time:type_name -> google.protobuf.Timestamp + 99, // 173: api.v1.SendWeeklySummaryEmailRequest.request:type_name -> api.v1.SendWeeklySummaryEmailRequestData + 171, // 174: api.v1.GetClustersNodeInfoRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 175: api.v1.GetClustersNodeInfoRequest.end_time:type_name -> google.protobuf.Timestamp + 182, // 176: api.v1.GetClustersNodeInfoResponse.node_info:type_name -> api.v1.NodeInfo + 185, // 177: api.v1.GetClustersNodeInfoResponse.most_expensive_node:type_name -> api.v1.Node + 185, // 178: api.v1.GetClustersNodeInfoResponse.least_expensive_node:type_name -> api.v1.Node + 185, // 179: api.v1.GetClustersNodeInfoResponse.most_underutilized_node:type_name -> api.v1.Node + 105, // 180: api.v1.SearchK8sResourcesResponse.results:type_name -> api.v1.K8sSearchResult + 108, // 181: api.v1.SearchK8sWorkloadsResponse.results:type_name -> api.v1.K8sWorkloadSearchResult + 153, // 182: api.v1.MetadataForWorkloadsRequest.workload_uid_to_kind:type_name -> api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry + 154, // 183: api.v1.MetadataForWorkloadsResponse.workload_uid_to_metadata:type_name -> api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry + 83, // 184: api.v1.AddClusterTagsResponse.cluster:type_name -> api.v1.Cluster + 83, // 185: api.v1.RemoveClusterTagsResponse.cluster:type_name -> api.v1.Cluster + 116, // 186: api.v1.ListTagsResponse.tags:type_name -> api.v1.TagSummary + 155, // 187: api.v1.WorkloadMetadata.pod_uid_to_node_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry + 156, // 188: api.v1.WorkloadMetadata.pod_uid_to_pod_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToPodMetadataEntry + 174, // 189: api.v1.WorkloadMetadata.kind:type_name -> api.v1.K8sObjectKind + 174, // 190: api.v1.GetRelatedResourcesRequest.kind:type_name -> api.v1.K8sObjectKind + 124, // 191: api.v1.GetWorkloadPodHistoryResponse.replica_sets:type_name -> api.v1.ReplicaSetHistory + 125, // 192: api.v1.GetWorkloadPodHistoryResponse.direct_pods:type_name -> api.v1.PodHistory + 123, // 193: api.v1.GetWorkloadPodHistoryResponse.jobs:type_name -> api.v1.JobHistory + 171, // 194: api.v1.JobHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 195: api.v1.JobHistory.deleted_at:type_name -> google.protobuf.Timestamp + 125, // 196: api.v1.JobHistory.pods:type_name -> api.v1.PodHistory + 171, // 197: api.v1.ReplicaSetHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 198: api.v1.ReplicaSetHistory.deleted_at:type_name -> google.protobuf.Timestamp + 125, // 199: api.v1.ReplicaSetHistory.pods:type_name -> api.v1.PodHistory + 171, // 200: api.v1.PodHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 201: api.v1.PodHistory.deleted_at:type_name -> google.protobuf.Timestamp + 127, // 202: api.v1.GetRelatedResourcesResponse.relations:type_name -> api.v1.K8sRelatedResource + 128, // 203: api.v1.GetRelatedResourcesResponse.nodes:type_name -> api.v1.K8sResourceNode + 129, // 204: api.v1.GetRelatedResourcesResponse.edges:type_name -> api.v1.K8sResourceEdge + 2, // 205: api.v1.GetClusterTypeResponse.cluster_type:type_name -> api.v1.ClusterType + 171, // 206: api.v1.GetMigPartedConfigResponse.last_seen:type_name -> google.protobuf.Timestamp + 171, // 207: api.v1.GetWorkloadsStatsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 208: api.v1.GetWorkloadsStatsRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 209: api.v1.DailyUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 210: api.v1.DailyUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp + 159, // 211: api.v1.DailyUtilizationResponse.cluster_id_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry + 160, // 212: api.v1.DailyUtilizationResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry + 171, // 213: api.v1.DailyUtilizationInstanceTypeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 214: api.v1.DailyUtilizationInstanceTypeRequest.end_time:type_name -> google.protobuf.Timestamp + 163, // 215: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry + 164, // 216: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry + 171, // 217: api.v1.DailyUtilizationNodeTypeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 218: api.v1.DailyUtilizationNodeTypeRequest.end_time:type_name -> google.protobuf.Timestamp + 168, // 219: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry + 169, // 220: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry + 194, // 221: api.v1.LookupNodeInstanceResponse.dynamic_instance:type_name -> api.v1.Instance + 194, // 222: api.v1.LookupNodeInstanceResponse.cached_instance:type_name -> api.v1.Instance + 143, // 223: api.v1.LookupNodeInstanceResponse.lookup_params:type_name -> api.v1.InstanceLookupParams + 178, // 224: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroup + 39, // 225: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics.node_group_metrics:type_name -> api.v1.NodeGroupMetric + 146, // 226: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 227: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 228: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 229: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 83, // 230: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry.value:type_name -> api.v1.Cluster + 173, // 231: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry.value:type_name -> api.v1.WorkloadItem + 174, // 232: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry.value:type_name -> api.v1.K8sObjectKind + 118, // 233: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry.value:type_name -> api.v1.WorkloadMetadata + 120, // 234: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry.value:type_name -> api.v1.NodeMetadata + 119, // 235: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry.value:type_name -> api.v1.PodMetadata + 158, // 236: api.v1.DailyUtilizationResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationResponse.Datapoint + 157, // 237: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry.value:type_name -> api.v1.DailyUtilizationResponse.Datapoints + 83, // 238: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 162, // 239: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint + 165, // 240: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.instance_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry + 161, // 241: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoints + 83, // 242: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 167, // 243: api.v1.DailyUtilizationNodeTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint + 170, // 244: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.node_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry + 166, // 245: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoints + 83, // 246: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 134, // 247: api.v1.K8SService.GetWorkloadsStats:input_type -> api.v1.GetWorkloadsStatsRequest + 18, // 248: api.v1.K8SService.GetClusters:input_type -> api.v1.GetClustersRequest + 19, // 249: api.v1.K8SService.ListClusters:input_type -> api.v1.ListClustersRequest + 20, // 250: api.v1.K8SService.GetCluster:input_type -> api.v1.GetClusterRequest + 5, // 251: api.v1.K8SService.GetClusterMetadata:input_type -> api.v1.GetClusterMetadataRequest + 70, // 252: api.v1.K8SService.GetAllNamespaces:input_type -> api.v1.GetAllNamespacesRequest + 72, // 253: api.v1.K8SService.SearchNamespacesByCluster:input_type -> api.v1.SearchNamespacesByClusterRequest + 74, // 254: api.v1.K8SService.ListNamespacesByCluster:input_type -> api.v1.ListNamespacesByClusterRequest + 77, // 255: api.v1.K8SService.GetAllWorkloadNames:input_type -> api.v1.GetAllWorkloadNamesRequest + 79, // 256: api.v1.K8SService.GetAllWorkloadLabels:input_type -> api.v1.GetAllWorkloadLabelsRequest + 81, // 257: api.v1.K8SService.GetAllNodeGroupNames:input_type -> api.v1.GetAllNodeGroupNamesRequest + 109, // 258: api.v1.K8SService.MetadataForWorkloads:input_type -> api.v1.MetadataForWorkloadsRequest + 32, // 259: api.v1.K8SService.GetNodeGroups:input_type -> api.v1.GetNodeGroupsRequest + 33, // 260: api.v1.K8SService.GetAllNodeGroups:input_type -> api.v1.GetAllNodeGroupsRequest + 37, // 261: api.v1.K8SService.GetNodeGroupsUtilization:input_type -> api.v1.GetNodeGroupsUtilizationRequest + 6, // 262: api.v1.K8SService.GetNodeGroup:input_type -> api.v1.GetNodeGroupRequest + 3, // 263: api.v1.K8SService.GetNode:input_type -> api.v1.GetNodeRequest + 7, // 264: api.v1.K8SService.GetWorkloads:input_type -> api.v1.GetWorkloadsRequest + 8, // 265: api.v1.K8SService.ListWorkloadsPaginated:input_type -> api.v1.ListWorkloadsPaginatedRequest + 9, // 266: api.v1.K8SService.GetWorkloadsSummary:input_type -> api.v1.GetWorkloadsSummaryRequest + 17, // 267: api.v1.K8SService.GetWorkload:input_type -> api.v1.GetWorkloadRequest + 47, // 268: api.v1.K8SService.GetWorkloadContainerPercentiles:input_type -> api.v1.GetWorkloadContainerPercentilesRequest + 49, // 269: api.v1.K8SService.GetWorkloadContainerTimeSeries:input_type -> api.v1.GetWorkloadContainerTimeSeriesRequest + 51, // 270: api.v1.K8SService.GetLatestContainerRequestLimits:input_type -> api.v1.GetLatestContainerRequestLimitsRequest + 53, // 271: api.v1.K8SService.GetNodeGPUMigInstances:input_type -> api.v1.GetNodeGPUMigInstancesRequest + 55, // 272: api.v1.K8SService.GetNodeGPUMigInstanceTimeseries:input_type -> api.v1.GetNodeGPUMigInstanceTimeseriesRequest + 59, // 273: api.v1.K8SService.GetContainerIndividualGPUMetrics:input_type -> api.v1.GetContainerIndividualGPUMetricsRequest + 62, // 274: api.v1.K8SService.GetWorkloadLanguages:input_type -> api.v1.GetWorkloadLanguagesRequest + 64, // 275: api.v1.K8SService.GetForecastWorkloads:input_type -> api.v1.GetForecastWorkloadsRequest + 66, // 276: api.v1.K8SService.GetForecastWorkload:input_type -> api.v1.GetForecastWorkloadRequest + 14, // 277: api.v1.K8SService.GetResources:input_type -> api.v1.GetResourcesRequest + 26, // 278: api.v1.K8SService.GetResourceFilterOptions:input_type -> api.v1.GetResourceFilterOptionsRequest + 15, // 279: api.v1.K8SService.GetPods:input_type -> api.v1.GetPodsRequest + 86, // 280: api.v1.K8SService.GetLatestOperatorVersion:input_type -> api.v1.GetLatestOperatorVersionRequest + 88, // 281: api.v1.K8SService.GalaxyGetWorkloadPerspective:input_type -> api.v1.GalaxyGetWorkloadPerspectiveRequest + 92, // 282: api.v1.K8SService.ListAuditLogs:input_type -> api.v1.ListAuditLogsRequest + 94, // 283: api.v1.K8SService.ListAuditLogOriginators:input_type -> api.v1.ListAuditLogOriginatorsRequest + 96, // 284: api.v1.K8SService.SendWorkloadEmail:input_type -> api.v1.SendWorkloadEmailRequest + 98, // 285: api.v1.K8SService.SendWeeklySummaryEmail:input_type -> api.v1.SendWeeklySummaryEmailRequest + 101, // 286: api.v1.K8SService.GetClustersNodeInfo:input_type -> api.v1.GetClustersNodeInfoRequest + 103, // 287: api.v1.K8SService.SearchK8sResources:input_type -> api.v1.SearchK8sResourcesRequest + 106, // 288: api.v1.K8SService.SearchK8sWorkloads:input_type -> api.v1.SearchK8sWorkloadsRequest + 130, // 289: api.v1.K8SService.GetClusterType:input_type -> api.v1.GetClusterTypeRequest + 121, // 290: api.v1.K8SService.GetRelationsForKind:input_type -> api.v1.GetRelatedResourcesRequest + 142, // 291: api.v1.K8SService.LookupNodeInstance:input_type -> api.v1.LookupNodeInstanceRequest + 4, // 292: api.v1.K8SService.GetWorkloadPodHistory:input_type -> api.v1.GetWorkloadPodHistoryRequest + 111, // 293: api.v1.K8SService.AddClusterTags:input_type -> api.v1.AddClusterTagsRequest + 113, // 294: api.v1.K8SService.RemoveClusterTags:input_type -> api.v1.RemoveClusterTagsRequest + 115, // 295: api.v1.K8SService.ListTags:input_type -> api.v1.ListTagsRequest + 132, // 296: api.v1.K8SService.GetMigPartedConfig:input_type -> api.v1.GetMigPartedConfigRequest + 28, // 297: api.v1.ClusterMutationService.CreateCluster:input_type -> api.v1.CreateClusterRequest + 21, // 298: api.v1.ClusterMutationService.DeleteCluster:input_type -> api.v1.DeleteClusterRequest + 23, // 299: api.v1.ClusterMutationService.UpdateCluster:input_type -> api.v1.UpdateClusterRequest + 30, // 300: api.v1.ClusterMutationService.ResetClusterToken:input_type -> api.v1.ResetClusterTokenRequest + 136, // 301: api.v1.UtilizationService.DailyUtilization:input_type -> api.v1.DailyUtilizationRequest + 138, // 302: api.v1.UtilizationService.DailyUtilizationInstanceType:input_type -> api.v1.DailyUtilizationInstanceTypeRequest + 140, // 303: api.v1.UtilizationService.DailyUtilizationNodeType:input_type -> api.v1.DailyUtilizationNodeTypeRequest + 135, // 304: api.v1.K8SService.GetWorkloadsStats:output_type -> api.v1.GetWorkloadsStatsResponse + 42, // 305: api.v1.K8SService.GetClusters:output_type -> api.v1.GetClustersResponse + 43, // 306: api.v1.K8SService.ListClusters:output_type -> api.v1.ListClustersResponse + 41, // 307: api.v1.K8SService.GetCluster:output_type -> api.v1.GetClusterResponse + 68, // 308: api.v1.K8SService.GetClusterMetadata:output_type -> api.v1.GetClusterMetadataResponse + 71, // 309: api.v1.K8SService.GetAllNamespaces:output_type -> api.v1.GetAllNamespacesResponse + 73, // 310: api.v1.K8SService.SearchNamespacesByCluster:output_type -> api.v1.SearchNamespacesByClusterResponse + 75, // 311: api.v1.K8SService.ListNamespacesByCluster:output_type -> api.v1.ListNamespacesByClusterResponse + 78, // 312: api.v1.K8SService.GetAllWorkloadNames:output_type -> api.v1.GetAllWorkloadNamesResponse + 80, // 313: api.v1.K8SService.GetAllWorkloadLabels:output_type -> api.v1.GetAllWorkloadLabelsResponse + 82, // 314: api.v1.K8SService.GetAllNodeGroupNames:output_type -> api.v1.GetAllNodeGroupNamesResponse + 110, // 315: api.v1.K8SService.MetadataForWorkloads:output_type -> api.v1.MetadataForWorkloadsResponse + 34, // 316: api.v1.K8SService.GetNodeGroups:output_type -> api.v1.GetNodeGroupsResponse + 35, // 317: api.v1.K8SService.GetAllNodeGroups:output_type -> api.v1.GetAllNodeGroupsResponse + 38, // 318: api.v1.K8SService.GetNodeGroupsUtilization:output_type -> api.v1.GetNodeGroupsUtilizationResponse + 40, // 319: api.v1.K8SService.GetNodeGroup:output_type -> api.v1.GetNodeGroupResponse + 44, // 320: api.v1.K8SService.GetNode:output_type -> api.v1.GetNodeResponse + 45, // 321: api.v1.K8SService.GetWorkloads:output_type -> api.v1.GetWorkloadsResponse + 13, // 322: api.v1.K8SService.ListWorkloadsPaginated:output_type -> api.v1.ListWorkloadsPaginatedResponse + 12, // 323: api.v1.K8SService.GetWorkloadsSummary:output_type -> api.v1.GetWorkloadsSummaryResponse + 46, // 324: api.v1.K8SService.GetWorkload:output_type -> api.v1.GetWorkloadResponse + 48, // 325: api.v1.K8SService.GetWorkloadContainerPercentiles:output_type -> api.v1.GetWorkloadContainerPercentilesResponse + 50, // 326: api.v1.K8SService.GetWorkloadContainerTimeSeries:output_type -> api.v1.GetWorkloadContainerTimeSeriesResponse + 52, // 327: api.v1.K8SService.GetLatestContainerRequestLimits:output_type -> api.v1.GetLatestContainerRequestLimitsResponse + 54, // 328: api.v1.K8SService.GetNodeGPUMigInstances:output_type -> api.v1.GetNodeGPUMigInstancesResponse + 58, // 329: api.v1.K8SService.GetNodeGPUMigInstanceTimeseries:output_type -> api.v1.GetNodeGPUMigInstanceTimeseriesResponse + 60, // 330: api.v1.K8SService.GetContainerIndividualGPUMetrics:output_type -> api.v1.GetContainerIndividualGPUMetricsResponse + 63, // 331: api.v1.K8SService.GetWorkloadLanguages:output_type -> api.v1.GetWorkloadLanguagesResponse + 65, // 332: api.v1.K8SService.GetForecastWorkloads:output_type -> api.v1.GetForecastWorkloadsResponse + 67, // 333: api.v1.K8SService.GetForecastWorkload:output_type -> api.v1.GetForecastWorkloadResponse + 25, // 334: api.v1.K8SService.GetResources:output_type -> api.v1.GetResourcesResponse + 27, // 335: api.v1.K8SService.GetResourceFilterOptions:output_type -> api.v1.GetResourceFilterOptionsResponse + 16, // 336: api.v1.K8SService.GetPods:output_type -> api.v1.GetPodsResponse + 87, // 337: api.v1.K8SService.GetLatestOperatorVersion:output_type -> api.v1.GetLatestOperatorVersionResponse + 89, // 338: api.v1.K8SService.GalaxyGetWorkloadPerspective:output_type -> api.v1.GalaxyGetWorkloadPerspectiveResponse + 93, // 339: api.v1.K8SService.ListAuditLogs:output_type -> api.v1.ListAuditLogsResponse + 95, // 340: api.v1.K8SService.ListAuditLogOriginators:output_type -> api.v1.ListAuditLogOriginatorsResponse + 97, // 341: api.v1.K8SService.SendWorkloadEmail:output_type -> api.v1.SendWorkloadEmailResponse + 100, // 342: api.v1.K8SService.SendWeeklySummaryEmail:output_type -> api.v1.SendWeeklySummaryEmailResponse + 102, // 343: api.v1.K8SService.GetClustersNodeInfo:output_type -> api.v1.GetClustersNodeInfoResponse + 104, // 344: api.v1.K8SService.SearchK8sResources:output_type -> api.v1.SearchK8sResourcesResponse + 107, // 345: api.v1.K8SService.SearchK8sWorkloads:output_type -> api.v1.SearchK8sWorkloadsResponse + 131, // 346: api.v1.K8SService.GetClusterType:output_type -> api.v1.GetClusterTypeResponse + 126, // 347: api.v1.K8SService.GetRelationsForKind:output_type -> api.v1.GetRelatedResourcesResponse + 144, // 348: api.v1.K8SService.LookupNodeInstance:output_type -> api.v1.LookupNodeInstanceResponse + 122, // 349: api.v1.K8SService.GetWorkloadPodHistory:output_type -> api.v1.GetWorkloadPodHistoryResponse + 112, // 350: api.v1.K8SService.AddClusterTags:output_type -> api.v1.AddClusterTagsResponse + 114, // 351: api.v1.K8SService.RemoveClusterTags:output_type -> api.v1.RemoveClusterTagsResponse + 117, // 352: api.v1.K8SService.ListTags:output_type -> api.v1.ListTagsResponse + 133, // 353: api.v1.K8SService.GetMigPartedConfig:output_type -> api.v1.GetMigPartedConfigResponse + 29, // 354: api.v1.ClusterMutationService.CreateCluster:output_type -> api.v1.CreateClusterResponse + 22, // 355: api.v1.ClusterMutationService.DeleteCluster:output_type -> api.v1.DeleteClusterResponse + 24, // 356: api.v1.ClusterMutationService.UpdateCluster:output_type -> api.v1.UpdateClusterResponse + 31, // 357: api.v1.ClusterMutationService.ResetClusterToken:output_type -> api.v1.ResetClusterTokenResponse + 137, // 358: api.v1.UtilizationService.DailyUtilization:output_type -> api.v1.DailyUtilizationResponse + 139, // 359: api.v1.UtilizationService.DailyUtilizationInstanceType:output_type -> api.v1.DailyUtilizationInstanceTypeResponse + 141, // 360: api.v1.UtilizationService.DailyUtilizationNodeType:output_type -> api.v1.DailyUtilizationNodeTypeResponse + 304, // [304:361] is the sub-list for method output_type + 247, // [247:304] is the sub-list for method input_type + 247, // [247:247] is the sub-list for extension type_name + 247, // [247:247] is the sub-list for extension extendee + 0, // [0:247] is the sub-list for field type_name } func init() { file_api_v1_k8s_proto_init() } @@ -12186,7 +14268,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResourcesRequest); i { + switch v := v.(*ListWorkloadsPaginatedRequest); i { case 0: return &v.state case 1: @@ -12198,7 +14280,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPodsRequest); i { + switch v := v.(*GetWorkloadsSummaryRequest); i { case 0: return &v.state case 1: @@ -12210,7 +14292,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPodsResponse); i { + switch v := v.(*WorkloadMetricEntry); i { case 0: return &v.state case 1: @@ -12222,7 +14304,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRequest); i { + switch v := v.(*WorkloadMetricBreakdown); i { case 0: return &v.state case 1: @@ -12234,7 +14316,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClustersRequest); i { + switch v := v.(*GetWorkloadsSummaryResponse); i { case 0: return &v.state case 1: @@ -12246,7 +14328,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClustersRequest); i { + switch v := v.(*ListWorkloadsPaginatedResponse); i { case 0: return &v.state case 1: @@ -12258,7 +14340,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRequest); i { + switch v := v.(*GetResourcesRequest); i { case 0: return &v.state case 1: @@ -12270,7 +14352,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRequest); i { + switch v := v.(*GetPodsRequest); i { case 0: return &v.state case 1: @@ -12282,7 +14364,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterResponse); i { + switch v := v.(*GetPodsResponse); i { case 0: return &v.state case 1: @@ -12294,7 +14376,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRequest); i { + switch v := v.(*GetWorkloadRequest); i { case 0: return &v.state case 1: @@ -12306,7 +14388,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterResponse); i { + switch v := v.(*GetClustersRequest); i { case 0: return &v.state case 1: @@ -12318,7 +14400,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResourcesResponse); i { + switch v := v.(*ListClustersRequest); i { case 0: return &v.state case 1: @@ -12330,6 +14412,102 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourcesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourceFilterOptionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourceFilterOptionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateClusterRequest); i { case 0: return &v.state @@ -12341,8 +14519,140 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterResponse); i { + file_api_v1_k8s_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetClusterTokenRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetClusterTokenResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAllNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAllNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupSet); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsUtilizationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsUtilizationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupResponse); i { case 0: return &v.state case 1: @@ -12353,8 +14663,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetClusterTokenRequest); i { + file_api_v1_k8s_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterResponse); i { case 0: return &v.state case 1: @@ -12365,8 +14675,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetClusterTokenResponse); i { + file_api_v1_k8s_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClustersResponse); i { case 0: return &v.state case 1: @@ -12377,8 +14687,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsRequest); i { + file_api_v1_k8s_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClustersResponse); i { case 0: return &v.state case 1: @@ -12389,8 +14699,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllNodeGroupsRequest); i { + file_api_v1_k8s_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeResponse); i { case 0: return &v.state case 1: @@ -12401,8 +14711,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsResponse); i { + file_api_v1_k8s_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsResponse); i { case 0: return &v.state case 1: @@ -12413,8 +14723,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllNodeGroupsResponse); i { + file_api_v1_k8s_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadResponse); i { case 0: return &v.state case 1: @@ -12425,8 +14735,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupSet); i { + file_api_v1_k8s_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerPercentilesRequest); i { case 0: return &v.state case 1: @@ -12437,8 +14747,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsUtilizationRequest); i { + file_api_v1_k8s_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerPercentilesResponse); i { case 0: return &v.state case 1: @@ -12449,8 +14759,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsUtilizationResponse); i { + file_api_v1_k8s_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -12461,8 +14771,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupMetric); i { + file_api_v1_k8s_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -12473,8 +14783,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupResponse); i { + file_api_v1_k8s_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestContainerRequestLimitsRequest); i { case 0: return &v.state case 1: @@ -12485,8 +14795,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterResponse); i { + file_api_v1_k8s_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestContainerRequestLimitsResponse); i { case 0: return &v.state case 1: @@ -12497,8 +14807,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClustersResponse); i { + file_api_v1_k8s_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstancesRequest); i { case 0: return &v.state case 1: @@ -12509,8 +14819,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClustersResponse); i { + file_api_v1_k8s_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstancesResponse); i { case 0: return &v.state case 1: @@ -12521,8 +14831,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeResponse); i { + file_api_v1_k8s_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstanceTimeseriesRequest); i { case 0: return &v.state case 1: @@ -12533,8 +14843,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsResponse); i { + file_api_v1_k8s_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GPUMigInstanceDataPoint); i { case 0: return &v.state case 1: @@ -12545,8 +14855,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadResponse); i { + file_api_v1_k8s_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GPUMigInstanceTimeseries); i { case 0: return &v.state case 1: @@ -12557,8 +14867,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerPercentilesRequest); i { + file_api_v1_k8s_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstanceTimeseriesResponse); i { case 0: return &v.state case 1: @@ -12569,8 +14879,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerPercentilesResponse); i { + file_api_v1_k8s_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetContainerIndividualGPUMetricsRequest); i { case 0: return &v.state case 1: @@ -12581,8 +14891,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerTimeSeriesRequest); i { + file_api_v1_k8s_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetContainerIndividualGPUMetricsResponse); i { case 0: return &v.state case 1: @@ -12593,8 +14903,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerTimeSeriesResponse); i { + file_api_v1_k8s_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LanguageVersions); i { case 0: return &v.state case 1: @@ -12605,8 +14915,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestContainerRequestLimitsRequest); i { + file_api_v1_k8s_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadLanguagesRequest); i { case 0: return &v.state case 1: @@ -12617,8 +14927,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestContainerRequestLimitsResponse); i { + file_api_v1_k8s_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadLanguagesResponse); i { case 0: return &v.state case 1: @@ -12629,7 +14939,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadsRequest); i { case 0: return &v.state @@ -12641,7 +14951,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadsResponse); i { case 0: return &v.state @@ -12653,7 +14963,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadRequest); i { case 0: return &v.state @@ -12665,7 +14975,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadResponse); i { case 0: return &v.state @@ -12677,7 +14987,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterMetadataResponse); i { case 0: return &v.state @@ -12689,7 +14999,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClusterElement); i { case 0: return &v.state @@ -12701,7 +15011,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNamespacesRequest); i { case 0: return &v.state @@ -12713,7 +15023,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNamespacesResponse); i { case 0: return &v.state @@ -12725,7 +15035,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchNamespacesByClusterRequest); i { case 0: return &v.state @@ -12737,7 +15047,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchNamespacesByClusterResponse); i { case 0: return &v.state @@ -12749,7 +15059,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNamespacesByClusterRequest); i { case 0: return &v.state @@ -12761,7 +15071,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNamespacesByClusterResponse); i { case 0: return &v.state @@ -12773,7 +15083,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamespaceItem); i { case 0: return &v.state @@ -12785,7 +15095,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadNamesRequest); i { case 0: return &v.state @@ -12797,7 +15107,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadNamesResponse); i { case 0: return &v.state @@ -12809,7 +15119,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadLabelsRequest); i { case 0: return &v.state @@ -12821,7 +15131,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadLabelsResponse); i { case 0: return &v.state @@ -12833,7 +15143,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNodeGroupNamesRequest); i { case 0: return &v.state @@ -12845,7 +15155,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNodeGroupNamesResponse); i { case 0: return &v.state @@ -12857,7 +15167,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Cluster); i { case 0: return &v.state @@ -12869,7 +15179,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OperatorInfo); i { case 0: return &v.state @@ -12881,7 +15191,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Container); i { case 0: return &v.state @@ -12893,7 +15203,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLatestOperatorVersionRequest); i { case 0: return &v.state @@ -12905,7 +15215,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLatestOperatorVersionResponse); i { case 0: return &v.state @@ -12917,7 +15227,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyGetWorkloadPerspectiveRequest); i { case 0: return &v.state @@ -12929,7 +15239,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyGetWorkloadPerspectiveResponse); i { case 0: return &v.state @@ -12941,7 +15251,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyWorkloadGroup); i { case 0: return &v.state @@ -12953,7 +15263,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PerspectiveDatapointOpts); i { case 0: return &v.state @@ -12965,7 +15275,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogsRequest); i { case 0: return &v.state @@ -12977,7 +15287,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogsResponse); i { case 0: return &v.state @@ -12989,7 +15299,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogOriginatorsRequest); i { case 0: return &v.state @@ -13001,7 +15311,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogOriginatorsResponse); i { case 0: return &v.state @@ -13013,7 +15323,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWorkloadEmailRequest); i { case 0: return &v.state @@ -13025,7 +15335,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWorkloadEmailResponse); i { case 0: return &v.state @@ -13037,7 +15347,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailRequest); i { case 0: return &v.state @@ -13049,7 +15359,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailRequestData); i { case 0: return &v.state @@ -13061,7 +15371,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailResponse); i { case 0: return &v.state @@ -13073,7 +15383,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClustersNodeInfoRequest); i { case 0: return &v.state @@ -13085,7 +15395,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClustersNodeInfoResponse); i { case 0: return &v.state @@ -13097,7 +15407,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SResourcesRequest); i { case 0: return &v.state @@ -13109,7 +15419,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SResourcesResponse); i { case 0: return &v.state @@ -13121,7 +15431,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SSearchResult); i { case 0: return &v.state @@ -13133,7 +15443,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SWorkloadsRequest); i { case 0: return &v.state @@ -13145,7 +15455,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SWorkloadsResponse); i { case 0: return &v.state @@ -13157,7 +15467,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SWorkloadSearchResult); i { case 0: return &v.state @@ -13169,7 +15479,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetadataForWorkloadsRequest); i { case 0: return &v.state @@ -13181,7 +15491,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetadataForWorkloadsResponse); i { case 0: return &v.state @@ -13193,7 +15503,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddClusterTagsRequest); i { case 0: return &v.state @@ -13205,7 +15515,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddClusterTagsResponse); i { case 0: return &v.state @@ -13217,7 +15527,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveClusterTagsRequest); i { case 0: return &v.state @@ -13229,7 +15539,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveClusterTagsResponse); i { case 0: return &v.state @@ -13241,7 +15551,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTagsRequest); i { case 0: return &v.state @@ -13253,7 +15563,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TagSummary); i { case 0: return &v.state @@ -13265,7 +15575,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTagsResponse); i { case 0: return &v.state @@ -13277,7 +15587,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkloadMetadata); i { case 0: return &v.state @@ -13289,7 +15599,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodMetadata); i { case 0: return &v.state @@ -13301,7 +15611,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeMetadata); i { case 0: return &v.state @@ -13313,7 +15623,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRelatedResourcesRequest); i { case 0: return &v.state @@ -13325,7 +15635,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadPodHistoryResponse); i { case 0: return &v.state @@ -13337,7 +15647,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobHistory); i { case 0: return &v.state @@ -13349,7 +15659,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicaSetHistory); i { case 0: return &v.state @@ -13361,7 +15671,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodHistory); i { case 0: return &v.state @@ -13373,7 +15683,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRelatedResourcesResponse); i { case 0: return &v.state @@ -13385,7 +15695,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SRelatedResource); i { case 0: return &v.state @@ -13397,7 +15707,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SResourceNode); i { case 0: return &v.state @@ -13409,7 +15719,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SResourceEdge); i { case 0: return &v.state @@ -13421,7 +15731,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterTypeRequest); i { case 0: return &v.state @@ -13433,7 +15743,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterTypeResponse); i { case 0: return &v.state @@ -13445,7 +15755,31 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigPartedConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigPartedConfigResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadsStatsRequest); i { case 0: return &v.state @@ -13457,7 +15791,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadsStatsResponse); i { case 0: return &v.state @@ -13469,7 +15803,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationRequest); i { case 0: return &v.state @@ -13481,7 +15815,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse); i { case 0: return &v.state @@ -13493,7 +15827,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeRequest); i { case 0: return &v.state @@ -13505,7 +15839,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse); i { case 0: return &v.state @@ -13517,7 +15851,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeRequest); i { case 0: return &v.state @@ -13529,7 +15863,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse); i { case 0: return &v.state @@ -13541,7 +15875,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LookupNodeInstanceRequest); i { case 0: return &v.state @@ -13553,7 +15887,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InstanceLookupParams); i { case 0: return &v.state @@ -13565,7 +15899,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LookupNodeInstanceResponse); i { case 0: return &v.state @@ -13577,7 +15911,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics); i { case 0: return &v.state @@ -13589,7 +15923,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse_Datapoints); i { case 0: return &v.state @@ -13601,7 +15935,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse_Datapoint); i { case 0: return &v.state @@ -13613,7 +15947,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse_Datapoints); i { case 0: return &v.state @@ -13625,7 +15959,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse_Datapoint); i { case 0: return &v.state @@ -13637,7 +15971,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse_Datapoints); i { case 0: return &v.state @@ -13649,7 +15983,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse_Datapoint); i { case 0: return &v.state @@ -13668,29 +16002,35 @@ func file_api_v1_k8s_proto_init() { file_api_v1_k8s_proto_msgTypes[4].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[5].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[6].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[8].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[10].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[21].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[36].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[38].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[42].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[12].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[14].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[16].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[23].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[29].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[34].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[44].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[46].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[50].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[51].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[52].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[61].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[70].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[72].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[79].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[99].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[110].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[63].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[80].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[89].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[91].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[98].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[118].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[131].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_k8s_proto_rawDesc, NumEnums: 3, - NumMessages: 147, + NumMessages: 168, NumExtensions: 0, NumServices: 3, }, diff --git a/internal/gen/api/v1/profiling.pb.go b/internal/gen/api/v1/profiling.pb.go index 027b83b..01fcf07 100644 --- a/internal/gen/api/v1/profiling.pb.go +++ b/internal/gen/api/v1/profiling.pb.go @@ -7,6 +7,7 @@ package apiv1 import ( + money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" @@ -135,6 +136,10 @@ type GetWorkloadProfilesRequest struct { Workloads []*ProfilingWorkloadKey `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + // When set to 1D or 7D, serve from the persisted workload_profile_cache + // snapshot for that window instead of computing live over start_time/end_time. + // UNSPECIFIED (default) preserves today's live-compute behavior. + Window ProfileWindow `protobuf:"varint,13,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } func (x *GetWorkloadProfilesRequest) Reset() { @@ -204,6 +209,13 @@ func (x *GetWorkloadProfilesRequest) GetEndTime() *timestamppb.Timestamp { return nil } +func (x *GetWorkloadProfilesRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + type GetWorkloadProfilesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -251,6 +263,182 @@ func (x *GetWorkloadProfilesResponse) GetWorkloadProfiles() []*WorkloadProfileRe return nil } +type GetWorkloadProfileAvailabilityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *GetWorkloadProfileAvailabilityRequest) Reset() { + *x = GetWorkloadProfileAvailabilityRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadProfileAvailabilityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadProfileAvailabilityRequest) ProtoMessage() {} + +func (x *GetWorkloadProfileAvailabilityRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWorkloadProfileAvailabilityRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadProfileAvailabilityRequest) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{3} +} + +func (x *GetWorkloadProfileAvailabilityRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadProfileAvailabilityRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ProfileWindowAvailability summarizes the cached-snapshot state for a single +// profile window. available reflects both presence (workload_count > 0) and +// freshness (latest_computed_at within the window's staleness threshold). +type ProfileWindowAvailability struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Available bool `protobuf:"varint,1,opt,name=available,proto3" json:"available,omitempty"` + LatestComputedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=latest_computed_at,json=latestComputedAt,proto3" json:"latest_computed_at,omitempty"` + WorkloadCount int32 `protobuf:"varint,3,opt,name=workload_count,json=workloadCount,proto3" json:"workload_count,omitempty"` +} + +func (x *ProfileWindowAvailability) Reset() { + *x = ProfileWindowAvailability{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProfileWindowAvailability) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProfileWindowAvailability) ProtoMessage() {} + +func (x *ProfileWindowAvailability) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[4] + 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 ProfileWindowAvailability.ProtoReflect.Descriptor instead. +func (*ProfileWindowAvailability) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{4} +} + +func (x *ProfileWindowAvailability) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *ProfileWindowAvailability) GetLatestComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.LatestComputedAt + } + return nil +} + +func (x *ProfileWindowAvailability) GetWorkloadCount() int32 { + if x != nil { + return x.WorkloadCount + } + return 0 +} + +type GetWorkloadProfileAvailabilityResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window_1D *ProfileWindowAvailability `protobuf:"bytes,1,opt,name=window_1d,json=window1d,proto3" json:"window_1d,omitempty"` + Window_7D *ProfileWindowAvailability `protobuf:"bytes,2,opt,name=window_7d,json=window7d,proto3" json:"window_7d,omitempty"` +} + +func (x *GetWorkloadProfileAvailabilityResponse) Reset() { + *x = GetWorkloadProfileAvailabilityResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadProfileAvailabilityResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadProfileAvailabilityResponse) ProtoMessage() {} + +func (x *GetWorkloadProfileAvailabilityResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[5] + 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 GetWorkloadProfileAvailabilityResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadProfileAvailabilityResponse) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{5} +} + +func (x *GetWorkloadProfileAvailabilityResponse) GetWindow_1D() *ProfileWindowAvailability { + if x != nil { + return x.Window_1D + } + return nil +} + +func (x *GetWorkloadProfileAvailabilityResponse) GetWindow_7D() *ProfileWindowAvailability { + if x != nil { + return x.Window_7D + } + return nil +} + type WorkloadProfileResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -262,12 +450,21 @@ type WorkloadProfileResult struct { Classification *ProfilingClassification `protobuf:"bytes,4,opt,name=classification,proto3" json:"classification,omitempty"` Confidence float64 `protobuf:"fixed64,5,opt,name=confidence,proto3" json:"confidence,omitempty"` DataQuality *ProfileDataQuality `protobuf:"bytes,6,opt,name=data_quality,json=dataQuality,proto3" json:"data_quality,omitempty"` + // The window over which this profile's distributions were computed. + WindowStart *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=window_start,json=windowStart,proto3" json:"window_start,omitempty"` + WindowEnd *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=window_end,json=windowEnd,proto3" json:"window_end,omitempty"` + // distribution_source identifies how the percentile distributions were + // derived. "exact_timeseries" = exact percentiles over the deduplicated + // busiest-pod-per-minute series (engine path); "sketch" = GK sketch + // aggregates (tail may collapse onto max — do not label as P99 on fleet + // screens). + DistributionSource string `protobuf:"bytes,9,opt,name=distribution_source,json=distributionSource,proto3" json:"distribution_source,omitempty"` } func (x *WorkloadProfileResult) Reset() { *x = WorkloadProfileResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[3] + mi := &file_api_v1_profiling_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -280,7 +477,7 @@ func (x *WorkloadProfileResult) String() string { func (*WorkloadProfileResult) ProtoMessage() {} func (x *WorkloadProfileResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[3] + mi := &file_api_v1_profiling_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -293,7 +490,7 @@ func (x *WorkloadProfileResult) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadProfileResult.ProtoReflect.Descriptor instead. func (*WorkloadProfileResult) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{3} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{6} } func (x *WorkloadProfileResult) GetKind() string { @@ -338,6 +535,27 @@ func (x *WorkloadProfileResult) GetDataQuality() *ProfileDataQuality { return nil } +func (x *WorkloadProfileResult) GetWindowStart() *timestamppb.Timestamp { + if x != nil { + return x.WindowStart + } + return nil +} + +func (x *WorkloadProfileResult) GetWindowEnd() *timestamppb.Timestamp { + if x != nil { + return x.WindowEnd + } + return nil +} + +func (x *WorkloadProfileResult) GetDistributionSource() string { + if x != nil { + return x.DistributionSource + } + return "" +} + type ContainerProfileResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -377,7 +595,7 @@ type ContainerProfileResult struct { func (x *ContainerProfileResult) Reset() { *x = ContainerProfileResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[4] + mi := &file_api_v1_profiling_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -390,7 +608,7 @@ func (x *ContainerProfileResult) String() string { func (*ContainerProfileResult) ProtoMessage() {} func (x *ContainerProfileResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[4] + mi := &file_api_v1_profiling_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -403,7 +621,7 @@ func (x *ContainerProfileResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerProfileResult.ProtoReflect.Descriptor instead. func (*ContainerProfileResult) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{4} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{7} } func (x *ContainerProfileResult) GetContainerName() string { @@ -568,7 +786,7 @@ type ProfilingBehavior struct { func (x *ProfilingBehavior) Reset() { *x = ProfilingBehavior{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[5] + mi := &file_api_v1_profiling_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +799,7 @@ func (x *ProfilingBehavior) String() string { func (*ProfilingBehavior) ProtoMessage() {} func (x *ProfilingBehavior) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[5] + mi := &file_api_v1_profiling_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +812,7 @@ func (x *ProfilingBehavior) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingBehavior.ProtoReflect.Descriptor instead. func (*ProfilingBehavior) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{5} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{8} } func (x *ProfilingBehavior) GetCpuVolatility() string { @@ -657,7 +875,7 @@ type ProfilingSignalValues struct { func (x *ProfilingSignalValues) Reset() { *x = ProfilingSignalValues{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[6] + mi := &file_api_v1_profiling_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -670,7 +888,7 @@ func (x *ProfilingSignalValues) String() string { func (*ProfilingSignalValues) ProtoMessage() {} func (x *ProfilingSignalValues) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[6] + mi := &file_api_v1_profiling_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -683,7 +901,7 @@ func (x *ProfilingSignalValues) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingSignalValues.ProtoReflect.Descriptor instead. func (*ProfilingSignalValues) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{6} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{9} } func (x *ProfilingSignalValues) GetCvCpu() float64 { @@ -807,7 +1025,7 @@ type ProfilingAdjustmentEvidence struct { func (x *ProfilingAdjustmentEvidence) Reset() { *x = ProfilingAdjustmentEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[7] + mi := &file_api_v1_profiling_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -820,7 +1038,7 @@ func (x *ProfilingAdjustmentEvidence) String() string { func (*ProfilingAdjustmentEvidence) ProtoMessage() {} func (x *ProfilingAdjustmentEvidence) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[7] + mi := &file_api_v1_profiling_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -833,7 +1051,7 @@ func (x *ProfilingAdjustmentEvidence) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingAdjustmentEvidence.ProtoReflect.Descriptor instead. func (*ProfilingAdjustmentEvidence) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{7} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{10} } func (x *ProfilingAdjustmentEvidence) GetSelectedCpuPercentile() int32 { @@ -926,7 +1144,7 @@ type ProfilingAdjustment struct { func (x *ProfilingAdjustment) Reset() { *x = ProfilingAdjustment{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[8] + mi := &file_api_v1_profiling_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -939,7 +1157,7 @@ func (x *ProfilingAdjustment) String() string { func (*ProfilingAdjustment) ProtoMessage() {} func (x *ProfilingAdjustment) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[8] + mi := &file_api_v1_profiling_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -952,7 +1170,7 @@ func (x *ProfilingAdjustment) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingAdjustment.ProtoReflect.Descriptor instead. func (*ProfilingAdjustment) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{8} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{11} } func (x *ProfilingAdjustment) GetReason() string { @@ -985,7 +1203,7 @@ type ProfilingResourceRecommendation struct { func (x *ProfilingResourceRecommendation) Reset() { *x = ProfilingResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[9] + mi := &file_api_v1_profiling_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -998,7 +1216,7 @@ func (x *ProfilingResourceRecommendation) String() string { func (*ProfilingResourceRecommendation) ProtoMessage() {} func (x *ProfilingResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[9] + mi := &file_api_v1_profiling_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1011,7 +1229,7 @@ func (x *ProfilingResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingResourceRecommendation.ProtoReflect.Descriptor instead. func (*ProfilingResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{9} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{12} } func (x *ProfilingResourceRecommendation) GetCpuRequestMillicores() int64 { @@ -1062,7 +1280,7 @@ type ProfilingClassification struct { func (x *ProfilingClassification) Reset() { *x = ProfilingClassification{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[10] + mi := &file_api_v1_profiling_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1075,7 +1293,7 @@ func (x *ProfilingClassification) String() string { func (*ProfilingClassification) ProtoMessage() {} func (x *ProfilingClassification) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[10] + mi := &file_api_v1_profiling_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1088,7 +1306,7 @@ func (x *ProfilingClassification) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingClassification.ProtoReflect.Descriptor instead. func (*ProfilingClassification) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{10} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{13} } func (x *ProfilingClassification) GetDominantResource() string { @@ -1125,7 +1343,7 @@ type ProfileDataQuality struct { func (x *ProfileDataQuality) Reset() { *x = ProfileDataQuality{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[11] + mi := &file_api_v1_profiling_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1138,7 +1356,7 @@ func (x *ProfileDataQuality) String() string { func (*ProfileDataQuality) ProtoMessage() {} func (x *ProfileDataQuality) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[11] + mi := &file_api_v1_profiling_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1151,7 +1369,7 @@ func (x *ProfileDataQuality) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileDataQuality.ProtoReflect.Descriptor instead. func (*ProfileDataQuality) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{11} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{14} } func (x *ProfileDataQuality) GetTotalDataPoints() int32 { @@ -1189,7 +1407,7 @@ type ProfileKey struct { func (x *ProfileKey) Reset() { *x = ProfileKey{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[12] + mi := &file_api_v1_profiling_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1202,7 +1420,7 @@ func (x *ProfileKey) String() string { func (*ProfileKey) ProtoMessage() {} func (x *ProfileKey) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[12] + mi := &file_api_v1_profiling_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1215,7 +1433,7 @@ func (x *ProfileKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileKey.ProtoReflect.Descriptor instead. func (*ProfileKey) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{12} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{15} } func (x *ProfileKey) GetKind() string { @@ -1266,7 +1484,7 @@ type MetricPercentilesCompact struct { func (x *MetricPercentilesCompact) Reset() { *x = MetricPercentilesCompact{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[13] + mi := &file_api_v1_profiling_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1279,7 +1497,7 @@ func (x *MetricPercentilesCompact) String() string { func (*MetricPercentilesCompact) ProtoMessage() {} func (x *MetricPercentilesCompact) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[13] + mi := &file_api_v1_profiling_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1292,7 +1510,7 @@ func (x *MetricPercentilesCompact) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricPercentilesCompact.ProtoReflect.Descriptor instead. func (*MetricPercentilesCompact) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{13} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{16} } func (x *MetricPercentilesCompact) GetAvg() float64 { @@ -1384,12 +1602,28 @@ type ContainerProfileSnapshot struct { InsufficientData bool `protobuf:"varint,12,opt,name=insufficient_data,json=insufficientData,proto3" json:"insufficient_data,omitempty"` CurrentCpuRequestMillicores int64 `protobuf:"varint,13,opt,name=current_cpu_request_millicores,json=currentCpuRequestMillicores,proto3" json:"current_cpu_request_millicores,omitempty"` CurrentMemoryRequestBytes int64 `protobuf:"varint,14,opt,name=current_memory_request_bytes,json=currentMemoryRequestBytes,proto3" json:"current_memory_request_bytes,omitempty"` + // Container-level startup timing (scheduled -> Ready condition). + AvgTimeToReadyMs float64 `protobuf:"fixed64,15,opt,name=avg_time_to_ready_ms,json=avgTimeToReadyMs,proto3" json:"avg_time_to_ready_ms,omitempty"` + P50TimeToReadyMs float64 `protobuf:"fixed64,16,opt,name=p50_time_to_ready_ms,json=p50TimeToReadyMs,proto3" json:"p50_time_to_ready_ms,omitempty"` + P75TimeToReadyMs float64 `protobuf:"fixed64,17,opt,name=p75_time_to_ready_ms,json=p75TimeToReadyMs,proto3" json:"p75_time_to_ready_ms,omitempty"` + P95TimeToReadyMs float64 `protobuf:"fixed64,18,opt,name=p95_time_to_ready_ms,json=p95TimeToReadyMs,proto3" json:"p95_time_to_ready_ms,omitempty"` + P99TimeToReadyMs float64 `protobuf:"fixed64,19,opt,name=p99_time_to_ready_ms,json=p99TimeToReadyMs,proto3" json:"p99_time_to_ready_ms,omitempty"` + P999TimeToReadyMs float64 `protobuf:"fixed64,20,opt,name=p999_time_to_ready_ms,json=p999TimeToReadyMs,proto3" json:"p999_time_to_ready_ms,omitempty"` + MaxTimeToReadyMs float64 `protobuf:"fixed64,21,opt,name=max_time_to_ready_ms,json=maxTimeToReadyMs,proto3" json:"max_time_to_ready_ms,omitempty"` + // Container-level startup timing (container create -> Running state). + AvgTimeToRunningMs float64 `protobuf:"fixed64,22,opt,name=avg_time_to_running_ms,json=avgTimeToRunningMs,proto3" json:"avg_time_to_running_ms,omitempty"` + P50TimeToRunningMs float64 `protobuf:"fixed64,23,opt,name=p50_time_to_running_ms,json=p50TimeToRunningMs,proto3" json:"p50_time_to_running_ms,omitempty"` + P75TimeToRunningMs float64 `protobuf:"fixed64,24,opt,name=p75_time_to_running_ms,json=p75TimeToRunningMs,proto3" json:"p75_time_to_running_ms,omitempty"` + P95TimeToRunningMs float64 `protobuf:"fixed64,25,opt,name=p95_time_to_running_ms,json=p95TimeToRunningMs,proto3" json:"p95_time_to_running_ms,omitempty"` + P99TimeToRunningMs float64 `protobuf:"fixed64,26,opt,name=p99_time_to_running_ms,json=p99TimeToRunningMs,proto3" json:"p99_time_to_running_ms,omitempty"` + P999TimeToRunningMs float64 `protobuf:"fixed64,27,opt,name=p999_time_to_running_ms,json=p999TimeToRunningMs,proto3" json:"p999_time_to_running_ms,omitempty"` + MaxTimeToRunningMs float64 `protobuf:"fixed64,28,opt,name=max_time_to_running_ms,json=maxTimeToRunningMs,proto3" json:"max_time_to_running_ms,omitempty"` } func (x *ContainerProfileSnapshot) Reset() { *x = ContainerProfileSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[14] + mi := &file_api_v1_profiling_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1402,7 +1636,7 @@ func (x *ContainerProfileSnapshot) String() string { func (*ContainerProfileSnapshot) ProtoMessage() {} func (x *ContainerProfileSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[14] + mi := &file_api_v1_profiling_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1415,7 +1649,7 @@ func (x *ContainerProfileSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerProfileSnapshot.ProtoReflect.Descriptor instead. func (*ContainerProfileSnapshot) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{14} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{17} } func (x *ContainerProfileSnapshot) GetContainerName() string { @@ -1516,6 +1750,212 @@ func (x *ContainerProfileSnapshot) GetCurrentMemoryRequestBytes() int64 { return 0 } +func (x *ContainerProfileSnapshot) GetAvgTimeToReadyMs() float64 { + if x != nil { + return x.AvgTimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP50TimeToReadyMs() float64 { + if x != nil { + return x.P50TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP75TimeToReadyMs() float64 { + if x != nil { + return x.P75TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP95TimeToReadyMs() float64 { + if x != nil { + return x.P95TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP99TimeToReadyMs() float64 { + if x != nil { + return x.P99TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP999TimeToReadyMs() float64 { + if x != nil { + return x.P999TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetMaxTimeToReadyMs() float64 { + if x != nil { + return x.MaxTimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetAvgTimeToRunningMs() float64 { + if x != nil { + return x.AvgTimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP50TimeToRunningMs() float64 { + if x != nil { + return x.P50TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP75TimeToRunningMs() float64 { + if x != nil { + return x.P75TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP95TimeToRunningMs() float64 { + if x != nil { + return x.P95TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP99TimeToRunningMs() float64 { + if x != nil { + return x.P99TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP999TimeToRunningMs() float64 { + if x != nil { + return x.P999TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetMaxTimeToRunningMs() float64 { + if x != nil { + return x.MaxTimeToRunningMs + } + return 0 +} + +// WorkloadPeerConnectivity describes one outbound (egress) internal +// workload-to-workload traffic edge from the profiled workload to a destination +// workload in the same cluster, aggregated over the profile window. Only +// internal cluster traffic is represented here (destination workload +// name/namespace populated); external egress is out of scope. +type WorkloadPeerConnectivity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Stable owner-workload UID of the destination, resolved at ingestion. Used + // for stable peer identity — name/namespace alone can collide across workload + // replacements. + DstWorkloadUid string `protobuf:"bytes,1,opt,name=dst_workload_uid,json=dstWorkloadUid,proto3" json:"dst_workload_uid,omitempty"` + DstWorkloadName string `protobuf:"bytes,2,opt,name=dst_workload_name,json=dstWorkloadName,proto3" json:"dst_workload_name,omitempty"` + DstNamespace string `protobuf:"bytes,3,opt,name=dst_namespace,json=dstNamespace,proto3" json:"dst_namespace,omitempty"` + // traffic_type mirrors models.TrafficType (e.g. INTERNAL_SAME_NODE, + // INTERNAL_SAME_AZ, INTERNAL_CROSS_AZ). Kept as a string to match the + // ClickHouse-stored classification. + TrafficType string `protobuf:"bytes,4,opt,name=traffic_type,json=trafficType,proto3" json:"traffic_type,omitempty"` + // Total transmit/receive bytes over the profile window for this edge. + TxBytes int64 `protobuf:"varint,5,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"` + RxBytes int64 `protobuf:"varint,6,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"` + // Total network cost attributed to this edge over the window. + Cost *money.Money `protobuf:"bytes,7,opt,name=cost,proto3" json:"cost,omitempty"` +} + +func (x *WorkloadPeerConnectivity) Reset() { + *x = WorkloadPeerConnectivity{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadPeerConnectivity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadPeerConnectivity) ProtoMessage() {} + +func (x *WorkloadPeerConnectivity) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[18] + 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 WorkloadPeerConnectivity.ProtoReflect.Descriptor instead. +func (*WorkloadPeerConnectivity) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{18} +} + +func (x *WorkloadPeerConnectivity) GetDstWorkloadUid() string { + if x != nil { + return x.DstWorkloadUid + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetDstWorkloadName() string { + if x != nil { + return x.DstWorkloadName + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetDstNamespace() string { + if x != nil { + return x.DstNamespace + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetTrafficType() string { + if x != nil { + return x.TrafficType + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetTxBytes() int64 { + if x != nil { + return x.TxBytes + } + return 0 +} + +func (x *WorkloadPeerConnectivity) GetRxBytes() int64 { + if x != nil { + return x.RxBytes + } + return 0 +} + +func (x *WorkloadPeerConnectivity) GetCost() *money.Money { + if x != nil { + return x.Cost + } + return nil +} + type WorkloadProfileSnapshot struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1527,12 +1967,41 @@ type WorkloadProfileSnapshot struct { DataQuality *ProfileDataQuality `protobuf:"bytes,4,opt,name=data_quality,json=dataQuality,proto3" json:"data_quality,omitempty"` ComputedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` UiUrl string `protobuf:"bytes,6,opt,name=ui_url,json=uiUrl,proto3" json:"ui_url,omitempty"` + // Workload-level startup aggregates, pooled across every container of every + // pod in the window. Mirrors WorkloadHealthSummary's startup fields. + AvgTimeToReadyMs float64 `protobuf:"fixed64,7,opt,name=avg_time_to_ready_ms,json=avgTimeToReadyMs,proto3" json:"avg_time_to_ready_ms,omitempty"` + P50TimeToReadyMs float64 `protobuf:"fixed64,8,opt,name=p50_time_to_ready_ms,json=p50TimeToReadyMs,proto3" json:"p50_time_to_ready_ms,omitempty"` + P75TimeToReadyMs float64 `protobuf:"fixed64,9,opt,name=p75_time_to_ready_ms,json=p75TimeToReadyMs,proto3" json:"p75_time_to_ready_ms,omitempty"` + P95TimeToReadyMs float64 `protobuf:"fixed64,10,opt,name=p95_time_to_ready_ms,json=p95TimeToReadyMs,proto3" json:"p95_time_to_ready_ms,omitempty"` + P99TimeToReadyMs float64 `protobuf:"fixed64,11,opt,name=p99_time_to_ready_ms,json=p99TimeToReadyMs,proto3" json:"p99_time_to_ready_ms,omitempty"` + P999TimeToReadyMs float64 `protobuf:"fixed64,12,opt,name=p999_time_to_ready_ms,json=p999TimeToReadyMs,proto3" json:"p999_time_to_ready_ms,omitempty"` + MaxTimeToReadyMs float64 `protobuf:"fixed64,13,opt,name=max_time_to_ready_ms,json=maxTimeToReadyMs,proto3" json:"max_time_to_ready_ms,omitempty"` + // Always false from this pipeline: the batched cluster-wide fetch does not + // compute a previous-period comparison, matching the existing precedent in + // GetWorkloadHealthSummaries's cluster-list handler. + StartupDegraded bool `protobuf:"varint,14,opt,name=startup_degraded,json=startupDegraded,proto3" json:"startup_degraded,omitempty"` + // False when no container_startup_lifecycles rows matched this workload in + // the window — i.e. no pod lifecycle transitions (Pending, ContainerCreating, + // Running, or Ready) were observed for it, so the zero-valued timing fields + // above mean "no data" rather than a real zero-latency startup. + // + // Reflects workload-level (time_to_ready_ms) presence only. A workload can + // have has_startup_data=false with all *_time_to_ready_ms fields zero, while + // its containers[].{avg,p50,...}_time_to_running_ms are still populated — + // e.g. containers that reached Running but never became Ready in the + // window. Do not use this flag to gate reads of container-level + // *_time_to_running_ms; check each container's own fields instead. + HasStartupData bool `protobuf:"varint,15,opt,name=has_startup_data,json=hasStartupData,proto3" json:"has_startup_data,omitempty"` + // peers carries the top outbound internal workload-to-workload traffic edges + // from this workload over the profile window (capped, ranked by tx+rx bytes). + // Only internal cluster traffic is included; external egress is excluded. + Peers []*WorkloadPeerConnectivity `protobuf:"bytes,16,rep,name=peers,proto3" json:"peers,omitempty"` } func (x *WorkloadProfileSnapshot) Reset() { *x = WorkloadProfileSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[15] + mi := &file_api_v1_profiling_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1545,7 +2014,7 @@ func (x *WorkloadProfileSnapshot) String() string { func (*WorkloadProfileSnapshot) ProtoMessage() {} func (x *WorkloadProfileSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[15] + mi := &file_api_v1_profiling_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1558,7 +2027,7 @@ func (x *WorkloadProfileSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadProfileSnapshot.ProtoReflect.Descriptor instead. func (*WorkloadProfileSnapshot) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{15} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{19} } func (x *WorkloadProfileSnapshot) GetKey() *ProfileKey { @@ -1603,6 +2072,76 @@ func (x *WorkloadProfileSnapshot) GetUiUrl() string { return "" } +func (x *WorkloadProfileSnapshot) GetAvgTimeToReadyMs() float64 { + if x != nil { + return x.AvgTimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP50TimeToReadyMs() float64 { + if x != nil { + return x.P50TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP75TimeToReadyMs() float64 { + if x != nil { + return x.P75TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP95TimeToReadyMs() float64 { + if x != nil { + return x.P95TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP99TimeToReadyMs() float64 { + if x != nil { + return x.P99TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP999TimeToReadyMs() float64 { + if x != nil { + return x.P999TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetMaxTimeToReadyMs() float64 { + if x != nil { + return x.MaxTimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetStartupDegraded() bool { + if x != nil { + return x.StartupDegraded + } + return false +} + +func (x *WorkloadProfileSnapshot) GetHasStartupData() bool { + if x != nil { + return x.HasStartupData + } + return false +} + +func (x *WorkloadProfileSnapshot) GetPeers() []*WorkloadPeerConnectivity { + if x != nil { + return x.Peers + } + return nil +} + var File_api_v1_profiling_proto protoreflect.FileDescriptor var file_api_v1_profiling_proto_rawDesc = []byte{ @@ -1610,390 +2149,532 @@ var file_api_v1_profiling_proto_rawDesc = []byte{ 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3c, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x22, 0xa8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, - 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x3c, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xd7, 0x02, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x06, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x22, 0x5f, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xa8, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x31, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x31, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x37, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x37, 0x64, 0x22, 0xd0, 0x03, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, + 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x69, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, - 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x15, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x22, 0xc9, 0x09, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, - 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x45, 0x0a, - 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x52, - 0x69, 0x73, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, - 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe9, - 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x6f, 0x6c, 0x61, - 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x70, - 0x75, 0x56, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, - 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, - 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x6c, 0x65, 0x61, 0x6b, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x61, 0x6b, 0x52, 0x69, 0x73, 0x6b, 0x12, - 0x3e, 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x70, 0x75, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, - 0x29, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xb0, 0x04, 0x0a, 0x15, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x63, 0x76, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x76, 0x43, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x63, - 0x76, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, - 0x63, 0x76, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x70, 0x75, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x06, 0x74, 0x69, 0x70, 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x69, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x74, 0x69, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x32, - 0x61, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x32, 0x61, - 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x32, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, 0x32, 0x61, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x5f, 0x63, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x62, 0x69, 0x6d, 0x6f, - 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, 0x62, 0x69, 0x6d, - 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x53, - 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, - 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, - 0x64, 0x52, 0x53, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x61, 0x74, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0d, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x70, 0x75, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x74, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0xdc, 0x05, - 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x36, 0x0a, - 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x12, 0x5d, 0x0a, 0x1c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x11, 0x62, 0x61, 0x73, 0x65, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x14, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, - 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x15, 0x63, 0x70, 0x75, 0x41, 0x64, 0x6a, 0x75, 0x73, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x59, 0x0a, - 0x1a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x18, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x13, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, - 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, - 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x42, - 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x73, - 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, - 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x48, 0x6f, 0x75, 0x72, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0a, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, - 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x70, 0x30, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, - 0x39, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x39, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, 0x39, 0x39, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x70, 0x31, 0x30, 0x30, 0x22, 0xa9, 0x07, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, - 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, - 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x67, - 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x16, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2f, 0x0a, + 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xc9, + 0x09, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, + 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x14, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, + 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, + 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, + 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, - 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x12, 0x37, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x61, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, + 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, 0x12, + 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3b, 0x0a, + 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x11, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x56, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6d, 0x6f, 0x64, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, + 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x6b, + 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x61, 0x6b, 0x52, 0x69, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x1b, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x19, 0x63, 0x70, 0x75, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x61, + 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xb0, 0x04, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x15, 0x0a, 0x06, 0x63, 0x76, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x05, 0x63, 0x76, 0x43, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x76, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x63, 0x76, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x06, 0x74, 0x69, 0x70, 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x70, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x69, 0x70, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x32, 0x61, 0x5f, 0x63, 0x70, + 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x32, 0x61, 0x43, 0x70, 0x75, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x32, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, 0x32, 0x61, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x25, + 0x0a, 0x0e, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x70, 0x75, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x10, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x65, + 0x6e, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x53, 0x6c, 0x6f, 0x70, 0x65, + 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, + 0x5f, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x52, 0x53, 0x71, + 0x75, 0x61, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x73, + 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0xdc, 0x05, 0x0a, 0x1b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x43, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, + 0x5d, 0x0a, 0x1c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x1a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x13, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x61, 0x73, + 0x65, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x34, + 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, + 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x64, 0x6a, 0x75, + 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x15, 0x63, 0x70, 0x75, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x1a, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x18, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x30, + 0x0a, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x70, 0x75, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf5, 0x01, + 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x14, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x22, 0xcb, 0x02, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, - 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x0c, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, - 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x75, 0x69, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x69, 0x55, 0x72, 0x6c, 0x2a, 0x5d, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, - 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, - 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, - 0x57, 0x5f, 0x31, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, - 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x37, 0x44, 0x10, 0x02, 0x32, 0x72, 0x0a, - 0x10, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x70, + 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, + 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x42, 0x75, 0x72, 0x73, 0x74, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, + 0x73, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x70, + 0x61, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, + 0x74, 0x69, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xd0, 0x01, + 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x0e, 0x0a, 0x02, + 0x70, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x70, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x32, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, + 0x22, 0xe9, 0x0c, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x67, + 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, + 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x54, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, + 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0c, 0x66, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, + 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, + 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x61, 0x76, 0x67, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x35, 0x30, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x37, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x39, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x39, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x39, 0x39, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x30, 0x0a, 0x15, + 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x70, 0x39, 0x39, + 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x61, + 0x78, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x32, + 0x0a, 0x16, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x70, 0x35, 0x30, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x70, 0x37, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, + 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x39, + 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x70, 0x39, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, + 0x0a, 0x16, 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x70, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x13, 0x70, 0x39, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x6d, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, + 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x22, 0x96, 0x02, 0x0a, + 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x78, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0xaa, 0x06, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x24, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, + 0x75, 0x69, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x69, + 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x14, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x35, 0x30, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x37, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x39, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x39, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x30, 0x0a, 0x15, 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x11, 0x70, 0x39, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, + 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, + 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x5f, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x44, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, + 0x12, 0x28, 0x0a, 0x10, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x05, 0x70, 0x65, + 0x65, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x05, 0x70, 0x65, 0x65, + 0x72, 0x73, 0x2a, 0x5d, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, + 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, + 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x31, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, + 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x37, 0x44, 0x10, + 0x02, 0x32, 0xf3, 0x01, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x8c, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x42, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, - 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, - 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8c, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, + 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 0x72, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, + 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2009,72 +2690,87 @@ func file_api_v1_profiling_proto_rawDescGZIP() []byte { } var file_api_v1_profiling_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_v1_profiling_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_api_v1_profiling_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_api_v1_profiling_proto_goTypes = []interface{}{ - (ProfileWindow)(0), // 0: api.v1.ProfileWindow - (*ProfilingWorkloadKey)(nil), // 1: api.v1.ProfilingWorkloadKey - (*GetWorkloadProfilesRequest)(nil), // 2: api.v1.GetWorkloadProfilesRequest - (*GetWorkloadProfilesResponse)(nil), // 3: api.v1.GetWorkloadProfilesResponse - (*WorkloadProfileResult)(nil), // 4: api.v1.WorkloadProfileResult - (*ContainerProfileResult)(nil), // 5: api.v1.ContainerProfileResult - (*ProfilingBehavior)(nil), // 6: api.v1.ProfilingBehavior - (*ProfilingSignalValues)(nil), // 7: api.v1.ProfilingSignalValues - (*ProfilingAdjustmentEvidence)(nil), // 8: api.v1.ProfilingAdjustmentEvidence - (*ProfilingAdjustment)(nil), // 9: api.v1.ProfilingAdjustment - (*ProfilingResourceRecommendation)(nil), // 10: api.v1.ProfilingResourceRecommendation - (*ProfilingClassification)(nil), // 11: api.v1.ProfilingClassification - (*ProfileDataQuality)(nil), // 12: api.v1.ProfileDataQuality - (*ProfileKey)(nil), // 13: api.v1.ProfileKey - (*MetricPercentilesCompact)(nil), // 14: api.v1.MetricPercentilesCompact - (*ContainerProfileSnapshot)(nil), // 15: api.v1.ContainerProfileSnapshot - (*WorkloadProfileSnapshot)(nil), // 16: api.v1.WorkloadProfileSnapshot - (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp - (*MetricPercentiles)(nil), // 18: api.v1.MetricPercentiles + (ProfileWindow)(0), // 0: api.v1.ProfileWindow + (*ProfilingWorkloadKey)(nil), // 1: api.v1.ProfilingWorkloadKey + (*GetWorkloadProfilesRequest)(nil), // 2: api.v1.GetWorkloadProfilesRequest + (*GetWorkloadProfilesResponse)(nil), // 3: api.v1.GetWorkloadProfilesResponse + (*GetWorkloadProfileAvailabilityRequest)(nil), // 4: api.v1.GetWorkloadProfileAvailabilityRequest + (*ProfileWindowAvailability)(nil), // 5: api.v1.ProfileWindowAvailability + (*GetWorkloadProfileAvailabilityResponse)(nil), // 6: api.v1.GetWorkloadProfileAvailabilityResponse + (*WorkloadProfileResult)(nil), // 7: api.v1.WorkloadProfileResult + (*ContainerProfileResult)(nil), // 8: api.v1.ContainerProfileResult + (*ProfilingBehavior)(nil), // 9: api.v1.ProfilingBehavior + (*ProfilingSignalValues)(nil), // 10: api.v1.ProfilingSignalValues + (*ProfilingAdjustmentEvidence)(nil), // 11: api.v1.ProfilingAdjustmentEvidence + (*ProfilingAdjustment)(nil), // 12: api.v1.ProfilingAdjustment + (*ProfilingResourceRecommendation)(nil), // 13: api.v1.ProfilingResourceRecommendation + (*ProfilingClassification)(nil), // 14: api.v1.ProfilingClassification + (*ProfileDataQuality)(nil), // 15: api.v1.ProfileDataQuality + (*ProfileKey)(nil), // 16: api.v1.ProfileKey + (*MetricPercentilesCompact)(nil), // 17: api.v1.MetricPercentilesCompact + (*ContainerProfileSnapshot)(nil), // 18: api.v1.ContainerProfileSnapshot + (*WorkloadPeerConnectivity)(nil), // 19: api.v1.WorkloadPeerConnectivity + (*WorkloadProfileSnapshot)(nil), // 20: api.v1.WorkloadProfileSnapshot + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp + (*MetricPercentiles)(nil), // 22: api.v1.MetricPercentiles + (*money.Money)(nil), // 23: google.type.Money } var file_api_v1_profiling_proto_depIdxs = []int32{ 1, // 0: api.v1.GetWorkloadProfilesRequest.workloads:type_name -> api.v1.ProfilingWorkloadKey - 17, // 1: api.v1.GetWorkloadProfilesRequest.start_time:type_name -> google.protobuf.Timestamp - 17, // 2: api.v1.GetWorkloadProfilesRequest.end_time:type_name -> google.protobuf.Timestamp - 4, // 3: api.v1.GetWorkloadProfilesResponse.workload_profiles:type_name -> api.v1.WorkloadProfileResult - 5, // 4: api.v1.WorkloadProfileResult.containers:type_name -> api.v1.ContainerProfileResult - 11, // 5: api.v1.WorkloadProfileResult.classification:type_name -> api.v1.ProfilingClassification - 12, // 6: api.v1.WorkloadProfileResult.data_quality:type_name -> api.v1.ProfileDataQuality - 18, // 7: api.v1.ContainerProfileResult.cpu_usage:type_name -> api.v1.MetricPercentiles - 18, // 8: api.v1.ContainerProfileResult.memory_usage:type_name -> api.v1.MetricPercentiles - 18, // 9: api.v1.ContainerProfileResult.gpu_usage:type_name -> api.v1.MetricPercentiles - 18, // 10: api.v1.ContainerProfileResult.gpu_vram_usage:type_name -> api.v1.MetricPercentiles - 18, // 11: api.v1.ContainerProfileResult.network_receive_bytes:type_name -> api.v1.MetricPercentiles - 18, // 12: api.v1.ContainerProfileResult.network_transmit_bytes:type_name -> api.v1.MetricPercentiles - 18, // 13: api.v1.ContainerProfileResult.fs_read_bytes:type_name -> api.v1.MetricPercentiles - 18, // 14: api.v1.ContainerProfileResult.fs_write_bytes:type_name -> api.v1.MetricPercentiles - 10, // 15: api.v1.ContainerProfileResult.recommendation:type_name -> api.v1.ProfilingResourceRecommendation - 7, // 16: api.v1.ContainerProfileResult.signals:type_name -> api.v1.ProfilingSignalValues - 8, // 17: api.v1.ContainerProfileResult.adjustments:type_name -> api.v1.ProfilingAdjustmentEvidence - 6, // 18: api.v1.ContainerProfileResult.behavior:type_name -> api.v1.ProfilingBehavior - 9, // 19: api.v1.ProfilingAdjustmentEvidence.percentile_overrides_applied:type_name -> api.v1.ProfilingAdjustment - 9, // 20: api.v1.ProfilingAdjustmentEvidence.cpu_adjustments_applied:type_name -> api.v1.ProfilingAdjustment - 9, // 21: api.v1.ProfilingAdjustmentEvidence.memory_adjustments_applied:type_name -> api.v1.ProfilingAdjustment - 14, // 22: api.v1.ContainerProfileSnapshot.cpu_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 23: api.v1.ContainerProfileSnapshot.memory_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 24: api.v1.ContainerProfileSnapshot.gpu_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 25: api.v1.ContainerProfileSnapshot.gpu_vram_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 26: api.v1.ContainerProfileSnapshot.network_receive_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 27: api.v1.ContainerProfileSnapshot.network_transmit_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 28: api.v1.ContainerProfileSnapshot.fs_read_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 29: api.v1.ContainerProfileSnapshot.fs_write_bytes:type_name -> api.v1.MetricPercentilesCompact - 10, // 30: api.v1.ContainerProfileSnapshot.recommendation:type_name -> api.v1.ProfilingResourceRecommendation - 13, // 31: api.v1.WorkloadProfileSnapshot.key:type_name -> api.v1.ProfileKey - 15, // 32: api.v1.WorkloadProfileSnapshot.containers:type_name -> api.v1.ContainerProfileSnapshot - 6, // 33: api.v1.WorkloadProfileSnapshot.behavior:type_name -> api.v1.ProfilingBehavior - 12, // 34: api.v1.WorkloadProfileSnapshot.data_quality:type_name -> api.v1.ProfileDataQuality - 17, // 35: api.v1.WorkloadProfileSnapshot.computed_at:type_name -> google.protobuf.Timestamp - 2, // 36: api.v1.ProfilingService.GetWorkloadProfiles:input_type -> api.v1.GetWorkloadProfilesRequest - 3, // 37: api.v1.ProfilingService.GetWorkloadProfiles:output_type -> api.v1.GetWorkloadProfilesResponse - 37, // [37:38] is the sub-list for method output_type - 36, // [36:37] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 21, // 1: api.v1.GetWorkloadProfilesRequest.start_time:type_name -> google.protobuf.Timestamp + 21, // 2: api.v1.GetWorkloadProfilesRequest.end_time:type_name -> google.protobuf.Timestamp + 0, // 3: api.v1.GetWorkloadProfilesRequest.window:type_name -> api.v1.ProfileWindow + 7, // 4: api.v1.GetWorkloadProfilesResponse.workload_profiles:type_name -> api.v1.WorkloadProfileResult + 21, // 5: api.v1.ProfileWindowAvailability.latest_computed_at:type_name -> google.protobuf.Timestamp + 5, // 6: api.v1.GetWorkloadProfileAvailabilityResponse.window_1d:type_name -> api.v1.ProfileWindowAvailability + 5, // 7: api.v1.GetWorkloadProfileAvailabilityResponse.window_7d:type_name -> api.v1.ProfileWindowAvailability + 8, // 8: api.v1.WorkloadProfileResult.containers:type_name -> api.v1.ContainerProfileResult + 14, // 9: api.v1.WorkloadProfileResult.classification:type_name -> api.v1.ProfilingClassification + 15, // 10: api.v1.WorkloadProfileResult.data_quality:type_name -> api.v1.ProfileDataQuality + 21, // 11: api.v1.WorkloadProfileResult.window_start:type_name -> google.protobuf.Timestamp + 21, // 12: api.v1.WorkloadProfileResult.window_end:type_name -> google.protobuf.Timestamp + 22, // 13: api.v1.ContainerProfileResult.cpu_usage:type_name -> api.v1.MetricPercentiles + 22, // 14: api.v1.ContainerProfileResult.memory_usage:type_name -> api.v1.MetricPercentiles + 22, // 15: api.v1.ContainerProfileResult.gpu_usage:type_name -> api.v1.MetricPercentiles + 22, // 16: api.v1.ContainerProfileResult.gpu_vram_usage:type_name -> api.v1.MetricPercentiles + 22, // 17: api.v1.ContainerProfileResult.network_receive_bytes:type_name -> api.v1.MetricPercentiles + 22, // 18: api.v1.ContainerProfileResult.network_transmit_bytes:type_name -> api.v1.MetricPercentiles + 22, // 19: api.v1.ContainerProfileResult.fs_read_bytes:type_name -> api.v1.MetricPercentiles + 22, // 20: api.v1.ContainerProfileResult.fs_write_bytes:type_name -> api.v1.MetricPercentiles + 13, // 21: api.v1.ContainerProfileResult.recommendation:type_name -> api.v1.ProfilingResourceRecommendation + 10, // 22: api.v1.ContainerProfileResult.signals:type_name -> api.v1.ProfilingSignalValues + 11, // 23: api.v1.ContainerProfileResult.adjustments:type_name -> api.v1.ProfilingAdjustmentEvidence + 9, // 24: api.v1.ContainerProfileResult.behavior:type_name -> api.v1.ProfilingBehavior + 12, // 25: api.v1.ProfilingAdjustmentEvidence.percentile_overrides_applied:type_name -> api.v1.ProfilingAdjustment + 12, // 26: api.v1.ProfilingAdjustmentEvidence.cpu_adjustments_applied:type_name -> api.v1.ProfilingAdjustment + 12, // 27: api.v1.ProfilingAdjustmentEvidence.memory_adjustments_applied:type_name -> api.v1.ProfilingAdjustment + 17, // 28: api.v1.ContainerProfileSnapshot.cpu_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 29: api.v1.ContainerProfileSnapshot.memory_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 30: api.v1.ContainerProfileSnapshot.gpu_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 31: api.v1.ContainerProfileSnapshot.gpu_vram_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 32: api.v1.ContainerProfileSnapshot.network_receive_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 33: api.v1.ContainerProfileSnapshot.network_transmit_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 34: api.v1.ContainerProfileSnapshot.fs_read_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 35: api.v1.ContainerProfileSnapshot.fs_write_bytes:type_name -> api.v1.MetricPercentilesCompact + 13, // 36: api.v1.ContainerProfileSnapshot.recommendation:type_name -> api.v1.ProfilingResourceRecommendation + 23, // 37: api.v1.WorkloadPeerConnectivity.cost:type_name -> google.type.Money + 16, // 38: api.v1.WorkloadProfileSnapshot.key:type_name -> api.v1.ProfileKey + 18, // 39: api.v1.WorkloadProfileSnapshot.containers:type_name -> api.v1.ContainerProfileSnapshot + 9, // 40: api.v1.WorkloadProfileSnapshot.behavior:type_name -> api.v1.ProfilingBehavior + 15, // 41: api.v1.WorkloadProfileSnapshot.data_quality:type_name -> api.v1.ProfileDataQuality + 21, // 42: api.v1.WorkloadProfileSnapshot.computed_at:type_name -> google.protobuf.Timestamp + 19, // 43: api.v1.WorkloadProfileSnapshot.peers:type_name -> api.v1.WorkloadPeerConnectivity + 2, // 44: api.v1.ProfilingService.GetWorkloadProfiles:input_type -> api.v1.GetWorkloadProfilesRequest + 4, // 45: api.v1.ProfilingService.GetWorkloadProfileAvailability:input_type -> api.v1.GetWorkloadProfileAvailabilityRequest + 3, // 46: api.v1.ProfilingService.GetWorkloadProfiles:output_type -> api.v1.GetWorkloadProfilesResponse + 6, // 47: api.v1.ProfilingService.GetWorkloadProfileAvailability:output_type -> api.v1.GetWorkloadProfileAvailabilityResponse + 46, // [46:48] is the sub-list for method output_type + 44, // [44:46] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_api_v1_profiling_proto_init() } @@ -2121,7 +2817,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadProfileResult); i { + switch v := v.(*GetWorkloadProfileAvailabilityRequest); i { case 0: return &v.state case 1: @@ -2133,7 +2829,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerProfileResult); i { + switch v := v.(*ProfileWindowAvailability); i { case 0: return &v.state case 1: @@ -2145,7 +2841,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingBehavior); i { + switch v := v.(*GetWorkloadProfileAvailabilityResponse); i { case 0: return &v.state case 1: @@ -2157,7 +2853,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingSignalValues); i { + switch v := v.(*WorkloadProfileResult); i { case 0: return &v.state case 1: @@ -2169,7 +2865,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingAdjustmentEvidence); i { + switch v := v.(*ContainerProfileResult); i { case 0: return &v.state case 1: @@ -2181,7 +2877,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingAdjustment); i { + switch v := v.(*ProfilingBehavior); i { case 0: return &v.state case 1: @@ -2193,7 +2889,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingResourceRecommendation); i { + switch v := v.(*ProfilingSignalValues); i { case 0: return &v.state case 1: @@ -2205,7 +2901,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingClassification); i { + switch v := v.(*ProfilingAdjustmentEvidence); i { case 0: return &v.state case 1: @@ -2217,7 +2913,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileDataQuality); i { + switch v := v.(*ProfilingAdjustment); i { case 0: return &v.state case 1: @@ -2229,7 +2925,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileKey); i { + switch v := v.(*ProfilingResourceRecommendation); i { case 0: return &v.state case 1: @@ -2241,7 +2937,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricPercentilesCompact); i { + switch v := v.(*ProfilingClassification); i { case 0: return &v.state case 1: @@ -2253,7 +2949,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerProfileSnapshot); i { + switch v := v.(*ProfileDataQuality); i { case 0: return &v.state case 1: @@ -2265,6 +2961,54 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProfileKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricPercentilesCompact); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerProfileSnapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPeerConnectivity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkloadProfileSnapshot); i { case 0: return &v.state @@ -2284,7 +3028,7 @@ func file_api_v1_profiling_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_profiling_proto_rawDesc, NumEnums: 1, - NumMessages: 16, + NumMessages: 20, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/gen/api/v1/profiling_grpc.pb.go b/internal/gen/api/v1/profiling_grpc.pb.go index b7af3ee..d61d90b 100644 --- a/internal/gen/api/v1/profiling_grpc.pb.go +++ b/internal/gen/api/v1/profiling_grpc.pb.go @@ -19,7 +19,8 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - ProfilingService_GetWorkloadProfiles_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfiles" + ProfilingService_GetWorkloadProfiles_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfiles" + ProfilingService_GetWorkloadProfileAvailability_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfileAvailability" ) // ProfilingServiceClient is the client API for ProfilingService service. @@ -27,6 +28,11 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ProfilingServiceClient interface { GetWorkloadProfiles(ctx context.Context, in *GetWorkloadProfilesRequest, opts ...grpc.CallOption) (*GetWorkloadProfilesResponse, error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(ctx context.Context, in *GetWorkloadProfileAvailabilityRequest, opts ...grpc.CallOption) (*GetWorkloadProfileAvailabilityResponse, error) } type profilingServiceClient struct { @@ -46,11 +52,25 @@ func (c *profilingServiceClient) GetWorkloadProfiles(ctx context.Context, in *Ge return out, nil } +func (c *profilingServiceClient) GetWorkloadProfileAvailability(ctx context.Context, in *GetWorkloadProfileAvailabilityRequest, opts ...grpc.CallOption) (*GetWorkloadProfileAvailabilityResponse, error) { + out := new(GetWorkloadProfileAvailabilityResponse) + err := c.cc.Invoke(ctx, ProfilingService_GetWorkloadProfileAvailability_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ProfilingServiceServer is the server API for ProfilingService service. // All implementations must embed UnimplementedProfilingServiceServer // for forward compatibility type ProfilingServiceServer interface { GetWorkloadProfiles(context.Context, *GetWorkloadProfilesRequest) (*GetWorkloadProfilesResponse, error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *GetWorkloadProfileAvailabilityRequest) (*GetWorkloadProfileAvailabilityResponse, error) mustEmbedUnimplementedProfilingServiceServer() } @@ -61,6 +81,9 @@ type UnimplementedProfilingServiceServer struct { func (UnimplementedProfilingServiceServer) GetWorkloadProfiles(context.Context, *GetWorkloadProfilesRequest) (*GetWorkloadProfilesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadProfiles not implemented") } +func (UnimplementedProfilingServiceServer) GetWorkloadProfileAvailability(context.Context, *GetWorkloadProfileAvailabilityRequest) (*GetWorkloadProfileAvailabilityResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadProfileAvailability not implemented") +} func (UnimplementedProfilingServiceServer) mustEmbedUnimplementedProfilingServiceServer() {} // UnsafeProfilingServiceServer may be embedded to opt out of forward compatibility for this service. @@ -92,6 +115,24 @@ func _ProfilingService_GetWorkloadProfiles_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ProfilingService_GetWorkloadProfileAvailability_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkloadProfileAvailabilityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProfilingServiceServer).GetWorkloadProfileAvailability(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProfilingService_GetWorkloadProfileAvailability_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProfilingServiceServer).GetWorkloadProfileAvailability(ctx, req.(*GetWorkloadProfileAvailabilityRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ProfilingService_ServiceDesc is the grpc.ServiceDesc for ProfilingService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -103,6 +144,10 @@ var ProfilingService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetWorkloadProfiles", Handler: _ProfilingService_GetWorkloadProfiles_Handler, }, + { + MethodName: "GetWorkloadProfileAvailability", + Handler: _ProfilingService_GetWorkloadProfileAvailability_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "api/v1/profiling.proto", diff --git a/internal/gen/api/v1/recommendation.pb.go b/internal/gen/api/v1/recommendation.pb.go index 1eb7c9f..1935dd0 100644 --- a/internal/gen/api/v1/recommendation.pb.go +++ b/internal/gen/api/v1/recommendation.pb.go @@ -10,7 +10,7 @@ import ( money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" + _ "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -121,6 +121,109 @@ func (ActionToTake) EnumDescriptor() ([]byte, []int) { return file_api_v1_recommendation_proto_rawDescGZIP(), []int{1} } +// MutationAction is the per-element analog of ActionToTake for list/map-shaped +// fields (env vars, nodeSelector, tolerations, command/arg flags). The action +// lives on each element so the operator can merge deltas into the live spec +// instead of replacing the whole list. IGNORE is implicit: omit the element. +type MutationAction int32 + +const ( + MutationAction_MUTATION_ACTION_UNSPECIFIED MutationAction = 0 + MutationAction_MUTATION_ACTION_UPSERT MutationAction = 1 // add the element, or replace the one matching the merge key + MutationAction_MUTATION_ACTION_REMOVE MutationAction = 2 // delete the element matching the merge key +) + +// Enum value maps for MutationAction. +var ( + MutationAction_name = map[int32]string{ + 0: "MUTATION_ACTION_UNSPECIFIED", + 1: "MUTATION_ACTION_UPSERT", + 2: "MUTATION_ACTION_REMOVE", + } + MutationAction_value = map[string]int32{ + "MUTATION_ACTION_UNSPECIFIED": 0, + "MUTATION_ACTION_UPSERT": 1, + "MUTATION_ACTION_REMOVE": 2, + } +) + +func (x MutationAction) Enum() *MutationAction { + p := new(MutationAction) + *p = x + return p +} + +func (x MutationAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MutationAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[2].Descriptor() +} + +func (MutationAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[2] +} + +func (x MutationAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MutationAction.Descriptor instead. +func (MutationAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{2} +} + +// ArgTarget selects which container field a CommandArgMutation edits. +type ArgTarget int32 + +const ( + ArgTarget_ARG_TARGET_UNSPECIFIED ArgTarget = 0 + ArgTarget_ARG_TARGET_ARGS ArgTarget = 1 // container.args + ArgTarget_ARG_TARGET_COMMAND ArgTarget = 2 // container.command +) + +// Enum value maps for ArgTarget. +var ( + ArgTarget_name = map[int32]string{ + 0: "ARG_TARGET_UNSPECIFIED", + 1: "ARG_TARGET_ARGS", + 2: "ARG_TARGET_COMMAND", + } + ArgTarget_value = map[string]int32{ + "ARG_TARGET_UNSPECIFIED": 0, + "ARG_TARGET_ARGS": 1, + "ARG_TARGET_COMMAND": 2, + } +) + +func (x ArgTarget) Enum() *ArgTarget { + p := new(ArgTarget) + *p = x + return p +} + +func (x ArgTarget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ArgTarget) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[3].Descriptor() +} + +func (ArgTarget) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[3] +} + +func (x ArgTarget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ArgTarget.Descriptor instead. +func (ArgTarget) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{3} +} + type CostPeriod int32 const ( @@ -154,11 +257,11 @@ func (x CostPeriod) String() string { } func (CostPeriod) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[2].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[4].Descriptor() } func (CostPeriod) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[2] + return &file_api_v1_recommendation_proto_enumTypes[4] } func (x CostPeriod) Number() protoreflect.EnumNumber { @@ -167,7 +270,205 @@ func (x CostPeriod) Number() protoreflect.EnumNumber { // Deprecated: Use CostPeriod.Descriptor instead. func (CostPeriod) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{2} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{4} +} + +type ReasoningInsightSeverity int32 + +const ( + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_UNSPECIFIED ReasoningInsightSeverity = 0 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_INFO ReasoningInsightSeverity = 1 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_LOW ReasoningInsightSeverity = 2 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_MEDIUM ReasoningInsightSeverity = 3 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_HIGH ReasoningInsightSeverity = 4 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_CRITICAL ReasoningInsightSeverity = 5 +) + +// Enum value maps for ReasoningInsightSeverity. +var ( + ReasoningInsightSeverity_name = map[int32]string{ + 0: "REASONING_INSIGHT_SEVERITY_UNSPECIFIED", + 1: "REASONING_INSIGHT_SEVERITY_INFO", + 2: "REASONING_INSIGHT_SEVERITY_LOW", + 3: "REASONING_INSIGHT_SEVERITY_MEDIUM", + 4: "REASONING_INSIGHT_SEVERITY_HIGH", + 5: "REASONING_INSIGHT_SEVERITY_CRITICAL", + } + ReasoningInsightSeverity_value = map[string]int32{ + "REASONING_INSIGHT_SEVERITY_UNSPECIFIED": 0, + "REASONING_INSIGHT_SEVERITY_INFO": 1, + "REASONING_INSIGHT_SEVERITY_LOW": 2, + "REASONING_INSIGHT_SEVERITY_MEDIUM": 3, + "REASONING_INSIGHT_SEVERITY_HIGH": 4, + "REASONING_INSIGHT_SEVERITY_CRITICAL": 5, + } +) + +func (x ReasoningInsightSeverity) Enum() *ReasoningInsightSeverity { + p := new(ReasoningInsightSeverity) + *p = x + return p +} + +func (x ReasoningInsightSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningInsightSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[5].Descriptor() +} + +func (ReasoningInsightSeverity) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[5] +} + +func (x ReasoningInsightSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningInsightSeverity.Descriptor instead. +func (ReasoningInsightSeverity) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{5} +} + +type ReasoningInsightType int32 + +const ( + ReasoningInsightType_REASONING_INSIGHT_TYPE_UNSPECIFIED ReasoningInsightType = 0 + ReasoningInsightType_REASONING_INSIGHT_TYPE_PATTERN ReasoningInsightType = 1 + ReasoningInsightType_REASONING_INSIGHT_TYPE_ANOMALY ReasoningInsightType = 2 + ReasoningInsightType_REASONING_INSIGHT_TYPE_TREND ReasoningInsightType = 3 + ReasoningInsightType_REASONING_INSIGHT_TYPE_OPTIMIZATION ReasoningInsightType = 4 + ReasoningInsightType_REASONING_INSIGHT_TYPE_RISK ReasoningInsightType = 5 + ReasoningInsightType_REASONING_INSIGHT_TYPE_PROFILE ReasoningInsightType = 6 +) + +// Enum value maps for ReasoningInsightType. +var ( + ReasoningInsightType_name = map[int32]string{ + 0: "REASONING_INSIGHT_TYPE_UNSPECIFIED", + 1: "REASONING_INSIGHT_TYPE_PATTERN", + 2: "REASONING_INSIGHT_TYPE_ANOMALY", + 3: "REASONING_INSIGHT_TYPE_TREND", + 4: "REASONING_INSIGHT_TYPE_OPTIMIZATION", + 5: "REASONING_INSIGHT_TYPE_RISK", + 6: "REASONING_INSIGHT_TYPE_PROFILE", + } + ReasoningInsightType_value = map[string]int32{ + "REASONING_INSIGHT_TYPE_UNSPECIFIED": 0, + "REASONING_INSIGHT_TYPE_PATTERN": 1, + "REASONING_INSIGHT_TYPE_ANOMALY": 2, + "REASONING_INSIGHT_TYPE_TREND": 3, + "REASONING_INSIGHT_TYPE_OPTIMIZATION": 4, + "REASONING_INSIGHT_TYPE_RISK": 5, + "REASONING_INSIGHT_TYPE_PROFILE": 6, + } +) + +func (x ReasoningInsightType) Enum() *ReasoningInsightType { + p := new(ReasoningInsightType) + *p = x + return p +} + +func (x ReasoningInsightType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningInsightType) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[6].Descriptor() +} + +func (ReasoningInsightType) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[6] +} + +func (x ReasoningInsightType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningInsightType.Descriptor instead. +func (ReasoningInsightType) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{6} +} + +type ReasoningDecisionKind int32 + +const ( + ReasoningDecisionKind_REASONING_DECISION_KIND_UNSPECIFIED ReasoningDecisionKind = 0 + ReasoningDecisionKind_REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE ReasoningDecisionKind = 1 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_CONFLICT ReasoningDecisionKind = 2 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_FLOOR ReasoningDecisionKind = 3 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_CEILING ReasoningDecisionKind = 4 + ReasoningDecisionKind_REASONING_DECISION_KIND_PLATFORM_FLOOR ReasoningDecisionKind = 5 + ReasoningDecisionKind_REASONING_DECISION_KIND_SAFETY_FLOOR ReasoningDecisionKind = 6 + ReasoningDecisionKind_REASONING_DECISION_KIND_SUPPRESSION ReasoningDecisionKind = 7 + ReasoningDecisionKind_REASONING_DECISION_KIND_FEATURE_DOWNGRADE ReasoningDecisionKind = 8 + ReasoningDecisionKind_REASONING_DECISION_KIND_MODIFICATION ReasoningDecisionKind = 9 + ReasoningDecisionKind_REASONING_DECISION_KIND_NORMALIZATION ReasoningDecisionKind = 10 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR ReasoningDecisionKind = 11 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_LIMIT_CEILING ReasoningDecisionKind = 12 +) + +// Enum value maps for ReasoningDecisionKind. +var ( + ReasoningDecisionKind_name = map[int32]string{ + 0: "REASONING_DECISION_KIND_UNSPECIFIED", + 1: "REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE", + 2: "REASONING_DECISION_KIND_POLICY_CONFLICT", + 3: "REASONING_DECISION_KIND_POLICY_FLOOR", + 4: "REASONING_DECISION_KIND_POLICY_CEILING", + 5: "REASONING_DECISION_KIND_PLATFORM_FLOOR", + 6: "REASONING_DECISION_KIND_SAFETY_FLOOR", + 7: "REASONING_DECISION_KIND_SUPPRESSION", + 8: "REASONING_DECISION_KIND_FEATURE_DOWNGRADE", + 9: "REASONING_DECISION_KIND_MODIFICATION", + 10: "REASONING_DECISION_KIND_NORMALIZATION", + 11: "REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR", + 12: "REASONING_DECISION_KIND_POLICY_LIMIT_CEILING", + } + ReasoningDecisionKind_value = map[string]int32{ + "REASONING_DECISION_KIND_UNSPECIFIED": 0, + "REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE": 1, + "REASONING_DECISION_KIND_POLICY_CONFLICT": 2, + "REASONING_DECISION_KIND_POLICY_FLOOR": 3, + "REASONING_DECISION_KIND_POLICY_CEILING": 4, + "REASONING_DECISION_KIND_PLATFORM_FLOOR": 5, + "REASONING_DECISION_KIND_SAFETY_FLOOR": 6, + "REASONING_DECISION_KIND_SUPPRESSION": 7, + "REASONING_DECISION_KIND_FEATURE_DOWNGRADE": 8, + "REASONING_DECISION_KIND_MODIFICATION": 9, + "REASONING_DECISION_KIND_NORMALIZATION": 10, + "REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR": 11, + "REASONING_DECISION_KIND_POLICY_LIMIT_CEILING": 12, + } +) + +func (x ReasoningDecisionKind) Enum() *ReasoningDecisionKind { + p := new(ReasoningDecisionKind) + *p = x + return p +} + +func (x ReasoningDecisionKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningDecisionKind) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[7].Descriptor() +} + +func (ReasoningDecisionKind) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[7] +} + +func (x ReasoningDecisionKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningDecisionKind.Descriptor instead. +func (ReasoningDecisionKind) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{7} } type LiveMigDeletionPropagation int32 @@ -206,11 +507,11 @@ func (x LiveMigDeletionPropagation) String() string { } func (LiveMigDeletionPropagation) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[3].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[8].Descriptor() } func (LiveMigDeletionPropagation) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[3] + return &file_api_v1_recommendation_proto_enumTypes[8] } func (x LiveMigDeletionPropagation) Number() protoreflect.EnumNumber { @@ -219,7 +520,7 @@ func (x LiveMigDeletionPropagation) Number() protoreflect.EnumNumber { // Deprecated: Use LiveMigDeletionPropagation.Descriptor instead. func (LiveMigDeletionPropagation) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{3} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{8} } type RecommendationStatus int32 @@ -290,11 +591,11 @@ func (x RecommendationStatus) String() string { } func (RecommendationStatus) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[4].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[9].Descriptor() } func (RecommendationStatus) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[4] + return &file_api_v1_recommendation_proto_enumTypes[9] } func (x RecommendationStatus) Number() protoreflect.EnumNumber { @@ -303,7 +604,379 @@ func (x RecommendationStatus) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationStatus.Descriptor instead. func (RecommendationStatus) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{4} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{9} +} + +// NodeGroupCheckpointState classifies a node group's checkpoint-restore status. +type NodeGroupCheckpointState int32 + +const ( + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED NodeGroupCheckpointState = 0 + // Node group is not DevZero/dzkarp-managed (no matching node policy node + // pool). Customer is responsible for adding the checkpoint-node label. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED NodeGroupCheckpointState = 1 + // dz-managed (matches a policy's node pool) but no active node policy + // target for this cluster. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY NodeGroupCheckpointState = 2 + // dz-managed + active policy, but the policy lacks the + // dakr.devzero.io/checkpoint-node label. Eligible for the one-click CTA. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL NodeGroupCheckpointState = 3 + // dz-managed + active policy + label present. Intent declared; actual CRIU + // capability not (yet) verified. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_CONFIGURED NodeGroupCheckpointState = 4 + // CONFIGURED and CRIU verified present on the node group's nodes. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_ENABLED NodeGroupCheckpointState = 5 +) + +// Enum value maps for NodeGroupCheckpointState. +var ( + NodeGroupCheckpointState_name = map[int32]string{ + 0: "NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED", + 1: "NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED", + 2: "NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY", + 3: "NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL", + 4: "NODE_GROUP_CHECKPOINT_STATE_CONFIGURED", + 5: "NODE_GROUP_CHECKPOINT_STATE_ENABLED", + } + NodeGroupCheckpointState_value = map[string]int32{ + "NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED": 0, + "NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED": 1, + "NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY": 2, + "NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL": 3, + "NODE_GROUP_CHECKPOINT_STATE_CONFIGURED": 4, + "NODE_GROUP_CHECKPOINT_STATE_ENABLED": 5, + } +) + +func (x NodeGroupCheckpointState) Enum() *NodeGroupCheckpointState { + p := new(NodeGroupCheckpointState) + *p = x + return p +} + +func (x NodeGroupCheckpointState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NodeGroupCheckpointState) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() +} + +func (NodeGroupCheckpointState) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[10] +} + +func (x NodeGroupCheckpointState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NodeGroupCheckpointState.Descriptor instead. +func (NodeGroupCheckpointState) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{10} +} + +// CheckpointReason explains *why* a node group is stuck in CONFIGURED — surfaced +// as a tooltip modifier line, never as a distinct chip. Multiple reasons can be +// true at once; backend picks the most actionable one. +type CheckpointReason int32 + +const ( + CheckpointReason_CHECKPOINT_REASON_UNSPECIFIED CheckpointReason = 0 + // dakr-operator on this cluster predates per-node SSA fan-out. Existing + // nodes won't be labeled until the operator upgrades. + CheckpointReason_CHECKPOINT_REASON_OPERATOR_OUTDATED CheckpointReason = 1 + // Label applied, but no node has reported criu_configured=true yet. Most + // likely the customer hasn't deployed (or hasn't finished deploying) the + // CRIU DaemonSet. + CheckpointReason_CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED CheckpointReason = 2 + // Some nodes joined recently (<5 min) and haven't been probed yet. State + // will resolve on the next operator tick. + CheckpointReason_CHECKPOINT_REASON_NEW_NODES_PROBING CheckpointReason = 3 +) + +// Enum value maps for CheckpointReason. +var ( + CheckpointReason_name = map[int32]string{ + 0: "CHECKPOINT_REASON_UNSPECIFIED", + 1: "CHECKPOINT_REASON_OPERATOR_OUTDATED", + 2: "CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED", + 3: "CHECKPOINT_REASON_NEW_NODES_PROBING", + } + CheckpointReason_value = map[string]int32{ + "CHECKPOINT_REASON_UNSPECIFIED": 0, + "CHECKPOINT_REASON_OPERATOR_OUTDATED": 1, + "CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED": 2, + "CHECKPOINT_REASON_NEW_NODES_PROBING": 3, + } +) + +func (x CheckpointReason) Enum() *CheckpointReason { + p := new(CheckpointReason) + *p = x + return p +} + +func (x CheckpointReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CheckpointReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[11].Descriptor() +} + +func (CheckpointReason) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[11] +} + +func (x CheckpointReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CheckpointReason.Descriptor instead. +func (CheckpointReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{11} +} + +// SuggestionGroup is the policy component a suggestion belongs to. The UI groups cards +// by this axis. +type SuggestionGroup int32 + +const ( + SuggestionGroup_SUGGESTION_GROUP_UNSPECIFIED SuggestionGroup = 0 + SuggestionGroup_SUGGESTION_GROUP_DISRUPTION SuggestionGroup = 1 + SuggestionGroup_SUGGESTION_GROUP_REQUIREMENTS SuggestionGroup = 2 + SuggestionGroup_SUGGESTION_GROUP_CAPACITY_TYPE SuggestionGroup = 3 + SuggestionGroup_SUGGESTION_GROUP_ZONES SuggestionGroup = 4 + SuggestionGroup_SUGGESTION_GROUP_LIMITS SuggestionGroup = 5 + SuggestionGroup_SUGGESTION_GROUP_NODECLASS SuggestionGroup = 6 + SuggestionGroup_SUGGESTION_GROUP_COMPATIBILITY SuggestionGroup = 7 + // SUGGESTION_GROUP_COVERAGE is the one group whose suggestions do not mutate this + // NodePolicy at all: field_path, current_value_yaml and suggested_value_yaml are all + // empty, and the suggestion never resolves to an Apply(). It surfaces workloads + // attributed to this pool that have no legacy (mpav1) WorkloadRecommendationPolicy + // coverage, which is a gap in DevZero's separate workload-optimization product, not a + // NodePolicy misconfiguration. + SuggestionGroup_SUGGESTION_GROUP_COVERAGE SuggestionGroup = 8 +) + +// Enum value maps for SuggestionGroup. +var ( + SuggestionGroup_name = map[int32]string{ + 0: "SUGGESTION_GROUP_UNSPECIFIED", + 1: "SUGGESTION_GROUP_DISRUPTION", + 2: "SUGGESTION_GROUP_REQUIREMENTS", + 3: "SUGGESTION_GROUP_CAPACITY_TYPE", + 4: "SUGGESTION_GROUP_ZONES", + 5: "SUGGESTION_GROUP_LIMITS", + 6: "SUGGESTION_GROUP_NODECLASS", + 7: "SUGGESTION_GROUP_COMPATIBILITY", + 8: "SUGGESTION_GROUP_COVERAGE", + } + SuggestionGroup_value = map[string]int32{ + "SUGGESTION_GROUP_UNSPECIFIED": 0, + "SUGGESTION_GROUP_DISRUPTION": 1, + "SUGGESTION_GROUP_REQUIREMENTS": 2, + "SUGGESTION_GROUP_CAPACITY_TYPE": 3, + "SUGGESTION_GROUP_ZONES": 4, + "SUGGESTION_GROUP_LIMITS": 5, + "SUGGESTION_GROUP_NODECLASS": 6, + "SUGGESTION_GROUP_COMPATIBILITY": 7, + "SUGGESTION_GROUP_COVERAGE": 8, + } +) + +func (x SuggestionGroup) Enum() *SuggestionGroup { + p := new(SuggestionGroup) + *p = x + return p +} + +func (x SuggestionGroup) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionGroup) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[12].Descriptor() +} + +func (SuggestionGroup) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[12] +} + +func (x SuggestionGroup) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionGroup.Descriptor instead. +func (SuggestionGroup) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{12} +} + +// SuggestionFlavor is the benefit a suggestion delivers. The UI renders this as a chip +// alongside severity. +type SuggestionFlavor int32 + +const ( + SuggestionFlavor_SUGGESTION_FLAVOR_UNSPECIFIED SuggestionFlavor = 0 + SuggestionFlavor_SUGGESTION_FLAVOR_COST SuggestionFlavor = 1 + SuggestionFlavor_SUGGESTION_FLAVOR_RELIABILITY SuggestionFlavor = 2 + SuggestionFlavor_SUGGESTION_FLAVOR_PERFORMANCE SuggestionFlavor = 3 + SuggestionFlavor_SUGGESTION_FLAVOR_SECURITY SuggestionFlavor = 4 + SuggestionFlavor_SUGGESTION_FLAVOR_BEST_PRACTICE SuggestionFlavor = 5 + SuggestionFlavor_SUGGESTION_FLAVOR_COMPATIBILITY SuggestionFlavor = 6 +) + +// Enum value maps for SuggestionFlavor. +var ( + SuggestionFlavor_name = map[int32]string{ + 0: "SUGGESTION_FLAVOR_UNSPECIFIED", + 1: "SUGGESTION_FLAVOR_COST", + 2: "SUGGESTION_FLAVOR_RELIABILITY", + 3: "SUGGESTION_FLAVOR_PERFORMANCE", + 4: "SUGGESTION_FLAVOR_SECURITY", + 5: "SUGGESTION_FLAVOR_BEST_PRACTICE", + 6: "SUGGESTION_FLAVOR_COMPATIBILITY", + } + SuggestionFlavor_value = map[string]int32{ + "SUGGESTION_FLAVOR_UNSPECIFIED": 0, + "SUGGESTION_FLAVOR_COST": 1, + "SUGGESTION_FLAVOR_RELIABILITY": 2, + "SUGGESTION_FLAVOR_PERFORMANCE": 3, + "SUGGESTION_FLAVOR_SECURITY": 4, + "SUGGESTION_FLAVOR_BEST_PRACTICE": 5, + "SUGGESTION_FLAVOR_COMPATIBILITY": 6, + } +) + +func (x SuggestionFlavor) Enum() *SuggestionFlavor { + p := new(SuggestionFlavor) + *p = x + return p +} + +func (x SuggestionFlavor) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionFlavor) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[13].Descriptor() +} + +func (SuggestionFlavor) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[13] +} + +func (x SuggestionFlavor) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionFlavor.Descriptor instead. +func (SuggestionFlavor) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{13} +} + +type SuggestionSeverity int32 + +const ( + SuggestionSeverity_SUGGESTION_SEVERITY_UNSPECIFIED SuggestionSeverity = 0 + SuggestionSeverity_SUGGESTION_SEVERITY_INFO SuggestionSeverity = 1 + SuggestionSeverity_SUGGESTION_SEVERITY_RECOMMENDED SuggestionSeverity = 2 + SuggestionSeverity_SUGGESTION_SEVERITY_STRONG SuggestionSeverity = 3 +) + +// Enum value maps for SuggestionSeverity. +var ( + SuggestionSeverity_name = map[int32]string{ + 0: "SUGGESTION_SEVERITY_UNSPECIFIED", + 1: "SUGGESTION_SEVERITY_INFO", + 2: "SUGGESTION_SEVERITY_RECOMMENDED", + 3: "SUGGESTION_SEVERITY_STRONG", + } + SuggestionSeverity_value = map[string]int32{ + "SUGGESTION_SEVERITY_UNSPECIFIED": 0, + "SUGGESTION_SEVERITY_INFO": 1, + "SUGGESTION_SEVERITY_RECOMMENDED": 2, + "SUGGESTION_SEVERITY_STRONG": 3, + } +) + +func (x SuggestionSeverity) Enum() *SuggestionSeverity { + p := new(SuggestionSeverity) + *p = x + return p +} + +func (x SuggestionSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[14].Descriptor() +} + +func (SuggestionSeverity) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[14] +} + +func (x SuggestionSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionSeverity.Descriptor instead. +func (SuggestionSeverity) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{14} +} + +// EvidenceScope records what population an evidence item was measured against. POOL means +// the nodes attributed to this policy's live NodePools; CLUSTER is the cold-start +// fallback for policies with no live nodes yet. +type EvidenceScope int32 + +const ( + EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED EvidenceScope = 0 + EvidenceScope_EVIDENCE_SCOPE_POOL EvidenceScope = 1 + EvidenceScope_EVIDENCE_SCOPE_CLUSTER EvidenceScope = 2 +) + +// Enum value maps for EvidenceScope. +var ( + EvidenceScope_name = map[int32]string{ + 0: "EVIDENCE_SCOPE_UNSPECIFIED", + 1: "EVIDENCE_SCOPE_POOL", + 2: "EVIDENCE_SCOPE_CLUSTER", + } + EvidenceScope_value = map[string]int32{ + "EVIDENCE_SCOPE_UNSPECIFIED": 0, + "EVIDENCE_SCOPE_POOL": 1, + "EVIDENCE_SCOPE_CLUSTER": 2, + } +) + +func (x EvidenceScope) Enum() *EvidenceScope { + p := new(EvidenceScope) + *p = x + return p +} + +func (x EvidenceScope) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EvidenceScope) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[15].Descriptor() +} + +func (EvidenceScope) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[15] +} + +func (x EvidenceScope) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EvidenceScope.Descriptor instead. +func (EvidenceScope) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{15} } type TargetFilterType int32 @@ -345,11 +1018,11 @@ func (x TargetFilterType) String() string { } func (TargetFilterType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[5].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[16].Descriptor() } func (TargetFilterType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[5] + return &file_api_v1_recommendation_proto_enumTypes[16] } func (x TargetFilterType) Number() protoreflect.EnumNumber { @@ -358,7 +1031,7 @@ func (x TargetFilterType) Number() protoreflect.EnumNumber { // Deprecated: Use TargetFilterType.Descriptor instead. func (TargetFilterType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{5} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{16} } type InstanceStorePolicy int32 @@ -388,11 +1061,11 @@ func (x InstanceStorePolicy) String() string { } func (InstanceStorePolicy) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[6].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[17].Descriptor() } func (InstanceStorePolicy) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[6] + return &file_api_v1_recommendation_proto_enumTypes[17] } func (x InstanceStorePolicy) Number() protoreflect.EnumNumber { @@ -401,7 +1074,7 @@ func (x InstanceStorePolicy) Number() protoreflect.EnumNumber { // Deprecated: Use InstanceStorePolicy.Descriptor instead. func (InstanceStorePolicy) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{6} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{17} } type ActionTrigger int32 @@ -440,11 +1113,11 @@ func (x ActionTrigger) String() string { } func (ActionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[7].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[18].Descriptor() } func (ActionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[7] + return &file_api_v1_recommendation_proto_enumTypes[18] } func (x ActionTrigger) Number() protoreflect.EnumNumber { @@ -453,7 +1126,7 @@ func (x ActionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use ActionTrigger.Descriptor instead. func (ActionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{7} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{18} } type WorkloadDetectionTrigger int32 @@ -492,11 +1165,11 @@ func (x WorkloadDetectionTrigger) String() string { } func (WorkloadDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[8].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[19].Descriptor() } func (WorkloadDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[8] + return &file_api_v1_recommendation_proto_enumTypes[19] } func (x WorkloadDetectionTrigger) Number() protoreflect.EnumNumber { @@ -505,7 +1178,7 @@ func (x WorkloadDetectionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use WorkloadDetectionTrigger.Descriptor instead. func (WorkloadDetectionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{8} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{19} } type NodeGroupDetectionTrigger int32 @@ -538,11 +1211,11 @@ func (x NodeGroupDetectionTrigger) String() string { } func (NodeGroupDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[9].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[20].Descriptor() } func (NodeGroupDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[9] + return &file_api_v1_recommendation_proto_enumTypes[20] } func (x NodeGroupDetectionTrigger) Number() protoreflect.EnumNumber { @@ -551,7 +1224,7 @@ func (x NodeGroupDetectionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use NodeGroupDetectionTrigger.Descriptor instead. func (NodeGroupDetectionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{9} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{20} } type NodeGroupActionsAllowed int32 @@ -596,11 +1269,11 @@ func (x NodeGroupActionsAllowed) String() string { } func (NodeGroupActionsAllowed) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[21].Descriptor() } func (NodeGroupActionsAllowed) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[10] + return &file_api_v1_recommendation_proto_enumTypes[21] } func (x NodeGroupActionsAllowed) Number() protoreflect.EnumNumber { @@ -609,7 +1282,7 @@ func (x NodeGroupActionsAllowed) Number() protoreflect.EnumNumber { // Deprecated: Use NodeGroupActionsAllowed.Descriptor instead. func (NodeGroupActionsAllowed) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{10} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{21} } type RecommendationMode int32 @@ -648,11 +1321,11 @@ func (x RecommendationMode) String() string { } func (RecommendationMode) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[11].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[22].Descriptor() } func (RecommendationMode) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[11] + return &file_api_v1_recommendation_proto_enumTypes[22] } func (x RecommendationMode) Number() protoreflect.EnumNumber { @@ -661,43 +1334,55 @@ func (x RecommendationMode) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationMode.Descriptor instead. func (RecommendationMode) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{11} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{22} } type RecommendationType int32 const ( - RecommendationType_RECOMMENDATION_TYPE_UNSPECIFIED RecommendationType = 0 - RecommendationType_RECOMMENDATION_TYPE_WORKLOAD RecommendationType = 1 - RecommendationType_RECOMMENDATION_TYPE_NODE_GROUP RecommendationType = 2 - RecommendationType_RECOMMENDATION_TYPE_NODE_CRD RecommendationType = 3 - RecommendationType_RECOMMENDATION_TYPE_GENERIC_RESOURCE RecommendationType = 4 - RecommendationType_RECOMMENDATION_TYPE_PVC_STORAGE RecommendationType = 5 - RecommendationType_RECOMMENDATION_TYPE_WORKLOAD_RULE RecommendationType = 6 - RecommendationType_RECOMMENDATION_TYPE_KARPENTER_SETTINGS RecommendationType = 7 + RecommendationType_RECOMMENDATION_TYPE_UNSPECIFIED RecommendationType = 0 + RecommendationType_RECOMMENDATION_TYPE_WORKLOAD RecommendationType = 1 + RecommendationType_RECOMMENDATION_TYPE_NODE_GROUP RecommendationType = 2 + RecommendationType_RECOMMENDATION_TYPE_NODE_CRD RecommendationType = 3 + RecommendationType_RECOMMENDATION_TYPE_GENERIC_RESOURCE RecommendationType = 4 + RecommendationType_RECOMMENDATION_TYPE_PVC_STORAGE RecommendationType = 5 + RecommendationType_RECOMMENDATION_TYPE_WORKLOAD_RULE RecommendationType = 6 + RecommendationType_RECOMMENDATION_TYPE_KARPENTER_SETTINGS RecommendationType = 7 + RecommendationType_RECOMMENDATION_TYPE_SNAPSHOT_CRD RecommendationType = 8 + RecommendationType_RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD RecommendationType = 9 + RecommendationType_RECOMMENDATION_TYPE_HPA_CONNECTOR RecommendationType = 10 + RecommendationType_RECOMMENDATION_TYPE_SCHEDULER_POLICY RecommendationType = 11 ) // Enum value maps for RecommendationType. var ( RecommendationType_name = map[int32]string{ - 0: "RECOMMENDATION_TYPE_UNSPECIFIED", - 1: "RECOMMENDATION_TYPE_WORKLOAD", - 2: "RECOMMENDATION_TYPE_NODE_GROUP", - 3: "RECOMMENDATION_TYPE_NODE_CRD", - 4: "RECOMMENDATION_TYPE_GENERIC_RESOURCE", - 5: "RECOMMENDATION_TYPE_PVC_STORAGE", - 6: "RECOMMENDATION_TYPE_WORKLOAD_RULE", - 7: "RECOMMENDATION_TYPE_KARPENTER_SETTINGS", + 0: "RECOMMENDATION_TYPE_UNSPECIFIED", + 1: "RECOMMENDATION_TYPE_WORKLOAD", + 2: "RECOMMENDATION_TYPE_NODE_GROUP", + 3: "RECOMMENDATION_TYPE_NODE_CRD", + 4: "RECOMMENDATION_TYPE_GENERIC_RESOURCE", + 5: "RECOMMENDATION_TYPE_PVC_STORAGE", + 6: "RECOMMENDATION_TYPE_WORKLOAD_RULE", + 7: "RECOMMENDATION_TYPE_KARPENTER_SETTINGS", + 8: "RECOMMENDATION_TYPE_SNAPSHOT_CRD", + 9: "RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD", + 10: "RECOMMENDATION_TYPE_HPA_CONNECTOR", + 11: "RECOMMENDATION_TYPE_SCHEDULER_POLICY", } RecommendationType_value = map[string]int32{ - "RECOMMENDATION_TYPE_UNSPECIFIED": 0, - "RECOMMENDATION_TYPE_WORKLOAD": 1, - "RECOMMENDATION_TYPE_NODE_GROUP": 2, - "RECOMMENDATION_TYPE_NODE_CRD": 3, - "RECOMMENDATION_TYPE_GENERIC_RESOURCE": 4, - "RECOMMENDATION_TYPE_PVC_STORAGE": 5, - "RECOMMENDATION_TYPE_WORKLOAD_RULE": 6, - "RECOMMENDATION_TYPE_KARPENTER_SETTINGS": 7, + "RECOMMENDATION_TYPE_UNSPECIFIED": 0, + "RECOMMENDATION_TYPE_WORKLOAD": 1, + "RECOMMENDATION_TYPE_NODE_GROUP": 2, + "RECOMMENDATION_TYPE_NODE_CRD": 3, + "RECOMMENDATION_TYPE_GENERIC_RESOURCE": 4, + "RECOMMENDATION_TYPE_PVC_STORAGE": 5, + "RECOMMENDATION_TYPE_WORKLOAD_RULE": 6, + "RECOMMENDATION_TYPE_KARPENTER_SETTINGS": 7, + "RECOMMENDATION_TYPE_SNAPSHOT_CRD": 8, + "RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD": 9, + "RECOMMENDATION_TYPE_HPA_CONNECTOR": 10, + "RECOMMENDATION_TYPE_SCHEDULER_POLICY": 11, } ) @@ -712,11 +1397,11 @@ func (x RecommendationType) String() string { } func (RecommendationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[12].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[23].Descriptor() } func (RecommendationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[12] + return &file_api_v1_recommendation_proto_enumTypes[23] } func (x RecommendationType) Number() protoreflect.EnumNumber { @@ -725,7 +1410,7 @@ func (x RecommendationType) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationType.Descriptor instead. func (RecommendationType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{12} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{23} } type HPAMetricType int32 @@ -770,11 +1455,11 @@ func (x HPAMetricType) String() string { } func (HPAMetricType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[13].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[24].Descriptor() } func (HPAMetricType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[13] + return &file_api_v1_recommendation_proto_enumTypes[24] } func (x HPAMetricType) Number() protoreflect.EnumNumber { @@ -783,7 +1468,7 @@ func (x HPAMetricType) Number() protoreflect.EnumNumber { // Deprecated: Use HPAMetricType.Descriptor instead. func (HPAMetricType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{13} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{24} } type PvcOperationType int32 @@ -819,11 +1504,11 @@ func (x PvcOperationType) String() string { } func (PvcOperationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[14].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[25].Descriptor() } func (PvcOperationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[14] + return &file_api_v1_recommendation_proto_enumTypes[25] } func (x PvcOperationType) Number() protoreflect.EnumNumber { @@ -832,7 +1517,186 @@ func (x PvcOperationType) Number() protoreflect.EnumNumber { // Deprecated: Use PvcOperationType.Descriptor instead. func (PvcOperationType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{14} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{25} +} + +// WorkloadRuleAction is what should happen to a policy's already-generated +// rules when the policy is disabled. Modeled as an enum (not a bool) because +// KEEP/REMOVE won't stay the only two options. +type WorkloadRuleAction int32 + +const ( + WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED WorkloadRuleAction = 0 + // Detach: rules survive and keep optimizing, but revert to + // auto_optimization ownership instead of being regenerated by this policy. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_KEEP WorkloadRuleAction = 1 + // Delete the rules and their in-cluster CRDs; workloads are no longer + // optimized by them. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_REMOVE WorkloadRuleAction = 2 + // Detach AND disable: same detach semantics as KEEP, but the rules become + // full no-ops (disabled=true) until manually re-enabled. Re-enabling this + // policy does NOT automatically re-enable them. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_DISABLE WorkloadRuleAction = 3 +) + +// Enum value maps for WorkloadRuleAction. +var ( + WorkloadRuleAction_name = map[int32]string{ + 0: "WORKLOAD_RULE_ACTION_UNSPECIFIED", + 1: "WORKLOAD_RULE_ACTION_KEEP", + 2: "WORKLOAD_RULE_ACTION_REMOVE", + 3: "WORKLOAD_RULE_ACTION_DISABLE", + } + WorkloadRuleAction_value = map[string]int32{ + "WORKLOAD_RULE_ACTION_UNSPECIFIED": 0, + "WORKLOAD_RULE_ACTION_KEEP": 1, + "WORKLOAD_RULE_ACTION_REMOVE": 2, + "WORKLOAD_RULE_ACTION_DISABLE": 3, + } +) + +func (x WorkloadRuleAction) Enum() *WorkloadRuleAction { + p := new(WorkloadRuleAction) + *p = x + return p +} + +func (x WorkloadRuleAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WorkloadRuleAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[26].Descriptor() +} + +func (WorkloadRuleAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[26] +} + +func (x WorkloadRuleAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WorkloadRuleAction.Descriptor instead. +func (WorkloadRuleAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{26} +} + +type WorkloadOptimizationPolicyMatchStatus int32 + +const ( + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED WorkloadOptimizationPolicyMatchStatus = 0 + // No workload_rule exists yet for this workload — saving the policy as + // configured would create one. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE WorkloadOptimizationPolicyMatchStatus = 1 + // A rule already exists and is owned by this policy (edit mode only) — + // saving would leave it as-is (recalibration happens on its own cadence). + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY WorkloadOptimizationPolicyMatchStatus = 2 + // Matched the selector, but a manually-managed rule already exists — + // this policy will never touch it. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL WorkloadOptimizationPolicyMatchStatus = 3 + // Matched the selector, but a CRD-managed (kubectl-applied) rule already + // exists — this policy will never touch it. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD WorkloadOptimizationPolicyMatchStatus = 4 + // Matched the selector, but a different policy already owns the rule — + // this policy will not steal it. See owning_policy_id/owning_policy_name. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY WorkloadOptimizationPolicyMatchStatus = 5 +) + +// Enum value maps for WorkloadOptimizationPolicyMatchStatus. +var ( + WorkloadOptimizationPolicyMatchStatus_name = map[int32]string{ + 0: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED", + 1: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE", + 2: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY", + 3: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL", + 4: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD", + 5: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY", + } + WorkloadOptimizationPolicyMatchStatus_value = map[string]int32{ + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED": 0, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE": 1, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY": 2, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL": 3, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD": 4, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY": 5, + } +) + +func (x WorkloadOptimizationPolicyMatchStatus) Enum() *WorkloadOptimizationPolicyMatchStatus { + p := new(WorkloadOptimizationPolicyMatchStatus) + *p = x + return p +} + +func (x WorkloadOptimizationPolicyMatchStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WorkloadOptimizationPolicyMatchStatus) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[27].Descriptor() +} + +func (WorkloadOptimizationPolicyMatchStatus) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[27] +} + +func (x WorkloadOptimizationPolicyMatchStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WorkloadOptimizationPolicyMatchStatus.Descriptor instead. +func (WorkloadOptimizationPolicyMatchStatus) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{27} +} + +type SchedulerUnhealthyReason int32 + +const ( + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED SchedulerUnhealthyReason = 0 + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED SchedulerUnhealthyReason = 1 + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK SchedulerUnhealthyReason = 2 +) + +// Enum value maps for SchedulerUnhealthyReason. +var ( + SchedulerUnhealthyReason_name = map[int32]string{ + 0: "SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED", + 1: "SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED", + 2: "SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK", + } + SchedulerUnhealthyReason_value = map[string]int32{ + "SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED": 0, + "SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED": 1, + "SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK": 2, + } +) + +func (x SchedulerUnhealthyReason) Enum() *SchedulerUnhealthyReason { + p := new(SchedulerUnhealthyReason) + *p = x + return p +} + +func (x SchedulerUnhealthyReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerUnhealthyReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[28].Descriptor() +} + +func (SchedulerUnhealthyReason) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[28] +} + +func (x SchedulerUnhealthyReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerUnhealthyReason.Descriptor instead. +func (SchedulerUnhealthyReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{28} } // WorkloadRuleSource identifies who created/last-modified a WorkloadRule. @@ -891,11 +1755,11 @@ func (x WorkloadRuleSource) String() string { } func (WorkloadRuleSource) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[15].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[29].Descriptor() } func (WorkloadRuleSource) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[15] + return &file_api_v1_recommendation_proto_enumTypes[29] } func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { @@ -904,80 +1768,352 @@ func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { // Deprecated: Use WorkloadRuleSource.Descriptor instead. func (WorkloadRuleSource) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{15} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{29} } -type GetRecommendationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// NodeCheckpointLabelState describes the last-known per-node apply outcome for +// the checkpoint-restore label. PENDING/FAILED reflect the most recent +// generic_resource_recommendations row; NONE means we have no apply attempt +// on record for the node — has_label may still be true (label inherited via +// the Karpenter NodePool template, or set manually). +type NodeCheckpointLabelState int32 - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ExcludeStatuses []string `protobuf:"bytes,3,rep,name=exclude_statuses,json=excludeStatuses,proto3" json:"exclude_statuses,omitempty"` - Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` - IncludeDeletedPolicies bool `protobuf:"varint,5,opt,name=include_deleted_policies,json=includeDeletedPolicies,proto3" json:"include_deleted_policies,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - Filters *WorkloadFilters `protobuf:"bytes,31,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters; when set, overrides show_deleted behavior via filters.status - Pagination *Pagination `protobuf:"bytes,32,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` // Optional pagination parameters -} +const ( + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED NodeCheckpointLabelState = 0 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_NONE NodeCheckpointLabelState = 1 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_PENDING NodeCheckpointLabelState = 2 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_APPLIED NodeCheckpointLabelState = 3 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_FAILED NodeCheckpointLabelState = 4 + // REJECTED lumps every other terminal status (superseded, blocked, ignored) + // — the UI surfaces them collectively as "did not apply". + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_REJECTED NodeCheckpointLabelState = 5 +) -func (x *GetRecommendationsRequest) Reset() { - *x = GetRecommendationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// Enum value maps for NodeCheckpointLabelState. +var ( + NodeCheckpointLabelState_name = map[int32]string{ + 0: "NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED", + 1: "NODE_CHECKPOINT_LABEL_STATE_NONE", + 2: "NODE_CHECKPOINT_LABEL_STATE_PENDING", + 3: "NODE_CHECKPOINT_LABEL_STATE_APPLIED", + 4: "NODE_CHECKPOINT_LABEL_STATE_FAILED", + 5: "NODE_CHECKPOINT_LABEL_STATE_REJECTED", + } + NodeCheckpointLabelState_value = map[string]int32{ + "NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED": 0, + "NODE_CHECKPOINT_LABEL_STATE_NONE": 1, + "NODE_CHECKPOINT_LABEL_STATE_PENDING": 2, + "NODE_CHECKPOINT_LABEL_STATE_APPLIED": 3, + "NODE_CHECKPOINT_LABEL_STATE_FAILED": 4, + "NODE_CHECKPOINT_LABEL_STATE_REJECTED": 5, } +) + +func (x NodeCheckpointLabelState) Enum() *NodeCheckpointLabelState { + p := new(NodeCheckpointLabelState) + *p = x + return p } -func (x *GetRecommendationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x NodeCheckpointLabelState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (*GetRecommendationsRequest) ProtoMessage() {} +func (NodeCheckpointLabelState) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[30].Descriptor() +} -func (x *GetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[0] - 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) +func (NodeCheckpointLabelState) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[30] } -// Deprecated: Use GetRecommendationsRequest.ProtoReflect.Descriptor instead. -func (*GetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{0} +func (x NodeCheckpointLabelState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -func (x *GetRecommendationsRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use NodeCheckpointLabelState.Descriptor instead. +func (NodeCheckpointLabelState) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{30} } -func (x *GetRecommendationsRequest) GetTeamId() string { - if x != nil { - return x.TeamId +type ForensicPostSnapshotAction int32 + +const ( + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED ForensicPostSnapshotAction = 0 + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_NONE ForensicPostSnapshotAction = 1 + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD ForensicPostSnapshotAction = 2 +) + +// Enum value maps for ForensicPostSnapshotAction. +var ( + ForensicPostSnapshotAction_name = map[int32]string{ + 0: "FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED", + 1: "FORENSIC_POST_SNAPSHOT_ACTION_NONE", + 2: "FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD", } - return "" + ForensicPostSnapshotAction_value = map[string]int32{ + "FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED": 0, + "FORENSIC_POST_SNAPSHOT_ACTION_NONE": 1, + "FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD": 2, + } +) + +func (x ForensicPostSnapshotAction) Enum() *ForensicPostSnapshotAction { + p := new(ForensicPostSnapshotAction) + *p = x + return p } -func (x *GetRecommendationsRequest) GetExcludeStatuses() []string { - if x != nil { - return x.ExcludeStatuses - } - return nil +func (x ForensicPostSnapshotAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *GetRecommendationsRequest) GetNamespaces() []string { - if x != nil { +func (ForensicPostSnapshotAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[31].Descriptor() +} + +func (ForensicPostSnapshotAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[31] +} + +func (x ForensicPostSnapshotAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ForensicPostSnapshotAction.Descriptor instead. +func (ForensicPostSnapshotAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{31} +} + +// DELETED: no live enrollments existed (or force) — policy soft-deleted now. +// REVERTING: reverts initiated; delete finalizes when acks arrive. +type DeleteSchedulerPolicyResponse_Outcome int32 + +const ( + DeleteSchedulerPolicyResponse_OUTCOME_UNSPECIFIED DeleteSchedulerPolicyResponse_Outcome = 0 + DeleteSchedulerPolicyResponse_OUTCOME_DELETED DeleteSchedulerPolicyResponse_Outcome = 1 + DeleteSchedulerPolicyResponse_OUTCOME_REVERTING DeleteSchedulerPolicyResponse_Outcome = 2 +) + +// Enum value maps for DeleteSchedulerPolicyResponse_Outcome. +var ( + DeleteSchedulerPolicyResponse_Outcome_name = map[int32]string{ + 0: "OUTCOME_UNSPECIFIED", + 1: "OUTCOME_DELETED", + 2: "OUTCOME_REVERTING", + } + DeleteSchedulerPolicyResponse_Outcome_value = map[string]int32{ + "OUTCOME_UNSPECIFIED": 0, + "OUTCOME_DELETED": 1, + "OUTCOME_REVERTING": 2, + } +) + +func (x DeleteSchedulerPolicyResponse_Outcome) Enum() *DeleteSchedulerPolicyResponse_Outcome { + p := new(DeleteSchedulerPolicyResponse_Outcome) + *p = x + return p +} + +func (x DeleteSchedulerPolicyResponse_Outcome) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeleteSchedulerPolicyResponse_Outcome) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[32].Descriptor() +} + +func (DeleteSchedulerPolicyResponse_Outcome) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[32] +} + +func (x DeleteSchedulerPolicyResponse_Outcome) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DeleteSchedulerPolicyResponse_Outcome.Descriptor instead. +func (DeleteSchedulerPolicyResponse_Outcome) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{418, 0} +} + +type SchedulerPolicyTargetMatch_Status int32 + +const ( + SchedulerPolicyTargetMatch_STATUS_UNSPECIFIED SchedulerPolicyTargetMatch_Status = 0 + SchedulerPolicyTargetMatch_NEW_ENROLLMENT SchedulerPolicyTargetMatch_Status = 1 // would enroll + SchedulerPolicyTargetMatch_ALREADY_ENROLLED_THIS_POLICY SchedulerPolicyTargetMatch_Status = 2 // no change + SchedulerPolicyTargetMatch_ENROLLED_BY_OTHER_POLICY SchedulerPolicyTargetMatch_Status = 3 // precedence: stays with its owner +) + +// Enum value maps for SchedulerPolicyTargetMatch_Status. +var ( + SchedulerPolicyTargetMatch_Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "NEW_ENROLLMENT", + 2: "ALREADY_ENROLLED_THIS_POLICY", + 3: "ENROLLED_BY_OTHER_POLICY", + } + SchedulerPolicyTargetMatch_Status_value = map[string]int32{ + "STATUS_UNSPECIFIED": 0, + "NEW_ENROLLMENT": 1, + "ALREADY_ENROLLED_THIS_POLICY": 2, + "ENROLLED_BY_OTHER_POLICY": 3, + } +) + +func (x SchedulerPolicyTargetMatch_Status) Enum() *SchedulerPolicyTargetMatch_Status { + p := new(SchedulerPolicyTargetMatch_Status) + *p = x + return p +} + +func (x SchedulerPolicyTargetMatch_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerPolicyTargetMatch_Status) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[33].Descriptor() +} + +func (SchedulerPolicyTargetMatch_Status) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[33] +} + +func (x SchedulerPolicyTargetMatch_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerPolicyTargetMatch_Status.Descriptor instead. +func (SchedulerPolicyTargetMatch_Status) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{420, 0} +} + +type SchedulerPolicyEnrollment_State int32 + +const ( + SchedulerPolicyEnrollment_STATE_UNSPECIFIED SchedulerPolicyEnrollment_State = 0 + SchedulerPolicyEnrollment_STATE_ACTIVE SchedulerPolicyEnrollment_State = 1 + SchedulerPolicyEnrollment_STATE_PENDING_REVERT SchedulerPolicyEnrollment_State = 2 + SchedulerPolicyEnrollment_STATE_REVERTED SchedulerPolicyEnrollment_State = 3 + SchedulerPolicyEnrollment_STATE_ABANDONED SchedulerPolicyEnrollment_State = 4 +) + +// Enum value maps for SchedulerPolicyEnrollment_State. +var ( + SchedulerPolicyEnrollment_State_name = map[int32]string{ + 0: "STATE_UNSPECIFIED", + 1: "STATE_ACTIVE", + 2: "STATE_PENDING_REVERT", + 3: "STATE_REVERTED", + 4: "STATE_ABANDONED", + } + SchedulerPolicyEnrollment_State_value = map[string]int32{ + "STATE_UNSPECIFIED": 0, + "STATE_ACTIVE": 1, + "STATE_PENDING_REVERT": 2, + "STATE_REVERTED": 3, + "STATE_ABANDONED": 4, + } +) + +func (x SchedulerPolicyEnrollment_State) Enum() *SchedulerPolicyEnrollment_State { + p := new(SchedulerPolicyEnrollment_State) + *p = x + return p +} + +func (x SchedulerPolicyEnrollment_State) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerPolicyEnrollment_State) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[34].Descriptor() +} + +func (SchedulerPolicyEnrollment_State) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[34] +} + +func (x SchedulerPolicyEnrollment_State) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerPolicyEnrollment_State.Descriptor instead. +func (SchedulerPolicyEnrollment_State) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{423, 0} +} + +type GetRecommendationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ExcludeStatuses []string `protobuf:"bytes,3,rep,name=exclude_statuses,json=excludeStatuses,proto3" json:"exclude_statuses,omitempty"` + Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + IncludeDeletedPolicies bool `protobuf:"varint,5,opt,name=include_deleted_policies,json=includeDeletedPolicies,proto3" json:"include_deleted_policies,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Filters *WorkloadFilters `protobuf:"bytes,31,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters; when set, overrides show_deleted behavior via filters.status + Pagination *Pagination `protobuf:"bytes,32,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` // Optional pagination parameters +} + +func (x *GetRecommendationsRequest) Reset() { + *x = GetRecommendationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRecommendationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRecommendationsRequest) ProtoMessage() {} + +func (x *GetRecommendationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[0] + 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 GetRecommendationsRequest.ProtoReflect.Descriptor instead. +func (*GetRecommendationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{0} +} + +func (x *GetRecommendationsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetRecommendationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetRecommendationsRequest) GetExcludeStatuses() []string { + if x != nil { + return x.ExcludeStatuses + } + return nil +} + +func (x *GetRecommendationsRequest) GetNamespaces() []string { + if x != nil { return x.Namespaces } return nil @@ -1903,14 +3039,8 @@ type GetPreviewWorkloadRecommendationRequest struct { PolicyId string `protobuf:"bytes,7,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` // Moment in time for which the recommendations are requested // If not set, the current time is used - Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - VpaLookback *durationpb.Duration `protobuf:"bytes,9,opt,name=vpa_lookback,json=vpaLookback,proto3" json:"vpa_lookback,omitempty"` - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - HpaLookback *durationpb.Duration `protobuf:"bytes,10,opt,name=hpa_lookback,json=hpaLookback,proto3" json:"hpa_lookback,omitempty"` - IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } func (x *GetPreviewWorkloadRecommendationRequest) Reset() { @@ -2001,20 +3131,6 @@ func (x *GetPreviewWorkloadRecommendationRequest) GetTimestamp() *timestamppb.Ti return nil } -func (x *GetPreviewWorkloadRecommendationRequest) GetVpaLookback() *durationpb.Duration { - if x != nil { - return x.VpaLookback - } - return nil -} - -func (x *GetPreviewWorkloadRecommendationRequest) GetHpaLookback() *durationpb.Duration { - if x != nil { - return x.HpaLookback - } - return nil -} - func (x *GetPreviewWorkloadRecommendationRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -2080,14 +3196,8 @@ type GetPreviewWorkloadRecommendationsRequest struct { Workloads []*WorkloadIdentifier `protobuf:"bytes,4,rep,name=workloads,proto3" json:"workloads,omitempty"` // Moment in time for which the recommendations are requested // If not set, the current time is used - Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - VpaLookback *durationpb.Duration `protobuf:"bytes,6,opt,name=vpa_lookback,json=vpaLookback,proto3" json:"vpa_lookback,omitempty"` - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - HpaLookback *durationpb.Duration `protobuf:"bytes,7,opt,name=hpa_lookback,json=hpaLookback,proto3" json:"hpa_lookback,omitempty"` - IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } func (x *GetPreviewWorkloadRecommendationsRequest) Reset() { @@ -2157,20 +3267,6 @@ func (x *GetPreviewWorkloadRecommendationsRequest) GetTimestamp() *timestamppb.T return nil } -func (x *GetPreviewWorkloadRecommendationsRequest) GetVpaLookback() *durationpb.Duration { - if x != nil { - return x.VpaLookback - } - return nil -} - -func (x *GetPreviewWorkloadRecommendationsRequest) GetHpaLookback() *durationpb.Duration { - if x != nil { - return x.HpaLookback - } - return nil -} - func (x *GetPreviewWorkloadRecommendationsRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -5009,17 +6105,20 @@ type WorkloadPolicyTarget struct { Priority int32 `protobuf:"varint,7,opt,name=priority,proto3" json:"priority,omitempty"` Enabled bool `protobuf:"varint,8,opt,name=enabled,proto3" json:"enabled,omitempty"` // Targeting criteria (AND logic between non-null fields) - NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels - KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds - NamespacePattern *RegexPattern `protobuf:"bytes,17,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern - NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes - ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels + KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds + NamespacePattern *RegexPattern `protobuf:"bytes,17,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,18,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,19,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } func (x *WorkloadPolicyTarget) Reset() { @@ -5160,6 +6259,21 @@ func (x *WorkloadPolicyTarget) GetNamespacePattern() *RegexPattern { return nil } +func (x *WorkloadPolicyTarget) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *WorkloadPolicyTarget) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *WorkloadPolicyTarget) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5208,8 +6322,11 @@ type CreateWorkloadPolicyTargetRequest struct { NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,19,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,20,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds ClusterIds []string `protobuf:"bytes,21,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` } @@ -5337,6 +6454,7 @@ func (x *CreateWorkloadPolicyTargetRequest) GetWorkloadNames() []string { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *CreateWorkloadPolicyTargetRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5351,6 +6469,20 @@ func (x *CreateWorkloadPolicyTargetRequest) GetNamespacePattern() *RegexPattern return nil } +func (x *CreateWorkloadPolicyTargetRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *CreateWorkloadPolicyTargetRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *CreateWorkloadPolicyTargetRequest) GetClusterIds() []string { if x != nil { return x.ClusterIds @@ -5645,9 +6777,12 @@ type UpdateWorkloadPolicyTargetRequest struct { NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern - PolicyId *string `protobuf:"bytes,21,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // should only be set when target needs to be attached to diff policy + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,19,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,20,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds + PolicyId *string `protobuf:"bytes,21,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // should only be set when target needs to be attached to diff policy ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` } @@ -5775,6 +6910,7 @@ func (x *UpdateWorkloadPolicyTargetRequest) GetWorkloadNames() []string { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *UpdateWorkloadPolicyTargetRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5789,6 +6925,20 @@ func (x *UpdateWorkloadPolicyTargetRequest) GetNamespacePattern() *RegexPattern return nil } +func (x *UpdateWorkloadPolicyTargetRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *UpdateWorkloadPolicyTargetRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *UpdateWorkloadPolicyTargetRequest) GetPolicyId() string { if x != nil && x.PolicyId != nil { return *x.PolicyId @@ -6194,8 +7344,11 @@ type PreviewWorkloadPolicyTargetMatchesRequest struct { NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,7,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,8,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,9,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,10,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,9,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,10,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,11,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,12,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds } func (x *PreviewWorkloadPolicyTargetMatchesRequest) Reset() { @@ -6286,6 +7439,7 @@ func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetWorkloadNames() []string return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -6300,6 +7454,20 @@ func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetNamespacePattern() *Regex return nil } +func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + type PreviewWorkloadPolicyTargetMatchesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6362,9 +7530,15 @@ type GetPreviewWorkloadPolicyTargetRecommendationsRequest struct { AnnotationSelector *LabelSelector `protobuf:"bytes,8,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,9,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` NodeGroupNames []string `protobuf:"bytes,10,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,11,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + NamespacePattern *RegexPattern `protobuf:"bytes,11,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,12,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + // Priority of the previewed target; used to determine who wins when a + // competing target exists for the same workload. When absent, collision + // detection is skipped and collisions_by_workload_uid is empty. + Priority *int32 `protobuf:"varint,32,opt,name=priority,proto3,oneof" json:"priority,omitempty"` } func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) Reset() { @@ -6469,6 +7643,20 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetNamespacePatte return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -6483,6 +7671,84 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetClusterIds() [ return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetPriority() int32 { + if x != nil && x.Priority != nil { + return *x.Priority + } + return 0 +} + +type WorkloadCollisionInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + TargetId string `protobuf:"bytes,3,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TargetName string `protobuf:"bytes,4,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` +} + +func (x *WorkloadCollisionInfo) Reset() { + *x = WorkloadCollisionInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadCollisionInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadCollisionInfo) ProtoMessage() {} + +func (x *WorkloadCollisionInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[77] + 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 WorkloadCollisionInfo.ProtoReflect.Descriptor instead. +func (*WorkloadCollisionInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{77} +} + +func (x *WorkloadCollisionInfo) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *WorkloadCollisionInfo) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *WorkloadCollisionInfo) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *WorkloadCollisionInfo) GetTargetName() string { + if x != nil { + return x.TargetName + } + return "" +} + type GetPreviewWorkloadPolicyTargetRecommendationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6492,12 +7758,18 @@ type GetPreviewWorkloadPolicyTargetRecommendationsResponse struct { WorkloadItems []*WorkloadItem `protobuf:"bytes,2,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Map from workload UID to aggregated percentile summaries across all containers WorkloadPercentiles map[string]*WorkloadPercentileSummary `protobuf:"bytes,3,rep,name=workload_percentiles,json=workloadPercentiles,proto3" json:"workload_percentiles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Workloads where a competing policy's target beats the previewed target. + // Absent entries mean the current policy wins or no competing target exists. + CollisionsByWorkloadUid map[string]*WorkloadCollisionInfo `protobuf:"bytes,4,rep,name=collisions_by_workload_uid,json=collisionsByWorkloadUid,proto3" json:"collisions_by_workload_uid,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // UIDs of workloads skipped because they are managed by optimization rules (MPA v2). + // Policy-based optimization cannot be applied to these workloads. + RuleManagedWorkloadUids []string `protobuf:"bytes,5,rep,name=rule_managed_workload_uids,json=ruleManagedWorkloadUids,proto3" json:"rule_managed_workload_uids,omitempty"` } func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) Reset() { *x = GetPreviewWorkloadPolicyTargetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[77] + mi := &file_api_v1_recommendation_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6510,7 +7782,7 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) String() string func (*GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoMessage() {} func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[77] + mi := &file_api_v1_recommendation_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6523,7 +7795,7 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoReflect() p // Deprecated: Use GetPreviewWorkloadPolicyTargetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*GetPreviewWorkloadPolicyTargetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{77} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{78} } func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetRecommendations() []*WorkloadRecommendation { @@ -6547,6 +7819,20 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetWorkloadPerce return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetCollisionsByWorkloadUid() map[string]*WorkloadCollisionInfo { + if x != nil { + return x.CollisionsByWorkloadUid + } + return nil +} + +func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetRuleManagedWorkloadUids() []string { + if x != nil { + return x.RuleManagedWorkloadUids + } + return nil +} + // WorkloadPercentileSummary aggregates percentile metrics across all containers of a workload. type WorkloadPercentileSummary struct { state protoimpl.MessageState @@ -6563,7 +7849,7 @@ type WorkloadPercentileSummary struct { func (x *WorkloadPercentileSummary) Reset() { *x = WorkloadPercentileSummary{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[78] + mi := &file_api_v1_recommendation_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6576,7 +7862,7 @@ func (x *WorkloadPercentileSummary) String() string { func (*WorkloadPercentileSummary) ProtoMessage() {} func (x *WorkloadPercentileSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[78] + mi := &file_api_v1_recommendation_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6589,7 +7875,7 @@ func (x *WorkloadPercentileSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadPercentileSummary.ProtoReflect.Descriptor instead. func (*WorkloadPercentileSummary) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{78} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{79} } func (x *WorkloadPercentileSummary) GetCpuUsage() *MetricPercentiles { @@ -6648,7 +7934,7 @@ type NodeGroupPolicyTarget struct { func (x *NodeGroupPolicyTarget) Reset() { *x = NodeGroupPolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[79] + mi := &file_api_v1_recommendation_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6661,7 +7947,7 @@ func (x *NodeGroupPolicyTarget) String() string { func (*NodeGroupPolicyTarget) ProtoMessage() {} func (x *NodeGroupPolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[79] + mi := &file_api_v1_recommendation_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6674,7 +7960,7 @@ func (x *NodeGroupPolicyTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupPolicyTarget.ProtoReflect.Descriptor instead. func (*NodeGroupPolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{79} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{80} } func (x *NodeGroupPolicyTarget) GetTargetId() string { @@ -6772,7 +8058,7 @@ type CreateNodeGroupPolicyTargetRequest struct { func (x *CreateNodeGroupPolicyTargetRequest) Reset() { *x = CreateNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[80] + mi := &file_api_v1_recommendation_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6785,7 +8071,7 @@ func (x *CreateNodeGroupPolicyTargetRequest) String() string { func (*CreateNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *CreateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[80] + mi := &file_api_v1_recommendation_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6798,7 +8084,7 @@ func (x *CreateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use CreateNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*CreateNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{80} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{81} } func (x *CreateNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -6868,7 +8154,7 @@ type CreateNodeGroupPolicyTargetResponse struct { func (x *CreateNodeGroupPolicyTargetResponse) Reset() { *x = CreateNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[81] + mi := &file_api_v1_recommendation_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6881,7 +8167,7 @@ func (x *CreateNodeGroupPolicyTargetResponse) String() string { func (*CreateNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *CreateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[81] + mi := &file_api_v1_recommendation_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6894,7 +8180,7 @@ func (x *CreateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use CreateNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*CreateNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{81} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{82} } func (x *CreateNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -6916,7 +8202,7 @@ type GetNodeGroupPolicyTargetRequest struct { func (x *GetNodeGroupPolicyTargetRequest) Reset() { *x = GetNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[82] + mi := &file_api_v1_recommendation_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6929,7 +8215,7 @@ func (x *GetNodeGroupPolicyTargetRequest) String() string { func (*GetNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *GetNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[82] + mi := &file_api_v1_recommendation_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6942,7 +8228,7 @@ func (x *GetNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*GetNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{82} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{83} } func (x *GetNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -6970,7 +8256,7 @@ type GetNodeGroupPolicyTargetResponse struct { func (x *GetNodeGroupPolicyTargetResponse) Reset() { *x = GetNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[83] + mi := &file_api_v1_recommendation_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6983,7 +8269,7 @@ func (x *GetNodeGroupPolicyTargetResponse) String() string { func (*GetNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *GetNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[83] + mi := &file_api_v1_recommendation_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6996,7 +8282,7 @@ func (x *GetNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*GetNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{83} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{84} } func (x *GetNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -7020,7 +8306,7 @@ type ListNodeGroupPolicyTargetsRequest struct { func (x *ListNodeGroupPolicyTargetsRequest) Reset() { *x = ListNodeGroupPolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[84] + mi := &file_api_v1_recommendation_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7033,7 +8319,7 @@ func (x *ListNodeGroupPolicyTargetsRequest) String() string { func (*ListNodeGroupPolicyTargetsRequest) ProtoMessage() {} func (x *ListNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[84] + mi := &file_api_v1_recommendation_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7046,7 +8332,7 @@ func (x *ListNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ListNodeGroupPolicyTargetsRequest.ProtoReflect.Descriptor instead. func (*ListNodeGroupPolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{84} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{85} } func (x *ListNodeGroupPolicyTargetsRequest) GetTeamId() string { @@ -7088,7 +8374,7 @@ type ListNodeGroupPolicyTargetsResponse struct { func (x *ListNodeGroupPolicyTargetsResponse) Reset() { *x = ListNodeGroupPolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[85] + mi := &file_api_v1_recommendation_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7101,7 +8387,7 @@ func (x *ListNodeGroupPolicyTargetsResponse) String() string { func (*ListNodeGroupPolicyTargetsResponse) ProtoMessage() {} func (x *ListNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[85] + mi := &file_api_v1_recommendation_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7114,7 +8400,7 @@ func (x *ListNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListNodeGroupPolicyTargetsResponse.ProtoReflect.Descriptor instead. func (*ListNodeGroupPolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{85} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{86} } func (x *ListNodeGroupPolicyTargetsResponse) GetTargets() []*NodeGroupPolicyTarget { @@ -7142,7 +8428,7 @@ type UpdateNodeGroupPolicyTargetRequest struct { func (x *UpdateNodeGroupPolicyTargetRequest) Reset() { *x = UpdateNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[86] + mi := &file_api_v1_recommendation_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7155,7 +8441,7 @@ func (x *UpdateNodeGroupPolicyTargetRequest) String() string { func (*UpdateNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *UpdateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[86] + mi := &file_api_v1_recommendation_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7168,7 +8454,7 @@ func (x *UpdateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*UpdateNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{86} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{87} } func (x *UpdateNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -7238,7 +8524,7 @@ type UpdateNodeGroupPolicyTargetResponse struct { func (x *UpdateNodeGroupPolicyTargetResponse) Reset() { *x = UpdateNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[87] + mi := &file_api_v1_recommendation_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7251,7 +8537,7 @@ func (x *UpdateNodeGroupPolicyTargetResponse) String() string { func (*UpdateNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *UpdateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[87] + mi := &file_api_v1_recommendation_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7264,7 +8550,7 @@ func (x *UpdateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*UpdateNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{87} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{88} } func (x *UpdateNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -7286,7 +8572,7 @@ type DeleteNodeGroupPolicyTargetRequest struct { func (x *DeleteNodeGroupPolicyTargetRequest) Reset() { *x = DeleteNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[88] + mi := &file_api_v1_recommendation_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7299,7 +8585,7 @@ func (x *DeleteNodeGroupPolicyTargetRequest) String() string { func (*DeleteNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *DeleteNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[88] + mi := &file_api_v1_recommendation_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7312,7 +8598,7 @@ func (x *DeleteNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*DeleteNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{88} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{89} } func (x *DeleteNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -7342,7 +8628,7 @@ type ToggleNodeGroupPolicyTargetsRequest struct { func (x *ToggleNodeGroupPolicyTargetsRequest) Reset() { *x = ToggleNodeGroupPolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[89] + mi := &file_api_v1_recommendation_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7355,7 +8641,7 @@ func (x *ToggleNodeGroupPolicyTargetsRequest) String() string { func (*ToggleNodeGroupPolicyTargetsRequest) ProtoMessage() {} func (x *ToggleNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[89] + mi := &file_api_v1_recommendation_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7368,7 +8654,7 @@ func (x *ToggleNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ToggleNodeGroupPolicyTargetsRequest.ProtoReflect.Descriptor instead. func (*ToggleNodeGroupPolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{89} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{90} } func (x *ToggleNodeGroupPolicyTargetsRequest) GetTeamId() string { @@ -7403,7 +8689,7 @@ type ToggleNodeGroupPolicyTargetsResponse struct { func (x *ToggleNodeGroupPolicyTargetsResponse) Reset() { *x = ToggleNodeGroupPolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[90] + mi := &file_api_v1_recommendation_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7416,7 +8702,7 @@ func (x *ToggleNodeGroupPolicyTargetsResponse) String() string { func (*ToggleNodeGroupPolicyTargetsResponse) ProtoMessage() {} func (x *ToggleNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[90] + mi := &file_api_v1_recommendation_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7429,7 +8715,7 @@ func (x *ToggleNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ToggleNodeGroupPolicyTargetsResponse.ProtoReflect.Descriptor instead. func (*ToggleNodeGroupPolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{90} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{91} } func (x *ToggleNodeGroupPolicyTargetsResponse) GetSuccess() bool { @@ -7448,7 +8734,7 @@ type DeleteNodeGroupPolicyTargetResponse struct { func (x *DeleteNodeGroupPolicyTargetResponse) Reset() { *x = DeleteNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[91] + mi := &file_api_v1_recommendation_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7461,7 +8747,7 @@ func (x *DeleteNodeGroupPolicyTargetResponse) String() string { func (*DeleteNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *DeleteNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[91] + mi := &file_api_v1_recommendation_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7474,7 +8760,7 @@ func (x *DeleteNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use DeleteNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*DeleteNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{91} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{92} } type PreviewNodeGroupPolicyTargetMatchesRequest struct { @@ -7490,7 +8776,7 @@ type PreviewNodeGroupPolicyTargetMatchesRequest struct { func (x *PreviewNodeGroupPolicyTargetMatchesRequest) Reset() { *x = PreviewNodeGroupPolicyTargetMatchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[92] + mi := &file_api_v1_recommendation_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7503,7 +8789,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesRequest) String() string { func (*PreviewNodeGroupPolicyTargetMatchesRequest) ProtoMessage() {} func (x *PreviewNodeGroupPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[92] + mi := &file_api_v1_recommendation_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7516,7 +8802,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesRequest) ProtoReflect() protoreflect // Deprecated: Use PreviewNodeGroupPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. func (*PreviewNodeGroupPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{92} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{93} } func (x *PreviewNodeGroupPolicyTargetMatchesRequest) GetTeamId() string { @@ -7551,7 +8837,7 @@ type PreviewNodeGroupPolicyTargetMatchesResponse struct { func (x *PreviewNodeGroupPolicyTargetMatchesResponse) Reset() { *x = PreviewNodeGroupPolicyTargetMatchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[93] + mi := &file_api_v1_recommendation_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7564,7 +8850,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesResponse) String() string { func (*PreviewNodeGroupPolicyTargetMatchesResponse) ProtoMessage() {} func (x *PreviewNodeGroupPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[93] + mi := &file_api_v1_recommendation_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7577,7 +8863,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesResponse) ProtoReflect() protoreflec // Deprecated: Use PreviewNodeGroupPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. func (*PreviewNodeGroupPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{93} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{94} } func (x *PreviewNodeGroupPolicyTargetMatchesResponse) GetMatchedNodeGroups() []*NodeGroup { @@ -7601,7 +8887,7 @@ type GetPreviewNodeGroupPolicyTargetRecommendationsRequest struct { func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) Reset() { *x = GetPreviewNodeGroupPolicyTargetRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[94] + mi := &file_api_v1_recommendation_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7614,7 +8900,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) String() string func (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoMessage() {} func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[94] + mi := &file_api_v1_recommendation_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7627,7 +8913,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoReflect() p // Deprecated: Use GetPreviewNodeGroupPolicyTargetRecommendationsRequest.ProtoReflect.Descriptor instead. func (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{94} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{95} } func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) GetTeamId() string { @@ -7669,7 +8955,7 @@ type GetPreviewNodeGroupPolicyTargetRecommendationsResponse struct { func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) Reset() { *x = GetPreviewNodeGroupPolicyTargetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[95] + mi := &file_api_v1_recommendation_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7682,7 +8968,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) String() string func (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoMessage() {} func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[95] + mi := &file_api_v1_recommendation_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7695,7 +8981,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoReflect() // Deprecated: Use GetPreviewNodeGroupPolicyTargetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{95} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{96} } func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) GetRecommendations() []*NodeGroupRecommendation { @@ -7716,6 +9002,9 @@ type BalanceGetRecommendationsRequest struct { // *BalanceGetRecommendationsRequest_Apply // *BalanceGetRecommendationsRequest_WorkloadMeta // *BalanceGetRecommendationsRequest_InClusterRecommendation + // *BalanceGetRecommendationsRequest_SnapshotCrStatusReport + // *BalanceGetRecommendationsRequest_SchedulerEnrollmentReport + // *BalanceGetRecommendationsRequest_SchedulerRevertEventReport // *BalanceGetRecommendationsRequest_OperatorHealth // *BalanceGetRecommendationsRequest_AgentHealth Request isBalanceGetRecommendationsRequest_Request `protobuf_oneof:"request"` @@ -7725,7 +9014,7 @@ type BalanceGetRecommendationsRequest struct { func (x *BalanceGetRecommendationsRequest) Reset() { *x = BalanceGetRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[96] + mi := &file_api_v1_recommendation_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7738,7 +9027,7 @@ func (x *BalanceGetRecommendationsRequest) String() string { func (*BalanceGetRecommendationsRequest) ProtoMessage() {} func (x *BalanceGetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[96] + mi := &file_api_v1_recommendation_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7751,7 +9040,7 @@ func (x *BalanceGetRecommendationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceGetRecommendationsRequest.ProtoReflect.Descriptor instead. func (*BalanceGetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{96} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{97} } func (m *BalanceGetRecommendationsRequest) GetRequest() isBalanceGetRecommendationsRequest_Request { @@ -7789,6 +9078,27 @@ func (x *BalanceGetRecommendationsRequest) GetInClusterRecommendation() *Workloa return nil } +func (x *BalanceGetRecommendationsRequest) GetSnapshotCrStatusReport() *SnapshotCRStatusReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SnapshotCrStatusReport); ok { + return x.SnapshotCrStatusReport + } + return nil +} + +func (x *BalanceGetRecommendationsRequest) GetSchedulerEnrollmentReport() *SchedulerEnrollmentReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport); ok { + return x.SchedulerEnrollmentReport + } + return nil +} + +func (x *BalanceGetRecommendationsRequest) GetSchedulerRevertEventReport() *SchedulerRevertEventReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SchedulerRevertEventReport); ok { + return x.SchedulerRevertEventReport + } + return nil +} + func (x *BalanceGetRecommendationsRequest) GetOperatorHealth() *OperatorHealth { if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_OperatorHealth); ok { return x.OperatorHealth @@ -7833,6 +9143,32 @@ type BalanceGetRecommendationsRequest_InClusterRecommendation struct { InClusterRecommendation *WorkloadRecommendation `protobuf:"bytes,21,opt,name=in_cluster_recommendation,json=inClusterRecommendation,proto3,oneof"` } +type BalanceGetRecommendationsRequest_SnapshotCrStatusReport struct { + // Snapshot policies (spec §8): periodic full snapshot of the + // dakr-managed criu.org CR statuses from the cluster. The operator + // emits no Kubernetes Events — CR status is the entire runtime + // observability channel. dakr ingests with full-sync semantics + // (upsert reported, soft-delete unreported). + SnapshotCrStatusReport *SnapshotCRStatusReport `protobuf:"bytes,31,opt,name=snapshot_cr_status_report,json=snapshotCrStatusReport,proto3,oneof"` +} + +type BalanceGetRecommendationsRequest_SchedulerEnrollmentReport struct { + // Periodic full-sync report of scheduler enrollment state observed + // in-cluster: original-scheduler captures at first application. + // Full-sync semantics mirror SnapshotCRStatusReport. Revert acks do + // NOT ride this message — they use apply with + // RECOMMENDATION_TYPE_SCHEDULER_POLICY and the enrollment id. + SchedulerEnrollmentReport *SchedulerEnrollmentReport `protobuf:"bytes,32,opt,name=scheduler_enrollment_report,json=schedulerEnrollmentReport,proto3,oneof"` +} + +type BalanceGetRecommendationsRequest_SchedulerRevertEventReport struct { + // Fail-open scheduler revert events observed by the admission + // failsafe: pods steered away from an unhealthy tracked scheduler at + // CREATE time. Batched per stream tick, replica-local (each tunr + // replica reports only what its own webhook process observed). + SchedulerRevertEventReport *SchedulerRevertEventReport `protobuf:"bytes,33,opt,name=scheduler_revert_event_report,json=schedulerRevertEventReport,proto3,oneof"` +} + type BalanceGetRecommendationsRequest_OperatorHealth struct { // health check APIs OperatorHealth *OperatorHealth `protobuf:"bytes,71,opt,name=operator_health,json=operatorHealth,proto3,oneof"` @@ -7851,6 +9187,15 @@ func (*BalanceGetRecommendationsRequest_WorkloadMeta) isBalanceGetRecommendation func (*BalanceGetRecommendationsRequest_InClusterRecommendation) isBalanceGetRecommendationsRequest_Request() { } +func (*BalanceGetRecommendationsRequest_SnapshotCrStatusReport) isBalanceGetRecommendationsRequest_Request() { +} + +func (*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport) isBalanceGetRecommendationsRequest_Request() { +} + +func (*BalanceGetRecommendationsRequest_SchedulerRevertEventReport) isBalanceGetRecommendationsRequest_Request() { +} + func (*BalanceGetRecommendationsRequest_OperatorHealth) isBalanceGetRecommendationsRequest_Request() { } @@ -7877,6 +9222,10 @@ type BalanceGetRecommendationsResponse struct { // *BalanceGetRecommendationsResponse_BatchPvcStorageRecommendations // *BalanceGetRecommendationsResponse_BatchWorkloadRules // *BalanceGetRecommendationsResponse_KarpenterSettings + // *BalanceGetRecommendationsResponse_SnapshotRecommendation + // *BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation + // *BalanceGetRecommendationsResponse_BatchHpaConnectors + // *BalanceGetRecommendationsResponse_SchedulerPolicySync Response isBalanceGetRecommendationsResponse_Response `protobuf_oneof:"response"` RequestId string `protobuf:"bytes,99,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // optional } @@ -7884,7 +9233,7 @@ type BalanceGetRecommendationsResponse struct { func (x *BalanceGetRecommendationsResponse) Reset() { *x = BalanceGetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[97] + mi := &file_api_v1_recommendation_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7897,7 +9246,7 @@ func (x *BalanceGetRecommendationsResponse) String() string { func (*BalanceGetRecommendationsResponse) ProtoMessage() {} func (x *BalanceGetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[97] + mi := &file_api_v1_recommendation_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7910,7 +9259,7 @@ func (x *BalanceGetRecommendationsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use BalanceGetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*BalanceGetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{97} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{98} } func (m *BalanceGetRecommendationsResponse) GetResponse() isBalanceGetRecommendationsResponse_Response { @@ -8018,6 +9367,34 @@ func (x *BalanceGetRecommendationsResponse) GetKarpenterSettings() *KarpenterSet return nil } +func (x *BalanceGetRecommendationsResponse) GetSnapshotRecommendation() *SnapshotRecommendation { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_SnapshotRecommendation); ok { + return x.SnapshotRecommendation + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetForensicSnapshotRecommendation() *ForensicSnapshotRecommendation { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation); ok { + return x.ForensicSnapshotRecommendation + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetBatchHpaConnectors() *BatchHPAConnectors { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_BatchHpaConnectors); ok { + return x.BatchHpaConnectors + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetSchedulerPolicySync() *SchedulerPolicySync { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_SchedulerPolicySync); ok { + return x.SchedulerPolicySync + } + return nil +} + func (x *BalanceGetRecommendationsResponse) GetRequestId() string { if x != nil { return x.RequestId @@ -8092,6 +9469,28 @@ type BalanceGetRecommendationsResponse_KarpenterSettings struct { KarpenterSettings *KarpenterSettingsRecommendation `protobuf:"bytes,62,opt,name=karpenter_settings,json=karpenterSettings,proto3,oneof"` } +type BalanceGetRecommendationsResponse_SnapshotRecommendation struct { + // Snapshot policy CRD bundles (checkpoint-restore-operator, spec §7) + SnapshotRecommendation *SnapshotRecommendation `protobuf:"bytes,63,opt,name=snapshot_recommendation,json=snapshotRecommendation,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation struct { + ForensicSnapshotRecommendation *ForensicSnapshotRecommendation `protobuf:"bytes,64,opt,name=forensic_snapshot_recommendation,json=forensicSnapshotRecommendation,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_BatchHpaConnectors struct { + // HPA connector CRD push-down + BatchHpaConnectors *BatchHPAConnectors `protobuf:"bytes,65,opt,name=batch_hpa_connectors,json=batchHpaConnectors,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_SchedulerPolicySync struct { + // Full desired scheduler-policy set for this cluster plus pending + // revert instructions. Hash-gated full-sync push (see + // scheduler_policy_delivery.go); tunr reconciles it into the + // cluster-scoped SchedulerPolicy CRD and executes reverts. + SchedulerPolicySync *SchedulerPolicySync `protobuf:"bytes,66,opt,name=scheduler_policy_sync,json=schedulerPolicySync,proto3,oneof"` +} + func (*BalanceGetRecommendationsResponse_NodeGroupRecommendation) isBalanceGetRecommendationsResponse_Response() { } @@ -8134,6 +9533,18 @@ func (*BalanceGetRecommendationsResponse_BatchWorkloadRules) isBalanceGetRecomme func (*BalanceGetRecommendationsResponse_KarpenterSettings) isBalanceGetRecommendationsResponse_Response() { } +func (*BalanceGetRecommendationsResponse_SnapshotRecommendation) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_BatchHpaConnectors) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_SchedulerPolicySync) isBalanceGetRecommendationsResponse_Response() { +} + type BatchNodeGroupRecommendations struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8145,7 +9556,7 @@ type BatchNodeGroupRecommendations struct { func (x *BatchNodeGroupRecommendations) Reset() { *x = BatchNodeGroupRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[98] + mi := &file_api_v1_recommendation_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8158,7 +9569,7 @@ func (x *BatchNodeGroupRecommendations) String() string { func (*BatchNodeGroupRecommendations) ProtoMessage() {} func (x *BatchNodeGroupRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[98] + mi := &file_api_v1_recommendation_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8171,7 +9582,7 @@ func (x *BatchNodeGroupRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchNodeGroupRecommendations.ProtoReflect.Descriptor instead. func (*BatchNodeGroupRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{98} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{99} } func (x *BatchNodeGroupRecommendations) GetRecommendations() []*NodeGroupRecommendation { @@ -8192,7 +9603,7 @@ type BatchWorkloadRecommendations struct { func (x *BatchWorkloadRecommendations) Reset() { *x = BatchWorkloadRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[99] + mi := &file_api_v1_recommendation_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8205,7 +9616,7 @@ func (x *BatchWorkloadRecommendations) String() string { func (*BatchWorkloadRecommendations) ProtoMessage() {} func (x *BatchWorkloadRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[99] + mi := &file_api_v1_recommendation_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8218,7 +9629,7 @@ func (x *BatchWorkloadRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchWorkloadRecommendations.ProtoReflect.Descriptor instead. func (*BatchWorkloadRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{99} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{100} } func (x *BatchWorkloadRecommendations) GetRecommendations() []*WorkloadRecommendation { @@ -8265,20 +9676,57 @@ type WorkloadRule struct { // Whether the rule evaluator should create recommendations that use // in-place pod vertical scaling instead of triggering pod restarts. UseInPlaceVerticalScaling bool `protobuf:"varint,70,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Opt-in: allow an in-place resize to LOWER a container's memory limit. + // Only consulted when use_in_place_vertical_scaling is true, and it never + // relaxes the Kubernetes version gate — a decrease still additionally + // requires a cluster new enough to accept one. Default false because + // shrinking a live container's memory limit can OOM-kill it. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,71,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // UI display fields (not sent to cluster, only used for listing) Status string `protobuf:"bytes,80,opt,name=status,proto3" json:"status,omitempty"` // "active" or "inactive" SyncStatus string `protobuf:"bytes,81,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` // "pending", "synced", or "failed" CurrentSource string `protobuf:"bytes,82,opt,name=current_source,json=currentSource,proto3" json:"current_source,omitempty"` // "crd", "policy", "auto_optimization", "manual", "pulumi_manual", "pulumi_auto", "terraform_manual", "terraform_auto" CreatedAt *timestamppb.Timestamp `protobuf:"bytes,83,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,84,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // True when the underlying workload (cluster_id, namespace, kind, name) + // is no longer present in the cluster. Populated by ListWorkloadRules + // at read time via a presence lookup against the workload tables — NOT + // persisted on the rule itself. Orthogonal to `status` (which reflects + // whether the rule's policy is enabled) — an Active rule can be + // orphaned if its workload was deleted, and will be cleaned up by the + // orphan janitor after a grace period. + IsOrphaned bool `protobuf:"varint,85,opt,name=is_orphaned,json=isOrphaned,proto3" json:"is_orphaned,omitempty"` // Per-container resource configurations (VPA). When empty, workload-level rules apply to all containers. Containers []*ContainerResourceRuleConfig `protobuf:"bytes,90,rep,name=containers,proto3" json:"containers,omitempty"` + // JVM heap optimization overrides for this rule. + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,91,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + // Per-rule override of the JVM CPU startup floor (millicores). Standalone — + // deliberately NOT inside jvm_heap_rule and not gated by its enabled flag + // (the floor is always-on for detected JVMs). Unset = inherit policy / + // system default (75m). Explicit 0 = floor disabled for this rule. + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,92,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Rule-wide on/off switch, independent of `status`/`sync_status`. A + // disabled rule still exists (status stays "active") but every CP loop + // and the in-cluster operator treat it as a full no-op: no further + // regeneration, no evaluation, no emergency OOM/throttle response. + Disabled bool `protobuf:"varint,93,opt,name=disabled,proto3" json:"disabled,omitempty"` + // Per-rule override of the metrics lookback window (seconds). Unset = + // inherit the owning policy's window, else the 7-day default. + // + // Mirrored onto the CRD for visibility only — the operator evaluates off + // zxporter's rolling 5-minute window and never queries history. + LookbackPeriodSeconds *int32 `protobuf:"varint,94,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // KEDA ScaledObject template authored by dakr and carried to tunr. + // When set, tunr owns the ScaledObject lifecycle (create/update/delete) + // rather than generating its own HPA. Renumbered 94→95 on the main merge + // (main took 94 for lookback_period_seconds). + KedaScaledObject *KEDAScaledObjectTemplate `protobuf:"bytes,95,opt,name=keda_scaled_object,json=kedaScaledObject,proto3,oneof" json:"keda_scaled_object,omitempty"` } func (x *WorkloadRule) Reset() { *x = WorkloadRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[100] + mi := &file_api_v1_recommendation_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8291,7 +9739,7 @@ func (x *WorkloadRule) String() string { func (*WorkloadRule) ProtoMessage() {} func (x *WorkloadRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[100] + mi := &file_api_v1_recommendation_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8304,7 +9752,7 @@ func (x *WorkloadRule) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRule.ProtoReflect.Descriptor instead. func (*WorkloadRule) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{100} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{101} } func (x *WorkloadRule) GetRuleId() string { @@ -8489,6 +9937,13 @@ func (x *WorkloadRule) GetUseInPlaceVerticalScaling() bool { return false } +func (x *WorkloadRule) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + func (x *WorkloadRule) GetStatus() string { if x != nil { return x.Status @@ -8524,6 +9979,13 @@ func (x *WorkloadRule) GetUpdatedAt() *timestamppb.Timestamp { return nil } +func (x *WorkloadRule) GetIsOrphaned() bool { + if x != nil { + return x.IsOrphaned + } + return false +} + func (x *WorkloadRule) GetContainers() []*ContainerResourceRuleConfig { if x != nil { return x.Containers @@ -8531,6 +9993,41 @@ func (x *WorkloadRule) GetContainers() []*ContainerResourceRuleConfig { return nil } +func (x *WorkloadRule) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *WorkloadRule) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *WorkloadRule) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *WorkloadRule) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *WorkloadRule) GetKedaScaledObject() *KEDAScaledObjectTemplate { + if x != nil { + return x.KedaScaledObject + } + return nil +} + type ResourceRuleConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8551,12 +10048,57 @@ type ResourceRuleConfig struct { PmaxRatio *float32 `protobuf:"fixed32,12,opt,name=pmax_ratio,json=pmaxRatio,proto3,oneof" json:"pmax_ratio,omitempty"` // Whether to actively remove limits from workloads. LimitsRemovalEnabled bool `protobuf:"varint,13,opt,name=limits_removal_enabled,json=limitsRemovalEnabled,proto3" json:"limits_removal_enabled,omitempty"` + // Human-readable annotations from the engine: clamp messages, pmax / + // throttle / OOM floor activation, and "request exceeds existing limit" + // warnings. Surfaced through PreviewWorkloadRule so the UI can show why + // the produced BaseRequest differs from the user's expectation. Not + // persisted — recomputed on every generation/preview. + Notes []string `protobuf:"bytes,14,rep,name=notes,proto3" json:"notes,omitempty"` + // Recommendation floor (rules/v2, request only): the recommended request + // is never lowered below floor_percent% (1-100) of initial_request, the + // cached immutable baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. initial_request is editable + // through the generic manual-rule surface like min_request (no special + // protection). Unset floor_percent = floor disabled. Resolved in the + // in-cluster tunr evaluator, not pre-resolved by dakr. + InitialRequest *int64 `protobuf:"varint,15,opt,name=initial_request,json=initialRequest,proto3,oneof" json:"initial_request,omitempty"` + FloorPercent *int64 `protobuf:"varint,16,opt,name=floor_percent,json=floorPercent,proto3,oneof" json:"floor_percent,omitempty"` + // Recommendation ceiling (rules/v2, request only): the recommended request + // is never raised above ceiling_percent% (1-1000) of initial_request. The + // mirror of floor_percent; a ceiling below 100 is intentionally allowed as + // a baseline-relative cap distinct from max_request. Unset = ceiling + // disabled. Resolved in the in-cluster tunr evaluator, not pre-resolved by + // dakr. + CeilingPercent *int64 `protobuf:"varint,17,opt,name=ceiling_percent,json=ceilingPercent,proto3,oneof" json:"ceiling_percent,omitempty"` + // Limit floor/ceiling (rules/v2, limit only): the recommended limit is + // never lowered below limit_floor_percent% (1-100) nor raised above + // limit_ceiling_percent% (1-1000) of initial_limit, the cached immutable + // initial-limit baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. Applied only when limits + // adjustment is enabled and limits removal is not; the recommended + // request always wins over the limit ceiling (the limit is never clamped + // below the request). Unset = bound disabled. Resolved in the in-cluster + // tunr evaluator, not pre-resolved by dakr. + InitialLimit *int64 `protobuf:"varint,18,opt,name=initial_limit,json=initialLimit,proto3,oneof" json:"initial_limit,omitempty"` + LimitFloorPercent *int64 `protobuf:"varint,19,opt,name=limit_floor_percent,json=limitFloorPercent,proto3,oneof" json:"limit_floor_percent,omitempty"` + LimitCeilingPercent *int64 `protobuf:"varint,20,opt,name=limit_ceiling_percent,json=limitCeilingPercent,proto3,oneof" json:"limit_ceiling_percent,omitempty"` + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + RequestUseRss *bool `protobuf:"varint,21,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + LimitUseRss *bool `protobuf:"varint,22,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` + // Memory-only: request-equivalent baseline on the *limit* basis (bytes). The + // generator emits this only when the limit basis differs from the request + // basis (RSS vs working set); 0 otherwise, meaning "derive the limit as + // request × limit_multiplier" (byte-identical default). NOT pre-multiplied. + // Consumed by the in-cluster tunr evaluator's normal-mode baseline path. + BaseLimit int64 `protobuf:"varint,23,opt,name=base_limit,json=baseLimit,proto3" json:"base_limit,omitempty"` } func (x *ResourceRuleConfig) Reset() { *x = ResourceRuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[101] + mi := &file_api_v1_recommendation_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8569,7 +10111,7 @@ func (x *ResourceRuleConfig) String() string { func (*ResourceRuleConfig) ProtoMessage() {} func (x *ResourceRuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[101] + mi := &file_api_v1_recommendation_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8582,7 +10124,7 @@ func (x *ResourceRuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceRuleConfig.ProtoReflect.Descriptor instead. func (*ResourceRuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{101} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{102} } func (x *ResourceRuleConfig) GetEnabled() bool { @@ -8676,6 +10218,76 @@ func (x *ResourceRuleConfig) GetLimitsRemovalEnabled() bool { return false } +func (x *ResourceRuleConfig) GetNotes() []string { + if x != nil { + return x.Notes + } + return nil +} + +func (x *ResourceRuleConfig) GetInitialRequest() int64 { + if x != nil && x.InitialRequest != nil { + return *x.InitialRequest + } + return 0 +} + +func (x *ResourceRuleConfig) GetFloorPercent() int64 { + if x != nil && x.FloorPercent != nil { + return *x.FloorPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetCeilingPercent() int64 { + if x != nil && x.CeilingPercent != nil { + return *x.CeilingPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetInitialLimit() int64 { + if x != nil && x.InitialLimit != nil { + return *x.InitialLimit + } + return 0 +} + +func (x *ResourceRuleConfig) GetLimitFloorPercent() int64 { + if x != nil && x.LimitFloorPercent != nil { + return *x.LimitFloorPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetLimitCeilingPercent() int64 { + if x != nil && x.LimitCeilingPercent != nil { + return *x.LimitCeilingPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *ResourceRuleConfig) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + +func (x *ResourceRuleConfig) GetBaseLimit() int64 { + if x != nil { + return x.BaseLimit + } + return 0 +} + type HPAMetricTrigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8688,12 +10300,13 @@ type HPAMetricTrigger struct { Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Free-form key-value for external scalers (e.g. serverAddress, query for Prometheus) ServerAddress *string `protobuf:"bytes,6,opt,name=server_address,json=serverAddress,proto3,oneof" json:"server_address,omitempty"` // Frontend-friendly: Prometheus server URL (packed into metadata by service layer) Query *string `protobuf:"bytes,7,opt,name=query,proto3,oneof" json:"query,omitempty"` // Frontend-friendly: PromQL query (packed into metadata by service layer) + ConnectorId *string `protobuf:"bytes,8,opt,name=connector_id,json=connectorId,proto3,oneof" json:"connector_id,omitempty"` // References HPAConnector by dakr-side UUID } func (x *HPAMetricTrigger) Reset() { *x = HPAMetricTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[102] + mi := &file_api_v1_recommendation_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8706,7 +10319,7 @@ func (x *HPAMetricTrigger) String() string { func (*HPAMetricTrigger) ProtoMessage() {} func (x *HPAMetricTrigger) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[102] + mi := &file_api_v1_recommendation_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8719,7 +10332,7 @@ func (x *HPAMetricTrigger) ProtoReflect() protoreflect.Message { // Deprecated: Use HPAMetricTrigger.ProtoReflect.Descriptor instead. func (*HPAMetricTrigger) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{102} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{103} } func (x *HPAMetricTrigger) GetType() string { @@ -8771,6 +10384,13 @@ func (x *HPAMetricTrigger) GetQuery() string { return "" } +func (x *HPAMetricTrigger) GetConnectorId() string { + if x != nil && x.ConnectorId != nil { + return *x.ConnectorId + } + return "" +} + // HPABehavior, HPAScalingRules, HPAScalingPolicy are defined in common.proto type HPAFallback struct { state protoimpl.MessageState @@ -8785,7 +10405,7 @@ type HPAFallback struct { func (x *HPAFallback) Reset() { *x = HPAFallback{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[103] + mi := &file_api_v1_recommendation_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8798,7 +10418,7 @@ func (x *HPAFallback) String() string { func (*HPAFallback) ProtoMessage() {} func (x *HPAFallback) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[103] + mi := &file_api_v1_recommendation_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8811,7 +10431,7 @@ func (x *HPAFallback) ProtoReflect() protoreflect.Message { // Deprecated: Use HPAFallback.ProtoReflect.Descriptor instead. func (*HPAFallback) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{103} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{104} } func (x *HPAFallback) GetReplicas() int32 { @@ -8852,12 +10472,24 @@ type ContainerResourceConfig struct { // Carried so the UI can surface profiling's per-container percentile // pick alongside the workload-level chip. TargetPercentile *float32 `protobuf:"fixed32,8,opt,name=target_percentile,json=targetPercentile,proto3,oneof" json:"target_percentile,omitempty"` + // Human-readable annotations from the engine for this container. + // See ResourceRuleConfig.notes for semantics. + Notes []string `protobuf:"bytes,9,rep,name=notes,proto3" json:"notes,omitempty"` + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + RequestUseRss *bool `protobuf:"varint,10,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + LimitUseRss *bool `protobuf:"varint,11,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` + // Memory-only: request-equivalent baseline on the *limit* basis (bytes), + // emitted only when the limit basis differs from the request basis; 0 + // otherwise. See ResourceRuleConfig.base_limit for full semantics. + BaseLimit int64 `protobuf:"varint,12,opt,name=base_limit,json=baseLimit,proto3" json:"base_limit,omitempty"` } func (x *ContainerResourceConfig) Reset() { *x = ContainerResourceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[104] + mi := &file_api_v1_recommendation_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8870,7 +10502,7 @@ func (x *ContainerResourceConfig) String() string { func (*ContainerResourceConfig) ProtoMessage() {} func (x *ContainerResourceConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[104] + mi := &file_api_v1_recommendation_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8883,7 +10515,7 @@ func (x *ContainerResourceConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerResourceConfig.ProtoReflect.Descriptor instead. func (*ContainerResourceConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{104} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{105} } func (x *ContainerResourceConfig) GetEnabled() bool { @@ -8942,6 +10574,34 @@ func (x *ContainerResourceConfig) GetTargetPercentile() float32 { return 0 } +func (x *ContainerResourceConfig) GetNotes() []string { + if x != nil { + return x.Notes + } + return nil +} + +func (x *ContainerResourceConfig) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *ContainerResourceConfig) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + +func (x *ContainerResourceConfig) GetBaseLimit() int64 { + if x != nil { + return x.BaseLimit + } + return 0 +} + // Per-container resource rule config with CPU/Memory/GPU. type ContainerResourceRuleConfig struct { state protoimpl.MessageState @@ -8957,7 +10617,7 @@ type ContainerResourceRuleConfig struct { func (x *ContainerResourceRuleConfig) Reset() { *x = ContainerResourceRuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[105] + mi := &file_api_v1_recommendation_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8970,7 +10630,7 @@ func (x *ContainerResourceRuleConfig) String() string { func (*ContainerResourceRuleConfig) ProtoMessage() {} func (x *ContainerResourceRuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[105] + mi := &file_api_v1_recommendation_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8983,7 +10643,7 @@ func (x *ContainerResourceRuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerResourceRuleConfig.ProtoReflect.Descriptor instead. func (*ContainerResourceRuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{105} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{106} } func (x *ContainerResourceRuleConfig) GetContainerName() string { @@ -9014,6 +10674,111 @@ func (x *ContainerResourceRuleConfig) GetGpuRule() *ContainerResourceConfig { return nil } +// JVMHeapRuleConfig mirrors the policy-level JVM heap knobs as per-rule overrides. +// Gated by enabled; the optional knobs are overrides — unset = use the default. +type JVMHeapRuleConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + TargetPercentile *float32 `protobuf:"fixed32,2,opt,name=target_percentile,json=targetPercentile,proto3,oneof" json:"target_percentile,omitempty"` + HeadroomMultiplier *float32 `protobuf:"fixed32,3,opt,name=headroom_multiplier,json=headroomMultiplier,proto3,oneof" json:"headroom_multiplier,omitempty"` + NonHeapOverheadPercent *float32 `protobuf:"fixed32,4,opt,name=non_heap_overhead_percent,json=nonHeapOverheadPercent,proto3,oneof" json:"non_heap_overhead_percent,omitempty"` + NonHeapOverheadBytes *int64 `protobuf:"varint,5,opt,name=non_heap_overhead_bytes,json=nonHeapOverheadBytes,proto3,oneof" json:"non_heap_overhead_bytes,omitempty"` + MinHeapBytes *int64 `protobuf:"varint,6,opt,name=min_heap_bytes,json=minHeapBytes,proto3,oneof" json:"min_heap_bytes,omitempty"` + MaxHeapBytes *int64 `protobuf:"varint,7,opt,name=max_heap_bytes,json=maxHeapBytes,proto3,oneof" json:"max_heap_bytes,omitempty"` + PreferContainerSupport bool `protobuf:"varint,8,opt,name=prefer_container_support,json=preferContainerSupport,proto3" json:"prefer_container_support,omitempty"` +} + +func (x *JVMHeapRuleConfig) Reset() { + *x = JVMHeapRuleConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JVMHeapRuleConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JVMHeapRuleConfig) ProtoMessage() {} + +func (x *JVMHeapRuleConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[107] + 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 JVMHeapRuleConfig.ProtoReflect.Descriptor instead. +func (*JVMHeapRuleConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{107} +} + +func (x *JVMHeapRuleConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *JVMHeapRuleConfig) GetTargetPercentile() float32 { + if x != nil && x.TargetPercentile != nil { + return *x.TargetPercentile + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetHeadroomMultiplier() float32 { + if x != nil && x.HeadroomMultiplier != nil { + return *x.HeadroomMultiplier + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetNonHeapOverheadPercent() float32 { + if x != nil && x.NonHeapOverheadPercent != nil { + return *x.NonHeapOverheadPercent + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetNonHeapOverheadBytes() int64 { + if x != nil && x.NonHeapOverheadBytes != nil { + return *x.NonHeapOverheadBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetMinHeapBytes() int64 { + if x != nil && x.MinHeapBytes != nil { + return *x.MinHeapBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetMaxHeapBytes() int64 { + if x != nil && x.MaxHeapBytes != nil { + return *x.MaxHeapBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetPreferContainerSupport() bool { + if x != nil { + return x.PreferContainerSupport + } + return false +} + type HPARuleConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9022,23 +10787,18 @@ type HPARuleConfig struct { Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` MinReplicas *int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3,oneof" json:"min_replicas,omitempty"` MaxReplicas *int32 `protobuf:"varint,3,opt,name=max_replicas,json=maxReplicas,proto3,oneof" json:"max_replicas,omitempty"` - TargetUtilization *float32 `protobuf:"fixed32,4,opt,name=target_utilization,json=targetUtilization,proto3,oneof" json:"target_utilization,omitempty"` - PrimaryMetric *HPAMetricType `protobuf:"varint,5,opt,name=primary_metric,json=primaryMetric,proto3,enum=api.v1.HPAMetricType,oneof" json:"primary_metric,omitempty"` MaxReplicaChangePercent *float32 `protobuf:"fixed32,6,opt,name=max_replica_change_percent,json=maxReplicaChangePercent,proto3,oneof" json:"max_replica_change_percent,omitempty"` Metrics []*HPAMetricTrigger `protobuf:"bytes,7,rep,name=metrics,proto3" json:"metrics,omitempty"` Behavior *HPABehavior `protobuf:"bytes,8,opt,name=behavior,proto3,oneof" json:"behavior,omitempty"` CompositeFormula *string `protobuf:"bytes,9,opt,name=composite_formula,json=compositeFormula,proto3,oneof" json:"composite_formula,omitempty"` Fallback *HPAFallback `protobuf:"bytes,10,opt,name=fallback,proto3,oneof" json:"fallback,omitempty"` ScaleDownCooldownSeconds *int32 `protobuf:"varint,11,opt,name=scale_down_cooldown_seconds,json=scaleDownCooldownSeconds,proto3,oneof" json:"scale_down_cooldown_seconds,omitempty"` - // Target memory utilization (0.0-1.0). Separate from target_utilization (CPU) - // to allow independent tuning per resource. - TargetMemoryUtilization *float32 `protobuf:"fixed32,12,opt,name=target_memory_utilization,json=targetMemoryUtilization,proto3,oneof" json:"target_memory_utilization,omitempty"` } func (x *HPARuleConfig) Reset() { *x = HPARuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[106] + mi := &file_api_v1_recommendation_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9051,7 +10811,7 @@ func (x *HPARuleConfig) String() string { func (*HPARuleConfig) ProtoMessage() {} func (x *HPARuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[106] + mi := &file_api_v1_recommendation_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9064,7 +10824,7 @@ func (x *HPARuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use HPARuleConfig.ProtoReflect.Descriptor instead. func (*HPARuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{106} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{108} } func (x *HPARuleConfig) GetEnabled() bool { @@ -9088,20 +10848,6 @@ func (x *HPARuleConfig) GetMaxReplicas() int32 { return 0 } -func (x *HPARuleConfig) GetTargetUtilization() float32 { - if x != nil && x.TargetUtilization != nil { - return *x.TargetUtilization - } - return 0 -} - -func (x *HPARuleConfig) GetPrimaryMetric() HPAMetricType { - if x != nil && x.PrimaryMetric != nil { - return *x.PrimaryMetric - } - return HPAMetricType_HPA_METRIC_TYPE_UNSPECIFIED -} - func (x *HPARuleConfig) GetMaxReplicaChangePercent() float32 { if x != nil && x.MaxReplicaChangePercent != nil { return *x.MaxReplicaChangePercent @@ -9144,13 +10890,6 @@ func (x *HPARuleConfig) GetScaleDownCooldownSeconds() int32 { return 0 } -func (x *HPARuleConfig) GetTargetMemoryUtilization() float32 { - if x != nil && x.TargetMemoryUtilization != nil { - return *x.TargetMemoryUtilization - } - return 0 -} - type EmergencyResponseConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9168,7 +10907,7 @@ type EmergencyResponseConfig struct { func (x *EmergencyResponseConfig) Reset() { *x = EmergencyResponseConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[107] + mi := &file_api_v1_recommendation_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9181,7 +10920,7 @@ func (x *EmergencyResponseConfig) String() string { func (*EmergencyResponseConfig) ProtoMessage() {} func (x *EmergencyResponseConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[107] + mi := &file_api_v1_recommendation_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9194,7 +10933,7 @@ func (x *EmergencyResponseConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyResponseConfig.ProtoReflect.Descriptor instead. func (*EmergencyResponseConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{107} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{109} } func (x *EmergencyResponseConfig) GetOomEnabled() bool { @@ -9246,6 +10985,382 @@ func (x *EmergencyResponseConfig) GetCpuThrottlingMultiplier() float32 { return 0 } +// KEDAScaledObjectTemplate is the user-authored KEDA ScaledObject configuration +// carried from dakr to the in-cluster tunr operator. tunr materialises it into +// a live ScaledObject and owns the lifecycle (create/update/delete). +type KEDAScaledObjectTemplate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Triggers []*KEDATrigger `protobuf:"bytes,1,rep,name=triggers,proto3" json:"triggers,omitempty"` + MinReplicaCount *int32 `protobuf:"varint,2,opt,name=min_replica_count,json=minReplicaCount,proto3,oneof" json:"min_replica_count,omitempty"` + MaxReplicaCount *int32 `protobuf:"varint,3,opt,name=max_replica_count,json=maxReplicaCount,proto3,oneof" json:"max_replica_count,omitempty"` + IdleReplicaCount *int32 `protobuf:"varint,4,opt,name=idle_replica_count,json=idleReplicaCount,proto3,oneof" json:"idle_replica_count,omitempty"` + PollingInterval *int32 `protobuf:"varint,5,opt,name=polling_interval,json=pollingInterval,proto3,oneof" json:"polling_interval,omitempty"` + CooldownPeriod *int32 `protobuf:"varint,6,opt,name=cooldown_period,json=cooldownPeriod,proto3,oneof" json:"cooldown_period,omitempty"` + InitialCooldownPeriod *int32 `protobuf:"varint,7,opt,name=initial_cooldown_period,json=initialCooldownPeriod,proto3,oneof" json:"initial_cooldown_period,omitempty"` + Fallback *KEDAFallback `protobuf:"bytes,8,opt,name=fallback,proto3,oneof" json:"fallback,omitempty"` + Advanced *KEDAAdvanced `protobuf:"bytes,9,opt,name=advanced,proto3,oneof" json:"advanced,omitempty"` +} + +func (x *KEDAScaledObjectTemplate) Reset() { + *x = KEDAScaledObjectTemplate{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAScaledObjectTemplate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAScaledObjectTemplate) ProtoMessage() {} + +func (x *KEDAScaledObjectTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[110] + 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 KEDAScaledObjectTemplate.ProtoReflect.Descriptor instead. +func (*KEDAScaledObjectTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} +} + +func (x *KEDAScaledObjectTemplate) GetTriggers() []*KEDATrigger { + if x != nil { + return x.Triggers + } + return nil +} + +func (x *KEDAScaledObjectTemplate) GetMinReplicaCount() int32 { + if x != nil && x.MinReplicaCount != nil { + return *x.MinReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetMaxReplicaCount() int32 { + if x != nil && x.MaxReplicaCount != nil { + return *x.MaxReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetIdleReplicaCount() int32 { + if x != nil && x.IdleReplicaCount != nil { + return *x.IdleReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetPollingInterval() int32 { + if x != nil && x.PollingInterval != nil { + return *x.PollingInterval + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetCooldownPeriod() int32 { + if x != nil && x.CooldownPeriod != nil { + return *x.CooldownPeriod + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetInitialCooldownPeriod() int32 { + if x != nil && x.InitialCooldownPeriod != nil { + return *x.InitialCooldownPeriod + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetFallback() *KEDAFallback { + if x != nil { + return x.Fallback + } + return nil +} + +func (x *KEDAScaledObjectTemplate) GetAdvanced() *KEDAAdvanced { + if x != nil { + return x.Advanced + } + return nil +} + +type KEDATrigger struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MetricType string `protobuf:"bytes,4,opt,name=metric_type,json=metricType,proto3" json:"metric_type,omitempty"` + AuthenticationRef *KEDAAuthenticationRef `protobuf:"bytes,5,opt,name=authentication_ref,json=authenticationRef,proto3,oneof" json:"authentication_ref,omitempty"` + UseCachedMetrics bool `protobuf:"varint,6,opt,name=use_cached_metrics,json=useCachedMetrics,proto3" json:"use_cached_metrics,omitempty"` +} + +func (x *KEDATrigger) Reset() { + *x = KEDATrigger{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDATrigger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDATrigger) ProtoMessage() {} + +func (x *KEDATrigger) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[111] + 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 KEDATrigger.ProtoReflect.Descriptor instead. +func (*KEDATrigger) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} +} + +func (x *KEDATrigger) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *KEDATrigger) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KEDATrigger) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *KEDATrigger) GetMetricType() string { + if x != nil { + return x.MetricType + } + return "" +} + +func (x *KEDATrigger) GetAuthenticationRef() *KEDAAuthenticationRef { + if x != nil { + return x.AuthenticationRef + } + return nil +} + +func (x *KEDATrigger) GetUseCachedMetrics() bool { + if x != nil { + return x.UseCachedMetrics + } + return false +} + +type KEDAAuthenticationRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` +} + +func (x *KEDAAuthenticationRef) Reset() { + *x = KEDAAuthenticationRef{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAAuthenticationRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAAuthenticationRef) ProtoMessage() {} + +func (x *KEDAAuthenticationRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[112] + 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 KEDAAuthenticationRef.ProtoReflect.Descriptor instead. +func (*KEDAAuthenticationRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} +} + +func (x *KEDAAuthenticationRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KEDAAuthenticationRef) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +type KEDAFallback struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailureThreshold int32 `protobuf:"varint,1,opt,name=failure_threshold,json=failureThreshold,proto3" json:"failure_threshold,omitempty"` + Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` + Behavior string `protobuf:"bytes,3,opt,name=behavior,proto3" json:"behavior,omitempty"` +} + +func (x *KEDAFallback) Reset() { + *x = KEDAFallback{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAFallback) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAFallback) ProtoMessage() {} + +func (x *KEDAFallback) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[113] + 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 KEDAFallback.ProtoReflect.Descriptor instead. +func (*KEDAFallback) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} +} + +func (x *KEDAFallback) GetFailureThreshold() int32 { + if x != nil { + return x.FailureThreshold + } + return 0 +} + +func (x *KEDAFallback) GetReplicas() int32 { + if x != nil { + return x.Replicas + } + return 0 +} + +func (x *KEDAFallback) GetBehavior() string { + if x != nil { + return x.Behavior + } + return "" +} + +type KEDAAdvanced struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RestoreToOriginalReplicaCount bool `protobuf:"varint,1,opt,name=restore_to_original_replica_count,json=restoreToOriginalReplicaCount,proto3" json:"restore_to_original_replica_count,omitempty"` + // advanced_behavior_json carries the k8s HorizontalPodAutoscalerBehavior as an + // opaque JSON string so dakr never re-models k8s types; tunr unmarshals it. + AdvancedBehaviorJson string `protobuf:"bytes,2,opt,name=advanced_behavior_json,json=advancedBehaviorJson,proto3" json:"advanced_behavior_json,omitempty"` +} + +func (x *KEDAAdvanced) Reset() { + *x = KEDAAdvanced{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[114] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAAdvanced) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAAdvanced) ProtoMessage() {} + +func (x *KEDAAdvanced) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[114] + 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 KEDAAdvanced.ProtoReflect.Descriptor instead. +func (*KEDAAdvanced) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{114} +} + +func (x *KEDAAdvanced) GetRestoreToOriginalReplicaCount() bool { + if x != nil { + return x.RestoreToOriginalReplicaCount + } + return false +} + +func (x *KEDAAdvanced) GetAdvancedBehaviorJson() string { + if x != nil { + return x.AdvancedBehaviorJson + } + return "" +} + // PercentileValues contains pre-computed percentile values for a single resource axis type PercentileValues struct { state protoimpl.MessageState @@ -9262,7 +11377,7 @@ type PercentileValues struct { func (x *PercentileValues) Reset() { *x = PercentileValues{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[108] + mi := &file_api_v1_recommendation_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9275,7 +11390,7 @@ func (x *PercentileValues) String() string { func (*PercentileValues) ProtoMessage() {} func (x *PercentileValues) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[108] + mi := &file_api_v1_recommendation_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9288,7 +11403,7 @@ func (x *PercentileValues) ProtoReflect() protoreflect.Message { // Deprecated: Use PercentileValues.ProtoReflect.Descriptor instead. func (*PercentileValues) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{108} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{115} } func (x *PercentileValues) GetP50() int64 { @@ -9341,7 +11456,7 @@ type ResourcePercentiles struct { func (x *ResourcePercentiles) Reset() { *x = ResourcePercentiles{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[109] + mi := &file_api_v1_recommendation_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9354,7 +11469,7 @@ func (x *ResourcePercentiles) String() string { func (*ResourcePercentiles) ProtoMessage() {} func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[109] + mi := &file_api_v1_recommendation_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9367,7 +11482,7 @@ func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourcePercentiles.ProtoReflect.Descriptor instead. func (*ResourcePercentiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{109} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{116} } func (x *ResourcePercentiles) GetCpu() *PercentileValues { @@ -9415,7 +11530,7 @@ type BurstinessRatios struct { func (x *BurstinessRatios) Reset() { *x = BurstinessRatios{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[110] + mi := &file_api_v1_recommendation_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9428,7 +11543,7 @@ func (x *BurstinessRatios) String() string { func (*BurstinessRatios) ProtoMessage() {} func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[110] + mi := &file_api_v1_recommendation_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9441,7 +11556,7 @@ func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { // Deprecated: Use BurstinessRatios.ProtoReflect.Descriptor instead. func (*BurstinessRatios) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{117} } func (x *BurstinessRatios) GetCpu() float64 { @@ -9499,7 +11614,7 @@ type WorkloadClassification struct { func (x *WorkloadClassification) Reset() { *x = WorkloadClassification{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[111] + mi := &file_api_v1_recommendation_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9512,7 +11627,7 @@ func (x *WorkloadClassification) String() string { func (*WorkloadClassification) ProtoMessage() {} func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[111] + mi := &file_api_v1_recommendation_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9525,7 +11640,7 @@ func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadClassification.ProtoReflect.Descriptor instead. func (*WorkloadClassification) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{118} } func (x *WorkloadClassification) GetDominantResource() string { @@ -9554,7 +11669,7 @@ type BatchWorkloadRules struct { func (x *BatchWorkloadRules) Reset() { *x = BatchWorkloadRules{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[112] + mi := &file_api_v1_recommendation_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9567,7 +11682,7 @@ func (x *BatchWorkloadRules) String() string { func (*BatchWorkloadRules) ProtoMessage() {} func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[112] + mi := &file_api_v1_recommendation_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9580,7 +11695,7 @@ func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchWorkloadRules.ProtoReflect.Descriptor instead. func (*BatchWorkloadRules) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{119} } func (x *BatchWorkloadRules) GetRules() []*WorkloadRule { @@ -9597,6 +11712,61 @@ func (x *BatchWorkloadRules) GetRuleIdsToDelete() []string { return nil } +type BatchHPAConnectors struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Connectors []*HPAConnector `protobuf:"bytes,1,rep,name=connectors,proto3" json:"connectors,omitempty"` + ConnectorIdsToDelete []string `protobuf:"bytes,2,rep,name=connector_ids_to_delete,json=connectorIdsToDelete,proto3" json:"connector_ids_to_delete,omitempty"` +} + +func (x *BatchHPAConnectors) Reset() { + *x = BatchHPAConnectors{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[120] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchHPAConnectors) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchHPAConnectors) ProtoMessage() {} + +func (x *BatchHPAConnectors) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[120] + 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 BatchHPAConnectors.ProtoReflect.Descriptor instead. +func (*BatchHPAConnectors) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{120} +} + +func (x *BatchHPAConnectors) GetConnectors() []*HPAConnector { + if x != nil { + return x.Connectors + } + return nil +} + +func (x *BatchHPAConnectors) GetConnectorIdsToDelete() []string { + if x != nil { + return x.ConnectorIdsToDelete + } + return nil +} + type WorkloadWithActiveRecommendations struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9608,7 +11778,7 @@ type WorkloadWithActiveRecommendations struct { func (x *WorkloadWithActiveRecommendations) Reset() { *x = WorkloadWithActiveRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[113] + mi := &file_api_v1_recommendation_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9621,7 +11791,7 @@ func (x *WorkloadWithActiveRecommendations) String() string { func (*WorkloadWithActiveRecommendations) ProtoMessage() {} func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[113] + mi := &file_api_v1_recommendation_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9634,7 +11804,7 @@ func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message // Deprecated: Use WorkloadWithActiveRecommendations.ProtoReflect.Descriptor instead. func (*WorkloadWithActiveRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{121} } func (x *WorkloadWithActiveRecommendations) GetWorkloads() []*WorkloadIdentifier { @@ -9676,7 +11846,7 @@ type GenericResourceRecommendation struct { func (x *GenericResourceRecommendation) Reset() { *x = GenericResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[114] + mi := &file_api_v1_recommendation_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9689,7 +11859,7 @@ func (x *GenericResourceRecommendation) String() string { func (*GenericResourceRecommendation) ProtoMessage() {} func (x *GenericResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[114] + mi := &file_api_v1_recommendation_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9702,7 +11872,7 @@ func (x *GenericResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use GenericResourceRecommendation.ProtoReflect.Descriptor instead. func (*GenericResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{114} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{122} } func (x *GenericResourceRecommendation) GetRecommendationId() string { @@ -9814,7 +11984,7 @@ type BatchGenericResourceRecommendations struct { func (x *BatchGenericResourceRecommendations) Reset() { *x = BatchGenericResourceRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[115] + mi := &file_api_v1_recommendation_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9827,7 +11997,7 @@ func (x *BatchGenericResourceRecommendations) String() string { func (*BatchGenericResourceRecommendations) ProtoMessage() {} func (x *BatchGenericResourceRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[115] + mi := &file_api_v1_recommendation_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9840,7 +12010,7 @@ func (x *BatchGenericResourceRecommendations) ProtoReflect() protoreflect.Messag // Deprecated: Use BatchGenericResourceRecommendations.ProtoReflect.Descriptor instead. func (*BatchGenericResourceRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{115} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{123} } func (x *BatchGenericResourceRecommendations) GetRecommendations() []*GenericResourceRecommendation { @@ -9861,7 +12031,7 @@ type BatchPvcStorageRecommendations struct { func (x *BatchPvcStorageRecommendations) Reset() { *x = BatchPvcStorageRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[116] + mi := &file_api_v1_recommendation_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9874,7 +12044,7 @@ func (x *BatchPvcStorageRecommendations) String() string { func (*BatchPvcStorageRecommendations) ProtoMessage() {} func (x *BatchPvcStorageRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[116] + mi := &file_api_v1_recommendation_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9887,7 +12057,7 @@ func (x *BatchPvcStorageRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchPvcStorageRecommendations.ProtoReflect.Descriptor instead. func (*BatchPvcStorageRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{116} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{124} } func (x *BatchPvcStorageRecommendations) GetRecommendations() []*PvcStorageRecommendation { @@ -9910,7 +12080,7 @@ type GeneratePodDisruptionBudgetRequest struct { func (x *GeneratePodDisruptionBudgetRequest) Reset() { *x = GeneratePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[117] + mi := &file_api_v1_recommendation_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9923,7 +12093,7 @@ func (x *GeneratePodDisruptionBudgetRequest) String() string { func (*GeneratePodDisruptionBudgetRequest) ProtoMessage() {} func (x *GeneratePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[117] + mi := &file_api_v1_recommendation_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9936,7 +12106,7 @@ func (x *GeneratePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GeneratePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*GeneratePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{117} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{125} } func (x *GeneratePodDisruptionBudgetRequest) GetClusterId() string { @@ -9971,7 +12141,7 @@ type GeneratePodDisruptionBudgetResponse struct { func (x *GeneratePodDisruptionBudgetResponse) Reset() { *x = GeneratePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[118] + mi := &file_api_v1_recommendation_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9984,7 +12154,7 @@ func (x *GeneratePodDisruptionBudgetResponse) String() string { func (*GeneratePodDisruptionBudgetResponse) ProtoMessage() {} func (x *GeneratePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[118] + mi := &file_api_v1_recommendation_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9997,7 +12167,7 @@ func (x *GeneratePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use GeneratePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*GeneratePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{118} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{126} } func (x *GeneratePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10020,7 +12190,7 @@ type GenerateAndCreatePodDisruptionBudgetRequest struct { func (x *GenerateAndCreatePodDisruptionBudgetRequest) Reset() { *x = GenerateAndCreatePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[119] + mi := &file_api_v1_recommendation_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10033,7 +12203,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetRequest) String() string { func (*GenerateAndCreatePodDisruptionBudgetRequest) ProtoMessage() {} func (x *GenerateAndCreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[119] + mi := &file_api_v1_recommendation_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10046,7 +12216,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetRequest) ProtoReflect() protoreflec // Deprecated: Use GenerateAndCreatePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*GenerateAndCreatePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{119} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{127} } func (x *GenerateAndCreatePodDisruptionBudgetRequest) GetClusterId() string { @@ -10081,7 +12251,7 @@ type GenerateAndCreatePodDisruptionBudgetResponse struct { func (x *GenerateAndCreatePodDisruptionBudgetResponse) Reset() { *x = GenerateAndCreatePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[120] + mi := &file_api_v1_recommendation_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10094,7 +12264,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetResponse) String() string { func (*GenerateAndCreatePodDisruptionBudgetResponse) ProtoMessage() {} func (x *GenerateAndCreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[120] + mi := &file_api_v1_recommendation_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10107,7 +12277,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetResponse) ProtoReflect() protorefle // Deprecated: Use GenerateAndCreatePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*GenerateAndCreatePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{120} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{128} } func (x *GenerateAndCreatePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10129,7 +12299,7 @@ type CreatePodDisruptionBudgetRequest struct { func (x *CreatePodDisruptionBudgetRequest) Reset() { *x = CreatePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[121] + mi := &file_api_v1_recommendation_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10142,7 +12312,7 @@ func (x *CreatePodDisruptionBudgetRequest) String() string { func (*CreatePodDisruptionBudgetRequest) ProtoMessage() {} func (x *CreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[121] + mi := &file_api_v1_recommendation_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10155,7 +12325,7 @@ func (x *CreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreatePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*CreatePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{121} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{129} } func (x *CreatePodDisruptionBudgetRequest) GetTeamId() string { @@ -10183,7 +12353,7 @@ type CreatePodDisruptionBudgetResponse struct { func (x *CreatePodDisruptionBudgetResponse) Reset() { *x = CreatePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[122] + mi := &file_api_v1_recommendation_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10196,7 +12366,7 @@ func (x *CreatePodDisruptionBudgetResponse) String() string { func (*CreatePodDisruptionBudgetResponse) ProtoMessage() {} func (x *CreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[122] + mi := &file_api_v1_recommendation_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10209,7 +12379,7 @@ func (x *CreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message // Deprecated: Use CreatePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*CreatePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{122} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{130} } func (x *CreatePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10231,7 +12401,7 @@ type GetPDBRecommendationForWorkloadRequest struct { func (x *GetPDBRecommendationForWorkloadRequest) Reset() { *x = GetPDBRecommendationForWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[123] + mi := &file_api_v1_recommendation_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10244,7 +12414,7 @@ func (x *GetPDBRecommendationForWorkloadRequest) String() string { func (*GetPDBRecommendationForWorkloadRequest) ProtoMessage() {} func (x *GetPDBRecommendationForWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[123] + mi := &file_api_v1_recommendation_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10257,7 +12427,7 @@ func (x *GetPDBRecommendationForWorkloadRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetPDBRecommendationForWorkloadRequest.ProtoReflect.Descriptor instead. func (*GetPDBRecommendationForWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{123} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{131} } func (x *GetPDBRecommendationForWorkloadRequest) GetClusterId() string { @@ -10286,7 +12456,7 @@ type GetPDBRecommendationForWorkloadResponse struct { func (x *GetPDBRecommendationForWorkloadResponse) Reset() { *x = GetPDBRecommendationForWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[124] + mi := &file_api_v1_recommendation_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10299,7 +12469,7 @@ func (x *GetPDBRecommendationForWorkloadResponse) String() string { func (*GetPDBRecommendationForWorkloadResponse) ProtoMessage() {} func (x *GetPDBRecommendationForWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[124] + mi := &file_api_v1_recommendation_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10312,7 +12482,7 @@ func (x *GetPDBRecommendationForWorkloadResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetPDBRecommendationForWorkloadResponse.ProtoReflect.Descriptor instead. func (*GetPDBRecommendationForWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{124} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{132} } func (x *GetPDBRecommendationForWorkloadResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10322,6 +12492,285 @@ func (x *GetPDBRecommendationForWorkloadResponse) GetRecommendation() *GenericRe return nil } +// StructuralHealthFinding is a single structural-health finding for a workload, +// composed from either disruption-fragility or a net-new structural check (e.g. +// topology-concentration). See dakr/services/structuralhealth. +type StructuralHealthFinding struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // "DISRUPTION_FRAGILITY" | "TOPOLOGY_CONCENTRATION" + CheckType string `protobuf:"bytes,1,opt,name=check_type,json=checkType,proto3" json:"check_type,omitempty"` + // "HIGH" | "MEDIUM" + Severity string `protobuf:"bytes,2,opt,name=severity,proto3" json:"severity,omitempty"` + // e.g. "NO_PDB_MULTI_REPLICA" (fragility) or "ALL_REPLICAS_ONE_NODE" (topology) + ReasonCode string `protobuf:"bytes,3,opt,name=reason_code,json=reasonCode,proto3" json:"reason_code,omitempty"` + FirstSeenAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=first_seen_at,json=firstSeenAt,proto3" json:"first_seen_at,omitempty"` + // Check-specific structured payload (e.g. replica_count/pdb_name for + // fragility findings, node_count for topology findings), JSON-encoded since + // its shape varies per check type rather than being modeled as a oneof. + DetailJson string `protobuf:"bytes,5,opt,name=detail_json,json=detailJson,proto3" json:"detail_json,omitempty"` +} + +func (x *StructuralHealthFinding) Reset() { + *x = StructuralHealthFinding{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StructuralHealthFinding) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StructuralHealthFinding) ProtoMessage() {} + +func (x *StructuralHealthFinding) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[133] + 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 StructuralHealthFinding.ProtoReflect.Descriptor instead. +func (*StructuralHealthFinding) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{133} +} + +func (x *StructuralHealthFinding) GetCheckType() string { + if x != nil { + return x.CheckType + } + return "" +} + +func (x *StructuralHealthFinding) GetSeverity() string { + if x != nil { + return x.Severity + } + return "" +} + +func (x *StructuralHealthFinding) GetReasonCode() string { + if x != nil { + return x.ReasonCode + } + return "" +} + +func (x *StructuralHealthFinding) GetFirstSeenAt() *timestamppb.Timestamp { + if x != nil { + return x.FirstSeenAt + } + return nil +} + +func (x *StructuralHealthFinding) GetDetailJson() string { + if x != nil { + return x.DetailJson + } + return "" +} + +// WorkloadStructuralHealth is one workload's fully composed set of open +// structural-health findings across every check type. +type WorkloadStructuralHealth struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // "Deployment" | "StatefulSet" + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` + Findings []*StructuralHealthFinding `protobuf:"bytes,6,rep,name=findings,proto3" json:"findings,omitempty"` +} + +func (x *WorkloadStructuralHealth) Reset() { + *x = WorkloadStructuralHealth{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadStructuralHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadStructuralHealth) ProtoMessage() {} + +func (x *WorkloadStructuralHealth) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[134] + 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 WorkloadStructuralHealth.ProtoReflect.Descriptor instead. +func (*WorkloadStructuralHealth) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{134} +} + +func (x *WorkloadStructuralHealth) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkloadStructuralHealth) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WorkloadStructuralHealth) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *WorkloadStructuralHealth) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkloadStructuralHealth) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *WorkloadStructuralHealth) GetFindings() []*StructuralHealthFinding { + if x != nil { + return x.Findings + } + return nil +} + +type ListWorkloadStructuralHealthRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` +} + +func (x *ListWorkloadStructuralHealthRequest) Reset() { + *x = ListWorkloadStructuralHealthRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadStructuralHealthRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadStructuralHealthRequest) ProtoMessage() {} + +func (x *ListWorkloadStructuralHealthRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[135] + 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 ListWorkloadStructuralHealthRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadStructuralHealthRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{135} +} + +func (x *ListWorkloadStructuralHealthRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListWorkloadStructuralHealthRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +type ListWorkloadStructuralHealthResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Workloads []*WorkloadStructuralHealth `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` +} + +func (x *ListWorkloadStructuralHealthResponse) Reset() { + *x = ListWorkloadStructuralHealthResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadStructuralHealthResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadStructuralHealthResponse) ProtoMessage() {} + +func (x *ListWorkloadStructuralHealthResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[136] + 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 ListWorkloadStructuralHealthResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadStructuralHealthResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{136} +} + +func (x *ListWorkloadStructuralHealthResponse) GetWorkloads() []*WorkloadStructuralHealth { + if x != nil { + return x.Workloads + } + return nil +} + type ReconcileWorkload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -10336,7 +12785,7 @@ type ReconcileWorkload struct { func (x *ReconcileWorkload) Reset() { *x = ReconcileWorkload{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[125] + mi := &file_api_v1_recommendation_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10349,7 +12798,7 @@ func (x *ReconcileWorkload) String() string { func (*ReconcileWorkload) ProtoMessage() {} func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[125] + mi := &file_api_v1_recommendation_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10362,7 +12811,7 @@ func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { // Deprecated: Use ReconcileWorkload.ProtoReflect.Descriptor instead. func (*ReconcileWorkload) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{125} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{137} } func (x *ReconcileWorkload) GetKind() K8SObjectKind { @@ -10407,7 +12856,7 @@ type ReconcileResponse struct { func (x *ReconcileResponse) Reset() { *x = ReconcileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[126] + mi := &file_api_v1_recommendation_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10420,7 +12869,7 @@ func (x *ReconcileResponse) String() string { func (*ReconcileResponse) ProtoMessage() {} func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[126] + mi := &file_api_v1_recommendation_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10433,7 +12882,7 @@ func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReconcileResponse.ProtoReflect.Descriptor instead. func (*ReconcileResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{126} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{138} } func (x *ReconcileResponse) GetRequestId() string { @@ -10487,7 +12936,7 @@ type OperatorHealth struct { func (x *OperatorHealth) Reset() { *x = OperatorHealth{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[127] + mi := &file_api_v1_recommendation_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10500,7 +12949,7 @@ func (x *OperatorHealth) String() string { func (*OperatorHealth) ProtoMessage() {} func (x *OperatorHealth) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[127] + mi := &file_api_v1_recommendation_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10513,7 +12962,7 @@ func (x *OperatorHealth) ProtoReflect() protoreflect.Message { // Deprecated: Use OperatorHealth.ProtoReflect.Descriptor instead. func (*OperatorHealth) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{127} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{139} } func (x *OperatorHealth) GetHealthy() bool { @@ -10618,7 +13067,7 @@ type AgentHealth struct { func (x *AgentHealth) Reset() { *x = AgentHealth{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[128] + mi := &file_api_v1_recommendation_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10631,7 +13080,7 @@ func (x *AgentHealth) String() string { func (*AgentHealth) ProtoMessage() {} func (x *AgentHealth) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[128] + mi := &file_api_v1_recommendation_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10644,7 +13093,7 @@ func (x *AgentHealth) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentHealth.ProtoReflect.Descriptor instead. func (*AgentHealth) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{128} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{140} } func (x *AgentHealth) GetNodeNameToAgent() map[string]*AgentHealthMeta { @@ -10669,7 +13118,7 @@ type AgentHealthMeta struct { func (x *AgentHealthMeta) Reset() { *x = AgentHealthMeta{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[129] + mi := &file_api_v1_recommendation_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10682,7 +13131,7 @@ func (x *AgentHealthMeta) String() string { func (*AgentHealthMeta) ProtoMessage() {} func (x *AgentHealthMeta) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[129] + mi := &file_api_v1_recommendation_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10695,7 +13144,7 @@ func (x *AgentHealthMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentHealthMeta.ProtoReflect.Descriptor instead. func (*AgentHealthMeta) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{129} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{141} } func (x *AgentHealthMeta) GetHealthy() bool { @@ -10743,7 +13192,7 @@ type HealthReport struct { func (x *HealthReport) Reset() { *x = HealthReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[130] + mi := &file_api_v1_recommendation_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10756,7 +13205,7 @@ func (x *HealthReport) String() string { func (*HealthReport) ProtoMessage() {} func (x *HealthReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[130] + mi := &file_api_v1_recommendation_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10769,7 +13218,7 @@ func (x *HealthReport) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthReport.ProtoReflect.Descriptor instead. func (*HealthReport) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{130} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{142} } type NodeStats struct { @@ -10790,7 +13239,7 @@ type NodeStats struct { func (x *NodeStats) Reset() { *x = NodeStats{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[131] + mi := &file_api_v1_recommendation_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10803,7 +13252,7 @@ func (x *NodeStats) String() string { func (*NodeStats) ProtoMessage() {} func (x *NodeStats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[131] + mi := &file_api_v1_recommendation_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10816,7 +13265,7 @@ func (x *NodeStats) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeStats.ProtoReflect.Descriptor instead. func (*NodeStats) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{131} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{143} } func (x *NodeStats) GetNodeGroupName() string { @@ -10898,7 +13347,7 @@ type NodeMetric struct { func (x *NodeMetric) Reset() { *x = NodeMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[132] + mi := &file_api_v1_recommendation_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10911,7 +13360,7 @@ func (x *NodeMetric) String() string { func (*NodeMetric) ProtoMessage() {} func (x *NodeMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[132] + mi := &file_api_v1_recommendation_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10924,7 +13373,7 @@ func (x *NodeMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeMetric.ProtoReflect.Descriptor instead. func (*NodeMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{132} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{144} } func (x *NodeMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11035,7 +13484,7 @@ type ContainerStats struct { func (x *ContainerStats) Reset() { *x = ContainerStats{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[133] + mi := &file_api_v1_recommendation_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11048,7 +13497,7 @@ func (x *ContainerStats) String() string { func (*ContainerStats) ProtoMessage() {} func (x *ContainerStats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[133] + mi := &file_api_v1_recommendation_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11061,7 +13510,7 @@ func (x *ContainerStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerStats.ProtoReflect.Descriptor instead. func (*ContainerStats) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{133} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{145} } func (x *ContainerStats) GetWorkloadUid() string { @@ -11136,7 +13585,7 @@ type ContainerMetric struct { func (x *ContainerMetric) Reset() { *x = ContainerMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[134] + mi := &file_api_v1_recommendation_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11149,7 +13598,7 @@ func (x *ContainerMetric) String() string { func (*ContainerMetric) ProtoMessage() {} func (x *ContainerMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[134] + mi := &file_api_v1_recommendation_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11162,7 +13611,7 @@ func (x *ContainerMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerMetric.ProtoReflect.Descriptor instead. func (*ContainerMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{134} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{146} } func (x *ContainerMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11271,7 +13720,7 @@ type ContainerSummarizedMetric struct { func (x *ContainerSummarizedMetric) Reset() { *x = ContainerSummarizedMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[135] + mi := &file_api_v1_recommendation_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11284,7 +13733,7 @@ func (x *ContainerSummarizedMetric) String() string { func (*ContainerSummarizedMetric) ProtoMessage() {} func (x *ContainerSummarizedMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[135] + mi := &file_api_v1_recommendation_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11297,7 +13746,7 @@ func (x *ContainerSummarizedMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerSummarizedMetric.ProtoReflect.Descriptor instead. func (*ContainerSummarizedMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{135} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{147} } func (x *ContainerSummarizedMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11357,7 +13806,7 @@ type Metric struct { func (x *Metric) Reset() { *x = Metric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[136] + mi := &file_api_v1_recommendation_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11370,7 +13819,7 @@ func (x *Metric) String() string { func (*Metric) ProtoMessage() {} func (x *Metric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[136] + mi := &file_api_v1_recommendation_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11383,7 +13832,7 @@ func (x *Metric) ProtoReflect() protoreflect.Message { // Deprecated: Use Metric.ProtoReflect.Descriptor instead. func (*Metric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{136} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{148} } func (x *Metric) GetMin() float32 { @@ -11481,12 +13930,23 @@ type ContainerRecommendation struct { CurrentLimit *ResourceRecommendation `protobuf:"bytes,4,opt,name=current_limit,json=currentLimit,proto3" json:"current_limit,omitempty"` RecommendedLimit *ResourceRecommendation `protobuf:"bytes,5,opt,name=recommended_limit,json=recommendedLimit,proto3" json:"recommended_limit,omitempty"` OptimizationScore float64 `protobuf:"fixed64,6,opt,name=optimization_score,json=optimizationScore,proto3" json:"optimization_score,omitempty"` + // Per-element env var mutations for this container (merge key: name). + // The operator merges these into the live container.Env; entries not + // referenced here are left untouched. + EnvMutations []*EnvVarMutation `protobuf:"bytes,11,rep,name=env_mutations,json=envMutations,proto3" json:"env_mutations,omitempty"` + // Per-flag command/arg mutations for this container. Used to carry + // command-line directives (e.g. JVM -Xmx) already lowered by the control + // plane into a concrete flag edit. + CommandArgMutations []*CommandArgMutation `protobuf:"bytes,12,rep,name=command_arg_mutations,json=commandArgMutations,proto3" json:"command_arg_mutations,omitempty"` + // Whether this container was observed OOM-killed, driving the memory + // recommendation. + OomTriggered bool `protobuf:"varint,13,opt,name=oom_triggered,json=oomTriggered,proto3" json:"oom_triggered,omitempty"` } func (x *ContainerRecommendation) Reset() { *x = ContainerRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[137] + mi := &file_api_v1_recommendation_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11499,7 +13959,7 @@ func (x *ContainerRecommendation) String() string { func (*ContainerRecommendation) ProtoMessage() {} func (x *ContainerRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[137] + mi := &file_api_v1_recommendation_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11512,7 +13972,7 @@ func (x *ContainerRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerRecommendation.ProtoReflect.Descriptor instead. func (*ContainerRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{137} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{149} } func (x *ContainerRecommendation) GetContainerName() string { @@ -11557,6 +14017,27 @@ func (x *ContainerRecommendation) GetOptimizationScore() float64 { return 0 } +func (x *ContainerRecommendation) GetEnvMutations() []*EnvVarMutation { + if x != nil { + return x.EnvMutations + } + return nil +} + +func (x *ContainerRecommendation) GetCommandArgMutations() []*CommandArgMutation { + if x != nil { + return x.CommandArgMutations + } + return nil +} + +func (x *ContainerRecommendation) GetOomTriggered() bool { + if x != nil { + return x.OomTriggered + } + return false +} + type KedaScaledObjectRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11572,7 +14053,7 @@ type KedaScaledObjectRecommendation struct { func (x *KedaScaledObjectRecommendation) Reset() { *x = KedaScaledObjectRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[138] + mi := &file_api_v1_recommendation_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11585,7 +14066,7 @@ func (x *KedaScaledObjectRecommendation) String() string { func (*KedaScaledObjectRecommendation) ProtoMessage() {} func (x *KedaScaledObjectRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[138] + mi := &file_api_v1_recommendation_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11598,7 +14079,7 @@ func (x *KedaScaledObjectRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use KedaScaledObjectRecommendation.ProtoReflect.Descriptor instead. func (*KedaScaledObjectRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{138} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{150} } func (x *KedaScaledObjectRecommendation) GetUid() string { @@ -11654,7 +14135,7 @@ type ResourceRecommendation struct { func (x *ResourceRecommendation) Reset() { *x = ResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[139] + mi := &file_api_v1_recommendation_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11667,7 +14148,7 @@ func (x *ResourceRecommendation) String() string { func (*ResourceRecommendation) ProtoMessage() {} func (x *ResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[139] + mi := &file_api_v1_recommendation_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11680,7 +14161,7 @@ func (x *ResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceRecommendation.ProtoReflect.Descriptor instead. func (*ResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{139} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{151} } func (x *ResourceRecommendation) GetCpu() int64 { @@ -11739,6 +14220,266 @@ func (x *ResourceRecommendation) GetGpuVramAction() ActionToTake { return ActionToTake_ACTION_TO_TAKE_SET } +// EnvVarMutation is a per-element edit to a container's env list. Merge key is +// `name`. value_from (secret/configMap refs) is intentionally deferred. +type EnvVarMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // merge key + Value *string `protobuf:"bytes,3,opt,name=value,proto3,oneof" json:"value,omitempty"` // literal value for UPSERT +} + +func (x *EnvVarMutation) Reset() { + *x = EnvVarMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[152] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvVarMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvVarMutation) ProtoMessage() {} + +func (x *EnvVarMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[152] + 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 EnvVarMutation.ProtoReflect.Descriptor instead. +func (*EnvVarMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{152} +} + +func (x *EnvVarMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *EnvVarMutation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EnvVarMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// CommandArgMutation is a per-flag edit to a container's command or args list. +// The control plane lowers higher-level intent (e.g. JVM heap sizing) into this +// concrete flag edit so the operator stays generic. +type CommandArgMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Target ArgTarget `protobuf:"varint,2,opt,name=target,proto3,enum=api.v1.ArgTarget" json:"target,omitempty"` // command vs args + Flag string `protobuf:"bytes,3,opt,name=flag,proto3" json:"flag,omitempty"` // e.g. "-Xmx" + Value *string `protobuf:"bytes,4,opt,name=value,proto3,oneof" json:"value,omitempty"` // e.g. "512m"; empty for valueless flags +} + +func (x *CommandArgMutation) Reset() { + *x = CommandArgMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[153] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommandArgMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommandArgMutation) ProtoMessage() {} + +func (x *CommandArgMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[153] + 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 CommandArgMutation.ProtoReflect.Descriptor instead. +func (*CommandArgMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{153} +} + +func (x *CommandArgMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *CommandArgMutation) GetTarget() ArgTarget { + if x != nil { + return x.Target + } + return ArgTarget_ARG_TARGET_UNSPECIFIED +} + +func (x *CommandArgMutation) GetFlag() string { + if x != nil { + return x.Flag + } + return "" +} + +func (x *CommandArgMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// NodeSelectorMutation is a per-key edit to the pod's nodeSelector map. +type NodeSelectorMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // merge key + Value *string `protobuf:"bytes,3,opt,name=value,proto3,oneof" json:"value,omitempty"` // value for UPSERT +} + +func (x *NodeSelectorMutation) Reset() { + *x = NodeSelectorMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[154] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeSelectorMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeSelectorMutation) ProtoMessage() {} + +func (x *NodeSelectorMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[154] + 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 NodeSelectorMutation.ProtoReflect.Descriptor instead. +func (*NodeSelectorMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{154} +} + +func (x *NodeSelectorMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *NodeSelectorMutation) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *NodeSelectorMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// TolerationMutation is a per-element edit to the pod's tolerations list. +// Element identity is the full tuple. +type TolerationMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Toleration *Toleration `protobuf:"bytes,2,opt,name=toleration,proto3" json:"toleration,omitempty"` +} + +func (x *TolerationMutation) Reset() { + *x = TolerationMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[155] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TolerationMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TolerationMutation) ProtoMessage() {} + +func (x *TolerationMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[155] + 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 TolerationMutation.ProtoReflect.Descriptor instead. +func (*TolerationMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{155} +} + +func (x *TolerationMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *TolerationMutation) GetToleration() *Toleration { + if x != nil { + return x.Toleration + } + return nil +} + // The pod this Toleration is attached to tolerates any taint that matches // the triple using the matching operator . type Toleration struct { @@ -11775,7 +14516,7 @@ type Toleration struct { func (x *Toleration) Reset() { *x = Toleration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[140] + mi := &file_api_v1_recommendation_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11788,7 +14529,7 @@ func (x *Toleration) String() string { func (*Toleration) ProtoMessage() {} func (x *Toleration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[140] + mi := &file_api_v1_recommendation_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11801,7 +14542,7 @@ func (x *Toleration) ProtoReflect() protoreflect.Message { // Deprecated: Use Toleration.ProtoReflect.Descriptor instead. func (*Toleration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{140} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{156} } func (x *Toleration) GetKey() string { @@ -11870,7 +14611,7 @@ type ClusterRecommendationPolicy struct { func (x *ClusterRecommendationPolicy) Reset() { *x = ClusterRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[141] + mi := &file_api_v1_recommendation_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11883,7 +14624,7 @@ func (x *ClusterRecommendationPolicy) String() string { func (*ClusterRecommendationPolicy) ProtoMessage() {} func (x *ClusterRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[141] + mi := &file_api_v1_recommendation_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11896,7 +14637,7 @@ func (x *ClusterRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use ClusterRecommendationPolicy.ProtoReflect.Descriptor instead. func (*ClusterRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{141} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{157} } func (x *ClusterRecommendationPolicy) GetPolicyId() string { @@ -12012,7 +14753,7 @@ type NodeGroupRecommendationPolicy struct { func (x *NodeGroupRecommendationPolicy) Reset() { *x = NodeGroupRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[142] + mi := &file_api_v1_recommendation_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12025,7 +14766,7 @@ func (x *NodeGroupRecommendationPolicy) String() string { func (*NodeGroupRecommendationPolicy) ProtoMessage() {} func (x *NodeGroupRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[142] + mi := &file_api_v1_recommendation_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12038,7 +14779,7 @@ func (x *NodeGroupRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupRecommendationPolicy.ProtoReflect.Descriptor instead. func (*NodeGroupRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{142} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{158} } func (x *NodeGroupRecommendationPolicy) GetPolicyId() string { @@ -12193,12 +14934,19 @@ type VerticalScalingOptimizationTarget struct { // Whether to actively remove limits from workloads (CPU only for now). // Takes precedence over limits_adjustment_enabled when true. LimitsRemovalEnabled bool `protobuf:"varint,42,opt,name=limits_removal_enabled,json=limitsRemovalEnabled,proto3" json:"limits_removal_enabled,omitempty"` + // Memory-only: when true, size the memory REQUEST recommendation from RSS + // (resident set size) instead of the default working set. Ignored for CPU/GPU. + RequestUseRss *bool `protobuf:"varint,43,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: when true, the limit is derived from an RSS-based recommendation + // instead of the default working-set recommendation (the Limit multiplier still + // applies to whichever basis is selected). Ignored for CPU/GPU. + LimitUseRss *bool `protobuf:"varint,44,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` } func (x *VerticalScalingOptimizationTarget) Reset() { *x = VerticalScalingOptimizationTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[143] + mi := &file_api_v1_recommendation_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12211,7 +14959,7 @@ func (x *VerticalScalingOptimizationTarget) String() string { func (*VerticalScalingOptimizationTarget) ProtoMessage() {} func (x *VerticalScalingOptimizationTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[143] + mi := &file_api_v1_recommendation_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12224,7 +14972,7 @@ func (x *VerticalScalingOptimizationTarget) ProtoReflect() protoreflect.Message // Deprecated: Use VerticalScalingOptimizationTarget.ProtoReflect.Descriptor instead. func (*VerticalScalingOptimizationTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{143} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{159} } func (x *VerticalScalingOptimizationTarget) GetEnabled() bool { @@ -12311,6 +15059,20 @@ func (x *VerticalScalingOptimizationTarget) GetLimitsRemovalEnabled() bool { return false } +func (x *VerticalScalingOptimizationTarget) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *VerticalScalingOptimizationTarget) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + type HorizontalScalingOptimizationTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -12352,7 +15114,7 @@ type HorizontalScalingOptimizationTarget struct { func (x *HorizontalScalingOptimizationTarget) Reset() { *x = HorizontalScalingOptimizationTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[144] + mi := &file_api_v1_recommendation_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12365,7 +15127,7 @@ func (x *HorizontalScalingOptimizationTarget) String() string { func (*HorizontalScalingOptimizationTarget) ProtoMessage() {} func (x *HorizontalScalingOptimizationTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[144] + mi := &file_api_v1_recommendation_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12378,7 +15140,7 @@ func (x *HorizontalScalingOptimizationTarget) ProtoReflect() protoreflect.Messag // Deprecated: Use HorizontalScalingOptimizationTarget.ProtoReflect.Descriptor instead. func (*HorizontalScalingOptimizationTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{144} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{160} } func (x *HorizontalScalingOptimizationTarget) GetEnabled() bool { @@ -12515,15 +15277,17 @@ type WorkloadRecommendationPolicy struct { // Global cooldown configuration // Minutes to wait between applying recommendations (prevents thrashing) CooldownMinutes *int32 `protobuf:"varint,96,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - // Deprecated: no longer used. The legacy policy flow no longer creates workload rules. - // Workload rules are created via auto-optimization or the new WorkloadOptimizationPolicy flow. - // Field retained for wire-compatibility; will be reserved in a future cleanup. - EnableInclusterMpa bool `protobuf:"varint,97,opt,name=enable_incluster_mpa,json=enableInclusterMpa,proto3" json:"enable_incluster_mpa,omitempty"` // Feature flag: Enable In-Place Pod Vertical Scaling for this policy. // Requires Kubernetes >= v1.33 on all attached clusters. // When enabled, recommendations resize running pods via the /resize subresource // without triggering rolling restarts. EnableInPlaceVerticalScaling bool `protobuf:"varint,103,opt,name=enable_in_place_vertical_scaling,json=enableInPlaceVerticalScaling,proto3" json:"enable_in_place_vertical_scaling,omitempty"` + // Opt-in escape hatch for the riskiest half of in-place scaling: allowing a + // resize to LOWER a container's memory limit on a running pod. Gated behind + // enable_in_place_vertical_scaling and, independently, behind the cluster's + // Kubernetes version — this flag only ever removes DevZero's own refusal, it + // never makes an unsupported cluster accept the decrease. Default false. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,121,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // Policy-driven automation: enable PDB creation for workloads under this policy PdbEnabled bool `protobuf:"varint,98,opt,name=pdb_enabled,json=pdbEnabled,proto3" json:"pdb_enabled,omitempty"` EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,99,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` @@ -12532,12 +15296,54 @@ type WorkloadRecommendationPolicy struct { EnablePmaxProtection bool `protobuf:"varint,100,opt,name=enable_pmax_protection,json=enablePmaxProtection,proto3" json:"enable_pmax_protection,omitempty"` PmaxRatioThreshold *float32 `protobuf:"fixed32,101,opt,name=pmax_ratio_threshold,json=pmaxRatioThreshold,proto3,oneof" json:"pmax_ratio_threshold,omitempty"` // default: 3.0 DeletedAt *timestamppb.Timestamp `protobuf:"bytes,102,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` + // JVM heap optimization. Gated by jvm_heap_optimization_enabled; the optional + // knobs are overrides — unset means "use the current system default". + JvmHeapOptimizationEnabled bool `protobuf:"varint,104,opt,name=jvm_heap_optimization_enabled,json=jvmHeapOptimizationEnabled,proto3" json:"jvm_heap_optimization_enabled,omitempty"` + JvmHeapTargetPercentile *float32 `protobuf:"fixed32,105,opt,name=jvm_heap_target_percentile,json=jvmHeapTargetPercentile,proto3,oneof" json:"jvm_heap_target_percentile,omitempty"` + JvmHeapHeadroomMultiplier *float32 `protobuf:"fixed32,106,opt,name=jvm_heap_headroom_multiplier,json=jvmHeapHeadroomMultiplier,proto3,oneof" json:"jvm_heap_headroom_multiplier,omitempty"` + JvmNonHeapOverheadPercent *float32 `protobuf:"fixed32,107,opt,name=jvm_non_heap_overhead_percent,json=jvmNonHeapOverheadPercent,proto3,oneof" json:"jvm_non_heap_overhead_percent,omitempty"` + JvmNonHeapOverheadBytes *int64 `protobuf:"varint,108,opt,name=jvm_non_heap_overhead_bytes,json=jvmNonHeapOverheadBytes,proto3,oneof" json:"jvm_non_heap_overhead_bytes,omitempty"` + JvmMinHeapBytes *int64 `protobuf:"varint,109,opt,name=jvm_min_heap_bytes,json=jvmMinHeapBytes,proto3,oneof" json:"jvm_min_heap_bytes,omitempty"` + JvmMaxHeapBytes *int64 `protobuf:"varint,110,opt,name=jvm_max_heap_bytes,json=jvmMaxHeapBytes,proto3,oneof" json:"jvm_max_heap_bytes,omitempty"` + JvmPreferContainerSupport bool `protobuf:"varint,111,opt,name=jvm_prefer_container_support,json=jvmPreferContainerSupport,proto3" json:"jvm_prefer_container_support,omitempty"` + // Minimum CPU request (millicores) for detected JVM containers, protecting + // JVM startup (classloading, JIT warmup, agent instrumentation) from CPU + // starvation under node contention. Standalone knob — part of the always-on + // "respect JVM state" path, NOT gated by jvm_heap_optimization_enabled. + // Unset = system default (75m). Explicit 0 = floor disabled (only the + // generic CPU minimum applies). + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,112,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Recommendation floor percentage (per resource, request only): the + // recommended request is never lowered below pct% (1-100) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). Unset = floor disabled. + CpuFloorPercent *int64 `protobuf:"varint,113,opt,name=cpu_floor_percent,json=cpuFloorPercent,proto3,oneof" json:"cpu_floor_percent,omitempty"` + MemoryFloorPercent *int64 `protobuf:"varint,114,opt,name=memory_floor_percent,json=memoryFloorPercent,proto3,oneof" json:"memory_floor_percent,omitempty"` + // Recommendation ceiling percentage (per resource, request only): the + // recommended request is never raised above pct% (1-1000) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). A ceiling below 100 is intentionally + // allowed as a baseline-relative cap distinct from max_request. Unset = + // ceiling disabled. + CpuCeilingPercent *int64 `protobuf:"varint,115,opt,name=cpu_ceiling_percent,json=cpuCeilingPercent,proto3,oneof" json:"cpu_ceiling_percent,omitempty"` + MemoryCeilingPercent *int64 `protobuf:"varint,116,opt,name=memory_ceiling_percent,json=memoryCeilingPercent,proto3,oneof" json:"memory_ceiling_percent,omitempty"` + // Limit floor/ceiling percentage (per resource, limit only): the + // recommended limit is never lowered below the floor pct (1-100) nor + // raised above the ceiling pct (1-1000) of the container's immutable + // initial-limit baseline (workload_resource_baselines). Applied only when + // that resource's limits adjustment is enabled and limits removal is not; + // the recommended request always wins over the limit ceiling (the limit + // is never clamped below the request). Unset = bound disabled. + CpuLimitFloorPercent *int64 `protobuf:"varint,117,opt,name=cpu_limit_floor_percent,json=cpuLimitFloorPercent,proto3,oneof" json:"cpu_limit_floor_percent,omitempty"` + MemoryLimitFloorPercent *int64 `protobuf:"varint,118,opt,name=memory_limit_floor_percent,json=memoryLimitFloorPercent,proto3,oneof" json:"memory_limit_floor_percent,omitempty"` + CpuLimitCeilingPercent *int64 `protobuf:"varint,119,opt,name=cpu_limit_ceiling_percent,json=cpuLimitCeilingPercent,proto3,oneof" json:"cpu_limit_ceiling_percent,omitempty"` + MemoryLimitCeilingPercent *int64 `protobuf:"varint,120,opt,name=memory_limit_ceiling_percent,json=memoryLimitCeilingPercent,proto3,oneof" json:"memory_limit_ceiling_percent,omitempty"` } func (x *WorkloadRecommendationPolicy) Reset() { *x = WorkloadRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[145] + mi := &file_api_v1_recommendation_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12550,7 +15356,7 @@ func (x *WorkloadRecommendationPolicy) String() string { func (*WorkloadRecommendationPolicy) ProtoMessage() {} func (x *WorkloadRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[145] + mi := &file_api_v1_recommendation_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12563,7 +15369,7 @@ func (x *WorkloadRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRecommendationPolicy.ProtoReflect.Descriptor instead. func (*WorkloadRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{145} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{161} } func (x *WorkloadRecommendationPolicy) GetPolicyId() string { @@ -12764,16 +15570,16 @@ func (x *WorkloadRecommendationPolicy) GetCooldownMinutes() int32 { return 0 } -func (x *WorkloadRecommendationPolicy) GetEnableInclusterMpa() bool { +func (x *WorkloadRecommendationPolicy) GetEnableInPlaceVerticalScaling() bool { if x != nil { - return x.EnableInclusterMpa + return x.EnableInPlaceVerticalScaling } return false } -func (x *WorkloadRecommendationPolicy) GetEnableInPlaceVerticalScaling() bool { +func (x *WorkloadRecommendationPolicy) GetAllowInPlaceMemoryLimitDecrease() bool { if x != nil { - return x.EnableInPlaceVerticalScaling + return x.AllowInPlaceMemoryLimitDecrease } return false } @@ -12813,6 +15619,125 @@ func (x *WorkloadRecommendationPolicy) GetDeletedAt() *timestamppb.Timestamp { return nil } +func (x *WorkloadRecommendationPolicy) GetJvmHeapOptimizationEnabled() bool { + if x != nil { + return x.JvmHeapOptimizationEnabled + } + return false +} + +func (x *WorkloadRecommendationPolicy) GetJvmHeapTargetPercentile() float32 { + if x != nil && x.JvmHeapTargetPercentile != nil { + return *x.JvmHeapTargetPercentile + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmHeapHeadroomMultiplier() float32 { + if x != nil && x.JvmHeapHeadroomMultiplier != nil { + return *x.JvmHeapHeadroomMultiplier + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmNonHeapOverheadPercent() float32 { + if x != nil && x.JvmNonHeapOverheadPercent != nil { + return *x.JvmNonHeapOverheadPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmNonHeapOverheadBytes() int64 { + if x != nil && x.JvmNonHeapOverheadBytes != nil { + return *x.JvmNonHeapOverheadBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmMinHeapBytes() int64 { + if x != nil && x.JvmMinHeapBytes != nil { + return *x.JvmMinHeapBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmMaxHeapBytes() int64 { + if x != nil && x.JvmMaxHeapBytes != nil { + return *x.JvmMaxHeapBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmPreferContainerSupport() bool { + if x != nil { + return x.JvmPreferContainerSupport + } + return false +} + +func (x *WorkloadRecommendationPolicy) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuFloorPercent() int64 { + if x != nil && x.CpuFloorPercent != nil { + return *x.CpuFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryFloorPercent() int64 { + if x != nil && x.MemoryFloorPercent != nil { + return *x.MemoryFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuCeilingPercent() int64 { + if x != nil && x.CpuCeilingPercent != nil { + return *x.CpuCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryCeilingPercent() int64 { + if x != nil && x.MemoryCeilingPercent != nil { + return *x.MemoryCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuLimitFloorPercent() int64 { + if x != nil && x.CpuLimitFloorPercent != nil { + return *x.CpuLimitFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryLimitFloorPercent() int64 { + if x != nil && x.MemoryLimitFloorPercent != nil { + return *x.MemoryLimitFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuLimitCeilingPercent() int64 { + if x != nil && x.CpuLimitCeilingPercent != nil { + return *x.CpuLimitCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryLimitCeilingPercent() int64 { + if x != nil && x.MemoryLimitCeilingPercent != nil { + return *x.MemoryLimitCeilingPercent + } + return 0 +} + type GetPolicyRecommendedDefaultsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -12825,7 +15750,7 @@ type GetPolicyRecommendedDefaultsRequest struct { func (x *GetPolicyRecommendedDefaultsRequest) Reset() { *x = GetPolicyRecommendedDefaultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[146] + mi := &file_api_v1_recommendation_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12838,7 +15763,7 @@ func (x *GetPolicyRecommendedDefaultsRequest) String() string { func (*GetPolicyRecommendedDefaultsRequest) ProtoMessage() {} func (x *GetPolicyRecommendedDefaultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[146] + mi := &file_api_v1_recommendation_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12851,7 +15776,7 @@ func (x *GetPolicyRecommendedDefaultsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GetPolicyRecommendedDefaultsRequest.ProtoReflect.Descriptor instead. func (*GetPolicyRecommendedDefaultsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{146} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{162} } func (x *GetPolicyRecommendedDefaultsRequest) GetTeamId() string { @@ -12879,7 +15804,7 @@ type GetPolicyRecommendedDefaultsResponse struct { func (x *GetPolicyRecommendedDefaultsResponse) Reset() { *x = GetPolicyRecommendedDefaultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[147] + mi := &file_api_v1_recommendation_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12892,7 +15817,7 @@ func (x *GetPolicyRecommendedDefaultsResponse) String() string { func (*GetPolicyRecommendedDefaultsResponse) ProtoMessage() {} func (x *GetPolicyRecommendedDefaultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[147] + mi := &file_api_v1_recommendation_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12905,7 +15830,7 @@ func (x *GetPolicyRecommendedDefaultsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GetPolicyRecommendedDefaultsResponse.ProtoReflect.Descriptor instead. func (*GetPolicyRecommendedDefaultsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{147} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{163} } func (x *GetPolicyRecommendedDefaultsResponse) GetPolicy() *WorkloadRecommendationPolicy { @@ -12929,7 +15854,7 @@ type BalanceRegisterRequest struct { func (x *BalanceRegisterRequest) Reset() { *x = BalanceRegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[148] + mi := &file_api_v1_recommendation_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12942,7 +15867,7 @@ func (x *BalanceRegisterRequest) String() string { func (*BalanceRegisterRequest) ProtoMessage() {} func (x *BalanceRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[148] + mi := &file_api_v1_recommendation_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12955,7 +15880,7 @@ func (x *BalanceRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceRegisterRequest.ProtoReflect.Descriptor instead. func (*BalanceRegisterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{148} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{164} } func (x *BalanceRegisterRequest) GetTeamId() string { @@ -13003,7 +15928,7 @@ type BalanceFeatures struct { func (x *BalanceFeatures) Reset() { *x = BalanceFeatures{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[149] + mi := &file_api_v1_recommendation_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13016,7 +15941,7 @@ func (x *BalanceFeatures) String() string { func (*BalanceFeatures) ProtoMessage() {} func (x *BalanceFeatures) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[149] + mi := &file_api_v1_recommendation_proto_msgTypes[165] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13029,7 +15954,7 @@ func (x *BalanceFeatures) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceFeatures.ProtoReflect.Descriptor instead. func (*BalanceFeatures) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{149} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{165} } func (x *BalanceFeatures) GetLiveMigration() bool { @@ -13071,12 +15996,28 @@ type BalanceApplyRecommendationResponse struct { Error *string `protobuf:"bytes,4,opt,name=error,proto3,oneof" json:"error,omitempty"` // Optional live migration metadata, populated when recommendation used live migration. LiveMigrationResult *LiveMigrationResult `protobuf:"bytes,5,opt,name=live_migration_result,json=liveMigrationResult,proto3,oneof" json:"live_migration_result,omitempty"` + // image_changed signals the operator retired this recommendation because the + // target workload's container image changed since it was applied (a new + // release), so its image-tied tuned values (env/cmd/nodeSelector/toleration) + // were not pinned onto the new image. The control plane records this as + // Superseded — not a failure — so the optimizer re-derives a fresh + // recommendation for the new image. Only set for spec-mutating workload recs. + ImageChanged bool `protobuf:"varint,6,opt,name=image_changed,json=imageChanged,proto3" json:"image_changed,omitempty"` + // applied_at is the terminal-phase timestamp the operator stamped on the + // WorkloadRecommendation CRD (Status.AppliedAt). For MPA v2 (rule-based) + // recommendations, the control plane's DB row primary key is derived from + // recommendation_id + applied_at (see k8sconverters.DeriveWorkloadRecommendationID), + // so this is required to target the correct row for this apply cycle instead + // of the workload's static, un-derived recommendation_id. Unset for legacy + // (non-rule) recommendations and older operators — callers must fall back + // to recommendation_id in that case. + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` } func (x *BalanceApplyRecommendationResponse) Reset() { *x = BalanceApplyRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[150] + mi := &file_api_v1_recommendation_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13089,7 +16030,7 @@ func (x *BalanceApplyRecommendationResponse) String() string { func (*BalanceApplyRecommendationResponse) ProtoMessage() {} func (x *BalanceApplyRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[150] + mi := &file_api_v1_recommendation_proto_msgTypes[166] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13102,7 +16043,7 @@ func (x *BalanceApplyRecommendationResponse) ProtoReflect() protoreflect.Message // Deprecated: Use BalanceApplyRecommendationResponse.ProtoReflect.Descriptor instead. func (*BalanceApplyRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{150} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{166} } func (x *BalanceApplyRecommendationResponse) GetRecommendationId() string { @@ -13140,6 +16081,20 @@ func (x *BalanceApplyRecommendationResponse) GetLiveMigrationResult() *LiveMigra return nil } +func (x *BalanceApplyRecommendationResponse) GetImageChanged() bool { + if x != nil { + return x.ImageChanged + } + return false +} + +func (x *BalanceApplyRecommendationResponse) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + // LiveMigrationResult provides structured metadata about a live migration attempt. type LiveMigrationResult struct { state protoimpl.MessageState @@ -13161,12 +16116,19 @@ type LiveMigrationResult struct { TargetNode string `protobuf:"bytes,6,opt,name=target_node,json=targetNode,proto3" json:"target_node,omitempty"` // Checkpoint image size in bytes. CheckpointSizeBytes int64 `protobuf:"varint,7,opt,name=checkpoint_size_bytes,json=checkpointSizeBytes,proto3" json:"checkpoint_size_bytes,omitempty"` + // Whether checkpoint/restore or the recommendation itself was intentionally + // skipped (for example, because live migration is unsupported, the workload + // had no running Pods, or there was no effective resource change). + Skipped bool `protobuf:"varint,8,opt,name=skipped,proto3" json:"skipped,omitempty"` + // Stable, human-readable reason the operation was skipped. Empty when + // skipped is false. + SkipReason string `protobuf:"bytes,9,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"` } func (x *LiveMigrationResult) Reset() { *x = LiveMigrationResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[151] + mi := &file_api_v1_recommendation_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13179,7 +16141,7 @@ func (x *LiveMigrationResult) String() string { func (*LiveMigrationResult) ProtoMessage() {} func (x *LiveMigrationResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[151] + mi := &file_api_v1_recommendation_proto_msgTypes[167] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13192,7 +16154,7 @@ func (x *LiveMigrationResult) ProtoReflect() protoreflect.Message { // Deprecated: Use LiveMigrationResult.ProtoReflect.Descriptor instead. func (*LiveMigrationResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{151} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{167} } func (x *LiveMigrationResult) GetDegraded() bool { @@ -13244,6 +16206,20 @@ func (x *LiveMigrationResult) GetCheckpointSizeBytes() int64 { return 0 } +func (x *LiveMigrationResult) GetSkipped() bool { + if x != nil { + return x.Skipped + } + return false +} + +func (x *LiveMigrationResult) GetSkipReason() string { + if x != nil { + return x.SkipReason + } + return "" +} + type NodeGroupReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13256,7 +16232,7 @@ type NodeGroupReference struct { func (x *NodeGroupReference) Reset() { *x = NodeGroupReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[152] + mi := &file_api_v1_recommendation_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13269,7 +16245,7 @@ func (x *NodeGroupReference) String() string { func (*NodeGroupReference) ProtoMessage() {} func (x *NodeGroupReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[152] + mi := &file_api_v1_recommendation_proto_msgTypes[168] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13282,7 +16258,7 @@ func (x *NodeGroupReference) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupReference.ProtoReflect.Descriptor instead. func (*NodeGroupReference) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{152} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{168} } func (x *NodeGroupReference) GetClusterId() string { @@ -13316,7 +16292,7 @@ type NodeGroupRecommendation struct { func (x *NodeGroupRecommendation) Reset() { *x = NodeGroupRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[153] + mi := &file_api_v1_recommendation_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13329,7 +16305,7 @@ func (x *NodeGroupRecommendation) String() string { func (*NodeGroupRecommendation) ProtoMessage() {} func (x *NodeGroupRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[153] + mi := &file_api_v1_recommendation_proto_msgTypes[169] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13342,7 +16318,7 @@ func (x *NodeGroupRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupRecommendation.ProtoReflect.Descriptor instead. func (*NodeGroupRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{153} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{169} } func (x *NodeGroupRecommendation) GetRecommendationId() string { @@ -13415,7 +16391,7 @@ type CostImpact struct { func (x *CostImpact) Reset() { *x = CostImpact{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[154] + mi := &file_api_v1_recommendation_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13428,7 +16404,7 @@ func (x *CostImpact) String() string { func (*CostImpact) ProtoMessage() {} func (x *CostImpact) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[154] + mi := &file_api_v1_recommendation_proto_msgTypes[170] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13441,7 +16417,7 @@ func (x *CostImpact) ProtoReflect() protoreflect.Message { // Deprecated: Use CostImpact.ProtoReflect.Descriptor instead. func (*CostImpact) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{154} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{170} } func (x *CostImpact) GetCurrentCostPerMonth() *money.Money { @@ -13540,36 +16516,85 @@ type WorkloadRecommendation struct { // The label selector for the workload LabelSelector *LabelSelector `protobuf:"bytes,20,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` // whether this recommendation should be applied using live migration - UseLiveMigration bool `protobuf:"varint,21,opt,name=use_live_migration,json=useLiveMigration,proto3" json:"use_live_migration,omitempty"` - DelProp LiveMigDeletionPropagation `protobuf:"varint,22,opt,name=del_prop,json=delProp,proto3,enum=api.v1.LiveMigDeletionPropagation" json:"del_prop,omitempty"` - Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` - CurrentTolerations []*Toleration `protobuf:"bytes,41,rep,name=current_tolerations,json=currentTolerations,proto3" json:"current_tolerations,omitempty"` - RecommendedTolerations []*Toleration `protobuf:"bytes,42,rep,name=recommended_tolerations,json=recommendedTolerations,proto3" json:"recommended_tolerations,omitempty"` + UseLiveMigration bool `protobuf:"varint,21,opt,name=use_live_migration,json=useLiveMigration,proto3" json:"use_live_migration,omitempty"` + DelProp LiveMigDeletionPropagation `protobuf:"varint,22,opt,name=del_prop,json=delProp,proto3,enum=api.v1.LiveMigDeletionPropagation" json:"del_prop,omitempty"` + // Why this recommendation was generated, set once at creation. For + // recommendations with no rule_id (policy-based / one-time), this is + // never touched again after generation — see `success`/`error` for the + // operator's terminal outcome instead. rule_id (MPA v2) rows may still + // have the operator's post-hoc status message appended. + Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` + CurrentTolerations []*Toleration `protobuf:"bytes,41,rep,name=current_tolerations,json=currentTolerations,proto3" json:"current_tolerations,omitempty"` + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + RecommendedTolerations []*Toleration `protobuf:"bytes,42,rep,name=recommended_tolerations,json=recommendedTolerations,proto3" json:"recommended_tolerations,omitempty"` // superseded by toleration_mutations (per-element merge) Status *RecommendationStatus `protobuf:"varint,51,opt,name=status,proto3,enum=api.v1.RecommendationStatus,oneof" json:"status,omitempty"` Policy *WorkloadRecommendationPolicy `protobuf:"bytes,61,opt,name=policy,proto3,oneof" json:"policy,omitempty"` PolicyId *string `protobuf:"bytes,62,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` PolicyTarget *WorkloadPolicyTarget `protobuf:"bytes,71,opt,name=policy_target,json=policyTarget,proto3,oneof" json:"policy_target,omitempty"` PolicyTargetId *string `protobuf:"bytes,72,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` RuleId *string `protobuf:"bytes,73,opt,name=rule_id,json=ruleId,proto3,oneof" json:"rule_id,omitempty"` - ReplicaCountAction ActionToTake `protobuf:"varint,81,opt,name=replica_count_action,json=replicaCountAction,proto3,enum=api.v1.ActionToTake" json:"replica_count_action,omitempty"` // suggests if operator should set recommended_replica_count + // CurrentSource of the governing WorkloadRule (MPA v2), e.g. "auto_optimization", + // "policy", "manual". Only set when rule_id is populated. Mirrors WorkloadRule.current_source + // so the recommendations list can show/link the governing rule without a second RPC. + RuleSource *string `protobuf:"bytes,104,opt,name=rule_source,json=ruleSource,proto3,oneof" json:"rule_source,omitempty"` + // The original spec.recommendation_id from the WorkloadRecommendation CRD. For MPA v2 + // (rule-based) rows, recommendation_id (field 1, this message's row ID) is deliberately + // re-derived per apply cycle so each evaluation gets its own history row — but audit log + // entries and live-migration checkpoint/restore events are always stamped with this + // original, un-derived ID. Clients querying audit logs or C/R status/events for a + // recommendation MUST use this field, not recommendation_id, or the query returns nothing + // for MPA v2 rows. Equal to recommendation_id for legacy rows (which never derive it). + SourceRecommendationId *string `protobuf:"bytes,105,opt,name=source_recommendation_id,json=sourceRecommendationId,proto3,oneof" json:"source_recommendation_id,omitempty"` + ReplicaCountAction ActionToTake `protobuf:"varint,81,opt,name=replica_count_action,json=replicaCountAction,proto3,enum=api.v1.ActionToTake" json:"replica_count_action,omitempty"` // suggests if operator should set recommended_replica_count // Result of live migration when this recommendation was applied with use_live_migration (populated after apply). LiveMigrationResult *LiveMigrationResult `protobuf:"bytes,82,opt,name=live_migration_result,json=liveMigrationResult,proto3,oneof" json:"live_migration_result,omitempty"` // Error message when status is failed or apply failed. Error *string `protobuf:"bytes,83,opt,name=error,proto3,oneof" json:"error,omitempty"` + // Operator's terminal status message for any non-failure outcome (applied, + // or superseded via image-changed/skip). Mirrors `error` for the + // non-failure side. Only populated for recommendations with no rule_id + // (policy-based and one-time recs) — see reasoning field note below. + Success *string `protobuf:"bytes,106,opt,name=success,proto3,oneof" json:"success,omitempty"` // Backend-computed cost impact (current vs recommended). CostImpact *CostImpact `protobuf:"bytes,91,opt,name=cost_impact,json=costImpact,proto3,oneof" json:"cost_impact,omitempty"` // Whether this recommendation should be applied using in-place pod vertical scaling. // When true, the operator resizes running pods via the /resize subresource // without triggering rolling restarts (requires k8s >= v1.33). UseInPlaceVerticalScaling bool `protobuf:"varint,92,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Whether the operator may lower a container's memory limit while applying + // this recommendation in place. Copied from the owning rule/policy at + // generation time so the operator's apply-time preflight can decide without + // re-reading the rule. Independent of, and additional to, the cluster + // version check. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,109,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // Impact score (0-1) indicating optimization opportunity. Higher = more waste. ImpactScore float64 `protobuf:"fixed64,93,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` + // Pod-scoped per-element nodeSelector mutations (merge key: key). + NodeSelectorMutations []*NodeSelectorMutation `protobuf:"bytes,101,rep,name=node_selector_mutations,json=nodeSelectorMutations,proto3" json:"node_selector_mutations,omitempty"` + // Pod-scoped per-element toleration mutations. Supersedes the deprecated + // recommended_tolerations full-list field. + TolerationMutations []*TolerationMutation `protobuf:"bytes,102,rep,name=toleration_mutations,json=tolerationMutations,proto3" json:"toleration_mutations,omitempty"` + // Container image (keyed by container name) the recommendation was derived + // from — the "source" release. The operator compares this against a + // workload's live images to detect that a new release shipped and retire a + // recommendation whose tuned values (resources, JVM heap, …) were computed + // for the old image, so they are not pinned onto the new one (e.g. a stale + // -Xmx that could OOM the new build). + SourceImages map[string]string `protobuf:"bytes,103,rep,name=source_images,json=sourceImages,proto3" json:"source_images,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Force-restart directive when no resource fields changed but a restart + // was still requested (e.g. re-apply after an image change). + RestartActionToTake ActionToTake `protobuf:"varint,107,opt,name=restart_action_to_take,json=restartActionToTake,proto3,enum=api.v1.ActionToTake" json:"restart_action_to_take,omitempty"` + // Structured reasoning payload (insights, per-container deltas, HPA + // context, decision trace). Only populated for mpav1 (policy_id set) + // recommendations generated after this field shipped; absent for mpav2, + // one-time, and historical rows — consumers fall back to `reasoning`. + ReasoningDetails *ReasoningDetails `protobuf:"bytes,108,opt,name=reasoning_details,json=reasoningDetails,proto3,oneof" json:"reasoning_details,omitempty"` } func (x *WorkloadRecommendation) Reset() { *x = WorkloadRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[155] + mi := &file_api_v1_recommendation_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13582,7 +16607,7 @@ func (x *WorkloadRecommendation) String() string { func (*WorkloadRecommendation) ProtoMessage() {} func (x *WorkloadRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[155] + mi := &file_api_v1_recommendation_proto_msgTypes[171] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13595,7 +16620,7 @@ func (x *WorkloadRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRecommendation.ProtoReflect.Descriptor instead. func (*WorkloadRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{155} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{171} } func (x *WorkloadRecommendation) GetRecommendationId() string { @@ -13710,6 +16735,7 @@ func (x *WorkloadRecommendation) GetCurrentTolerations() []*Toleration { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *WorkloadRecommendation) GetRecommendedTolerations() []*Toleration { if x != nil { return x.RecommendedTolerations @@ -13759,6 +16785,20 @@ func (x *WorkloadRecommendation) GetRuleId() string { return "" } +func (x *WorkloadRecommendation) GetRuleSource() string { + if x != nil && x.RuleSource != nil { + return *x.RuleSource + } + return "" +} + +func (x *WorkloadRecommendation) GetSourceRecommendationId() string { + if x != nil && x.SourceRecommendationId != nil { + return *x.SourceRecommendationId + } + return "" +} + func (x *WorkloadRecommendation) GetReplicaCountAction() ActionToTake { if x != nil { return x.ReplicaCountAction @@ -13780,6 +16820,13 @@ func (x *WorkloadRecommendation) GetError() string { return "" } +func (x *WorkloadRecommendation) GetSuccess() string { + if x != nil && x.Success != nil { + return *x.Success + } + return "" +} + func (x *WorkloadRecommendation) GetCostImpact() *CostImpact { if x != nil { return x.CostImpact @@ -13794,6 +16841,13 @@ func (x *WorkloadRecommendation) GetUseInPlaceVerticalScaling() bool { return false } +func (x *WorkloadRecommendation) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + func (x *WorkloadRecommendation) GetImpactScore() float64 { if x != nil { return x.ImpactScore @@ -13801,33 +16855,75 @@ func (x *WorkloadRecommendation) GetImpactScore() float64 { return 0 } -type GetAttachedNodeGroupPoliciesRequest struct { +func (x *WorkloadRecommendation) GetNodeSelectorMutations() []*NodeSelectorMutation { + if x != nil { + return x.NodeSelectorMutations + } + return nil +} + +func (x *WorkloadRecommendation) GetTolerationMutations() []*TolerationMutation { + if x != nil { + return x.TolerationMutations + } + return nil +} + +func (x *WorkloadRecommendation) GetSourceImages() map[string]string { + if x != nil { + return x.SourceImages + } + return nil +} + +func (x *WorkloadRecommendation) GetRestartActionToTake() ActionToTake { + if x != nil { + return x.RestartActionToTake + } + return ActionToTake_ACTION_TO_TAKE_SET +} + +func (x *WorkloadRecommendation) GetReasoningDetails() *ReasoningDetails { + if x != nil { + return x.ReasoningDetails + } + return nil +} + +// ReasoningDetails is the structured form of a recommendation's `reasoning` +// prose. schema_version tracks the payload shape (currently 1). +type ReasoningDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - NodeGroupName string `protobuf:"bytes,3,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` + SchemaVersion int32 `protobuf:"varint,1,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + Insights []*ReasoningInsight `protobuf:"bytes,2,rep,name=insights,proto3" json:"insights,omitempty"` + ContainerChanges []*ReasoningContainerChange `protobuf:"bytes,3,rep,name=container_changes,json=containerChanges,proto3" json:"container_changes,omitempty"` + Replicas *ReasoningReplicas `protobuf:"bytes,4,opt,name=replicas,proto3,oneof" json:"replicas,omitempty"` + Decisions []*ReasoningDecision `protobuf:"bytes,5,rep,name=decisions,proto3" json:"decisions,omitempty"` + ConfidenceScore float64 `protobuf:"fixed64,6,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` + RiskScore float64 `protobuf:"fixed64,7,opt,name=risk_score,json=riskScore,proto3" json:"risk_score,omitempty"` + EffectiveDeadbandPercent float64 `protobuf:"fixed64,8,opt,name=effective_deadband_percent,json=effectiveDeadbandPercent,proto3" json:"effective_deadband_percent,omitempty"` } -func (x *GetAttachedNodeGroupPoliciesRequest) Reset() { - *x = GetAttachedNodeGroupPoliciesRequest{} +func (x *ReasoningDetails) Reset() { + *x = ReasoningDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[156] + mi := &file_api_v1_recommendation_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedNodeGroupPoliciesRequest) String() string { +func (x *ReasoningDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedNodeGroupPoliciesRequest) ProtoMessage() {} +func (*ReasoningDetails) ProtoMessage() {} -func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[156] +func (x *ReasoningDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[172] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13838,57 +16934,94 @@ func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. -func (*GetAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{156} +// Deprecated: Use ReasoningDetails.ProtoReflect.Descriptor instead. +func (*ReasoningDetails) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{172} } -func (x *GetAttachedNodeGroupPoliciesRequest) GetTeamId() string { +func (x *ReasoningDetails) GetSchemaVersion() int32 { if x != nil { - return x.TeamId + return x.SchemaVersion } - return "" + return 0 } -func (x *GetAttachedNodeGroupPoliciesRequest) GetClusterId() string { +func (x *ReasoningDetails) GetInsights() []*ReasoningInsight { if x != nil { - return x.ClusterId + return x.Insights } - return "" + return nil } -func (x *GetAttachedNodeGroupPoliciesRequest) GetNodeGroupName() string { +func (x *ReasoningDetails) GetContainerChanges() []*ReasoningContainerChange { if x != nil { - return x.NodeGroupName + return x.ContainerChanges } - return "" + return nil } -type GetAttachedNodeGroupPoliciesResponse struct { +func (x *ReasoningDetails) GetReplicas() *ReasoningReplicas { + if x != nil { + return x.Replicas + } + return nil +} + +func (x *ReasoningDetails) GetDecisions() []*ReasoningDecision { + if x != nil { + return x.Decisions + } + return nil +} + +func (x *ReasoningDetails) GetConfidenceScore() float64 { + if x != nil { + return x.ConfidenceScore + } + return 0 +} + +func (x *ReasoningDetails) GetRiskScore() float64 { + if x != nil { + return x.RiskScore + } + return 0 +} + +func (x *ReasoningDetails) GetEffectiveDeadbandPercent() float64 { + if x != nil { + return x.EffectiveDeadbandPercent + } + return 0 +} + +type ReasoningEvidence struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Confidence float64 `protobuf:"fixed64,3,opt,name=confidence,proto3" json:"confidence,omitempty"` } -func (x *GetAttachedNodeGroupPoliciesResponse) Reset() { - *x = GetAttachedNodeGroupPoliciesResponse{} +func (x *ReasoningEvidence) Reset() { + *x = ReasoningEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[157] + mi := &file_api_v1_recommendation_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedNodeGroupPoliciesResponse) String() string { +func (x *ReasoningEvidence) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedNodeGroupPoliciesResponse) ProtoMessage() {} +func (*ReasoningEvidence) ProtoMessage() {} -func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[157] +func (x *ReasoningEvidence) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[173] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13899,47 +17032,64 @@ func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. -func (*GetAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{157} +// Deprecated: Use ReasoningEvidence.ProtoReflect.Descriptor instead. +func (*ReasoningEvidence) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{173} } -func (x *GetAttachedNodeGroupPoliciesResponse) GetPolicies() []*NodeGroupRecommendationPolicy { +func (x *ReasoningEvidence) GetType() string { if x != nil { - return x.Policies + return x.Type } - return nil + return "" } -type GetAttachedWorkloadPoliciesRequest struct { +func (x *ReasoningEvidence) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ReasoningEvidence) GetConfidence() float64 { + if x != nil { + return x.Confidence + } + return 0 +} + +type ReasoningInsight struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` - Kind K8SObjectKind `protobuf:"varint,4,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // The kind of workload - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ReasoningInsightType `protobuf:"varint,2,opt,name=type,proto3,enum=api.v1.ReasoningInsightType" json:"type,omitempty"` + Severity ReasoningInsightSeverity `protobuf:"varint,3,opt,name=severity,proto3,enum=api.v1.ReasoningInsightSeverity" json:"severity,omitempty"` + Confidence float64 `protobuf:"fixed64,4,opt,name=confidence,proto3" json:"confidence,omitempty"` + Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + Impact string `protobuf:"bytes,7,opt,name=impact,proto3" json:"impact,omitempty"` + Evidence []*ReasoningEvidence `protobuf:"bytes,8,rep,name=evidence,proto3" json:"evidence,omitempty"` } -func (x *GetAttachedWorkloadPoliciesRequest) Reset() { - *x = GetAttachedWorkloadPoliciesRequest{} +func (x *ReasoningInsight) Reset() { + *x = ReasoningInsight{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[158] + mi := &file_api_v1_recommendation_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedWorkloadPoliciesRequest) String() string { +func (x *ReasoningInsight) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedWorkloadPoliciesRequest) ProtoMessage() {} +func (*ReasoningInsight) ProtoMessage() {} -func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[158] +func (x *ReasoningInsight) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[174] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13950,72 +17100,98 @@ func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. -func (*GetAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{158} +// Deprecated: Use ReasoningInsight.ProtoReflect.Descriptor instead. +func (*ReasoningInsight) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{174} } -func (x *GetAttachedWorkloadPoliciesRequest) GetTeamId() string { +func (x *ReasoningInsight) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetClusterId() string { +func (x *ReasoningInsight) GetType() ReasoningInsightType { if x != nil { - return x.ClusterId + return x.Type + } + return ReasoningInsightType_REASONING_INSIGHT_TYPE_UNSPECIFIED +} + +func (x *ReasoningInsight) GetSeverity() ReasoningInsightSeverity { + if x != nil { + return x.Severity + } + return ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_UNSPECIFIED +} + +func (x *ReasoningInsight) GetConfidence() float64 { + if x != nil { + return x.Confidence + } + return 0 +} + +func (x *ReasoningInsight) GetTitle() string { + if x != nil { + return x.Title } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetWorkloadUid() string { +func (x *ReasoningInsight) GetDescription() string { if x != nil { - return x.WorkloadUid + return x.Description } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetKind() K8SObjectKind { +func (x *ReasoningInsight) GetImpact() string { if x != nil { - return x.Kind + return x.Impact } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED + return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetIncludeDeleted() bool { +func (x *ReasoningInsight) GetEvidence() []*ReasoningEvidence { if x != nil { - return x.IncludeDeleted + return x.Evidence } - return false + return nil } -type GetAttachedWorkloadPoliciesResponse struct { +// Raw units: millicores for CPU, bytes for memory. Before = actuals at +// generation time, after = final recommendation. Percent changes are for +// the consumer to compute (avoids the legacy divide-by-zero Inf%). +type ReasoningResourceEdge struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RelevantPolicies *WorkloadRecommendationPolicyGroup `protobuf:"bytes,1,opt,name=relevant_policies,json=relevantPolicies,proto3" json:"relevant_policies,omitempty"` - PolicyIdToMatchedTargets map[string]*WorkloadPolicyTargetGroup `protobuf:"bytes,2,rep,name=policy_id_to_matched_targets,json=policyIdToMatchedTargets,proto3" json:"policy_id_to_matched_targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + RequestBefore int64 `protobuf:"varint,1,opt,name=request_before,json=requestBefore,proto3" json:"request_before,omitempty"` + RequestAfter int64 `protobuf:"varint,2,opt,name=request_after,json=requestAfter,proto3" json:"request_after,omitempty"` + LimitBefore int64 `protobuf:"varint,3,opt,name=limit_before,json=limitBefore,proto3" json:"limit_before,omitempty"` + LimitAfter int64 `protobuf:"varint,4,opt,name=limit_after,json=limitAfter,proto3" json:"limit_after,omitempty"` } -func (x *GetAttachedWorkloadPoliciesResponse) Reset() { - *x = GetAttachedWorkloadPoliciesResponse{} +func (x *ReasoningResourceEdge) Reset() { + *x = ReasoningResourceEdge{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[159] + mi := &file_api_v1_recommendation_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedWorkloadPoliciesResponse) String() string { +func (x *ReasoningResourceEdge) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedWorkloadPoliciesResponse) ProtoMessage() {} +func (*ReasoningResourceEdge) ProtoMessage() {} -func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[159] +func (x *ReasoningResourceEdge) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[175] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14026,50 +17202,68 @@ func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. -func (*GetAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{159} +// Deprecated: Use ReasoningResourceEdge.ProtoReflect.Descriptor instead. +func (*ReasoningResourceEdge) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{175} } -func (x *GetAttachedWorkloadPoliciesResponse) GetRelevantPolicies() *WorkloadRecommendationPolicyGroup { +func (x *ReasoningResourceEdge) GetRequestBefore() int64 { if x != nil { - return x.RelevantPolicies + return x.RequestBefore } - return nil + return 0 } -func (x *GetAttachedWorkloadPoliciesResponse) GetPolicyIdToMatchedTargets() map[string]*WorkloadPolicyTargetGroup { +func (x *ReasoningResourceEdge) GetRequestAfter() int64 { if x != nil { - return x.PolicyIdToMatchedTargets + return x.RequestAfter } - return nil + return 0 } -type WorkloadRecommendationPolicyGroup struct { +func (x *ReasoningResourceEdge) GetLimitBefore() int64 { + if x != nil { + return x.LimitBefore + } + return 0 +} + +func (x *ReasoningResourceEdge) GetLimitAfter() int64 { + if x != nil { + return x.LimitAfter + } + return 0 +} + +type ReasoningContainerChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Container string `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"` + Cpu *ReasoningResourceEdge `protobuf:"bytes,2,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory *ReasoningResourceEdge `protobuf:"bytes,3,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu *ReasoningResourceEdge `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` + OomTriggered bool `protobuf:"varint,5,opt,name=oom_triggered,json=oomTriggered,proto3" json:"oom_triggered,omitempty"` } -func (x *WorkloadRecommendationPolicyGroup) Reset() { - *x = WorkloadRecommendationPolicyGroup{} +func (x *ReasoningContainerChange) Reset() { + *x = ReasoningContainerChange{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[160] + mi := &file_api_v1_recommendation_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRecommendationPolicyGroup) String() string { +func (x *ReasoningContainerChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRecommendationPolicyGroup) ProtoMessage() {} +func (*ReasoningContainerChange) ProtoMessage() {} -func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[160] +func (x *ReasoningContainerChange) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14080,43 +17274,74 @@ func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use WorkloadRecommendationPolicyGroup.ProtoReflect.Descriptor instead. -func (*WorkloadRecommendationPolicyGroup) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{160} +// Deprecated: Use ReasoningContainerChange.ProtoReflect.Descriptor instead. +func (*ReasoningContainerChange) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{176} } -func (x *WorkloadRecommendationPolicyGroup) GetPolicies() []*WorkloadRecommendationPolicy { +func (x *ReasoningContainerChange) GetContainer() string { if x != nil { - return x.Policies + return x.Container + } + return "" +} + +func (x *ReasoningContainerChange) GetCpu() *ReasoningResourceEdge { + if x != nil { + return x.Cpu } return nil } -type WorkloadPolicyTargetGroup struct { +func (x *ReasoningContainerChange) GetMemory() *ReasoningResourceEdge { + if x != nil { + return x.Memory + } + return nil +} + +func (x *ReasoningContainerChange) GetGpu() *ReasoningResourceEdge { + if x != nil { + return x.Gpu + } + return nil +} + +func (x *ReasoningContainerChange) GetOomTriggered() bool { + if x != nil { + return x.OomTriggered + } + return false +} + +type ReasoningUtilization struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*WorkloadPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + CpuCurrent float64 `protobuf:"fixed64,1,opt,name=cpu_current,json=cpuCurrent,proto3" json:"cpu_current,omitempty"` + CpuTarget float64 `protobuf:"fixed64,2,opt,name=cpu_target,json=cpuTarget,proto3" json:"cpu_target,omitempty"` + MemoryCurrent float64 `protobuf:"fixed64,3,opt,name=memory_current,json=memoryCurrent,proto3" json:"memory_current,omitempty"` + MemoryTarget float64 `protobuf:"fixed64,4,opt,name=memory_target,json=memoryTarget,proto3" json:"memory_target,omitempty"` } -func (x *WorkloadPolicyTargetGroup) Reset() { - *x = WorkloadPolicyTargetGroup{} +func (x *ReasoningUtilization) Reset() { + *x = ReasoningUtilization{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[161] + mi := &file_api_v1_recommendation_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadPolicyTargetGroup) String() string { +func (x *ReasoningUtilization) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadPolicyTargetGroup) ProtoMessage() {} +func (*ReasoningUtilization) ProtoMessage() {} -func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[161] +func (x *ReasoningUtilization) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14127,43 +17352,66 @@ func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadPolicyTargetGroup.ProtoReflect.Descriptor instead. -func (*WorkloadPolicyTargetGroup) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{161} +// Deprecated: Use ReasoningUtilization.ProtoReflect.Descriptor instead. +func (*ReasoningUtilization) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{177} } -func (x *WorkloadPolicyTargetGroup) GetTargets() []*WorkloadPolicyTarget { +func (x *ReasoningUtilization) GetCpuCurrent() float64 { if x != nil { - return x.Targets + return x.CpuCurrent } - return nil + return 0 } -type WorkloadIdentifiers struct { +func (x *ReasoningUtilization) GetCpuTarget() float64 { + if x != nil { + return x.CpuTarget + } + return 0 +} + +func (x *ReasoningUtilization) GetMemoryCurrent() float64 { + if x != nil { + return x.MemoryCurrent + } + return 0 +} + +func (x *ReasoningUtilization) GetMemoryTarget() float64 { + if x != nil { + return x.MemoryTarget + } + return 0 +} + +type ReasoningHistoricalPattern struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` + Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` + IsOscillating bool `protobuf:"varint,2,opt,name=is_oscillating,json=isOscillating,proto3" json:"is_oscillating,omitempty"` + ChangeFrequency float64 `protobuf:"fixed64,3,opt,name=change_frequency,json=changeFrequency,proto3" json:"change_frequency,omitempty"` } -func (x *WorkloadIdentifiers) Reset() { - *x = WorkloadIdentifiers{} +func (x *ReasoningHistoricalPattern) Reset() { + *x = ReasoningHistoricalPattern{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[162] + mi := &file_api_v1_recommendation_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadIdentifiers) String() string { +func (x *ReasoningHistoricalPattern) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadIdentifiers) ProtoMessage() {} +func (*ReasoningHistoricalPattern) ProtoMessage() {} -func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[162] +func (x *ReasoningHistoricalPattern) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14174,44 +17422,65 @@ func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadIdentifiers.ProtoReflect.Descriptor instead. -func (*WorkloadIdentifiers) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{162} +// Deprecated: Use ReasoningHistoricalPattern.ProtoReflect.Descriptor instead. +func (*ReasoningHistoricalPattern) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{178} } -func (x *WorkloadIdentifiers) GetWorkloads() []*WorkloadIdentifier { +func (x *ReasoningHistoricalPattern) GetPattern() string { if x != nil { - return x.Workloads + return x.Pattern } - return nil + return "" } -type WorkloadPolicies struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Workload *WorkloadIdentifier `protobuf:"bytes,1,opt,name=workload,proto3" json:"workload,omitempty"` - Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` +func (x *ReasoningHistoricalPattern) GetIsOscillating() bool { + if x != nil { + return x.IsOscillating + } + return false } -func (x *WorkloadPolicies) Reset() { - *x = WorkloadPolicies{} +func (x *ReasoningHistoricalPattern) GetChangeFrequency() float64 { + if x != nil { + return x.ChangeFrequency + } + return 0 +} + +type ReasoningReplicas struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Current int32 `protobuf:"varint,1,opt,name=current,proto3" json:"current,omitempty"` + Recommended int32 `protobuf:"varint,2,opt,name=recommended,proto3" json:"recommended,omitempty"` + Min int32 `protobuf:"varint,3,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,4,opt,name=max,proto3" json:"max,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + PrimaryMetric string `protobuf:"bytes,6,opt,name=primary_metric,json=primaryMetric,proto3" json:"primary_metric,omitempty"` + Utilization *ReasoningUtilization `protobuf:"bytes,7,opt,name=utilization,proto3" json:"utilization,omitempty"` + WorkloadType string `protobuf:"bytes,8,opt,name=workload_type,json=workloadType,proto3" json:"workload_type,omitempty"` + HistoricalPattern *ReasoningHistoricalPattern `protobuf:"bytes,9,opt,name=historical_pattern,json=historicalPattern,proto3" json:"historical_pattern,omitempty"` +} + +func (x *ReasoningReplicas) Reset() { + *x = ReasoningReplicas{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[163] + mi := &file_api_v1_recommendation_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadPolicies) String() string { +func (x *ReasoningReplicas) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadPolicies) ProtoMessage() {} +func (*ReasoningReplicas) ProtoMessage() {} -func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[163] +func (x *ReasoningReplicas) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14222,125 +17491,106 @@ func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadPolicies.ProtoReflect.Descriptor instead. -func (*WorkloadPolicies) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{163} +// Deprecated: Use ReasoningReplicas.ProtoReflect.Descriptor instead. +func (*ReasoningReplicas) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{179} } -func (x *WorkloadPolicies) GetWorkload() *WorkloadIdentifier { +func (x *ReasoningReplicas) GetCurrent() int32 { if x != nil { - return x.Workload + return x.Current } - return nil + return 0 } -func (x *WorkloadPolicies) GetPolicies() []*WorkloadRecommendationPolicy { +func (x *ReasoningReplicas) GetRecommended() int32 { if x != nil { - return x.Policies + return x.Recommended } - return nil -} - -// ListAttachedWorkloadPoliciesRequest is used to fetch all attached workload policies and workloads for a team. -// All parameters except team_id are optional filters. -type ListAttachedWorkloadPoliciesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. - WorkloadUids []string `protobuf:"bytes,4,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` // Optional list of workload UIDs to filter by specific workloads. + return 0 } -func (x *ListAttachedWorkloadPoliciesRequest) Reset() { - *x = ListAttachedWorkloadPoliciesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[164] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ReasoningReplicas) GetMin() int32 { + if x != nil { + return x.Min } + return 0 } -func (x *ListAttachedWorkloadPoliciesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListAttachedWorkloadPoliciesRequest) ProtoMessage() {} - -func (x *ListAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[164] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ReasoningReplicas) GetMax() int32 { + if x != nil { + return x.Max } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use ListAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{164} +func (x *ReasoningReplicas) GetReason() string { + if x != nil { + return x.Reason + } + return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetTeamId() string { +func (x *ReasoningReplicas) GetPrimaryMetric() string { if x != nil { - return x.TeamId + return x.PrimaryMetric } return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetClusterIds() []string { +func (x *ReasoningReplicas) GetUtilization() *ReasoningUtilization { if x != nil { - return x.ClusterIds + return x.Utilization } return nil } -func (x *ListAttachedWorkloadPoliciesRequest) GetPolicyIds() []string { +func (x *ReasoningReplicas) GetWorkloadType() string { if x != nil { - return x.PolicyIds + return x.WorkloadType } - return nil + return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetWorkloadUids() []string { +func (x *ReasoningReplicas) GetHistoricalPattern() *ReasoningHistoricalPattern { if x != nil { - return x.WorkloadUids + return x.HistoricalPattern } return nil } -// ListAttachedWorkloadPoliciesResponse contains all attached policies and workloads with their relationships. -type ListAttachedWorkloadPoliciesResponse struct { +type ReasoningDecision struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyMap map[string]*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to WorkloadRecommendationPolicy - WorkloadMap map[string]*WorkloadItem `protobuf:"bytes,2,rep,name=workload_map,json=workloadMap,proto3" json:"workload_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of workload UID to WorkloadItem + Kind ReasoningDecisionKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.ReasoningDecisionKind" json:"kind,omitempty"` + Container string `protobuf:"bytes,2,opt,name=container,proto3" json:"container,omitempty"` // empty = workload-scoped + Resource string `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` // cpu | memory | gpu | "" + Field string `protobuf:"bytes,4,opt,name=field,proto3" json:"field,omitempty"` // request | limit | replicas | "" + Intended *int64 `protobuf:"varint,5,opt,name=intended,proto3,oneof" json:"intended,omitempty"` + Actual *int64 `protobuf:"varint,6,opt,name=actual,proto3,oneof" json:"actual,omitempty"` + Constraint string `protobuf:"bytes,7,opt,name=constraint,proto3" json:"constraint,omitempty"` // open-ended machine-readable cause token + Message string `protobuf:"bytes,8,opt,name=message,proto3" json:"message,omitempty"` } -func (x *ListAttachedWorkloadPoliciesResponse) Reset() { - *x = ListAttachedWorkloadPoliciesResponse{} +func (x *ReasoningDecision) Reset() { + *x = ReasoningDecision{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[165] + mi := &file_api_v1_recommendation_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListAttachedWorkloadPoliciesResponse) String() string { +func (x *ReasoningDecision) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAttachedWorkloadPoliciesResponse) ProtoMessage() {} +func (*ReasoningDecision) ProtoMessage() {} -func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[165] +func (x *ReasoningDecision) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[180] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14351,125 +17601,94 @@ func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{165} +// Deprecated: Use ReasoningDecision.ProtoReflect.Descriptor instead. +func (*ReasoningDecision) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{180} } -func (x *ListAttachedWorkloadPoliciesResponse) GetPolicyMap() map[string]*WorkloadRecommendationPolicy { +func (x *ReasoningDecision) GetKind() ReasoningDecisionKind { if x != nil { - return x.PolicyMap + return x.Kind } - return nil + return ReasoningDecisionKind_REASONING_DECISION_KIND_UNSPECIFIED } -func (x *ListAttachedWorkloadPoliciesResponse) GetWorkloadMap() map[string]*WorkloadItem { +func (x *ReasoningDecision) GetContainer() string { if x != nil { - return x.WorkloadMap + return x.Container } - return nil -} - -// ListAttachedNodeGroupPoliciesRequest is used to fetch all attached node group policies and node groups for a team. -// All parameters except team_id are optional filters. -type ListAttachedNodeGroupPoliciesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. - NodeGroupNames []string `protobuf:"bytes,4,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional list of node group names to filter by specific node groups. + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) Reset() { - *x = ListAttachedNodeGroupPoliciesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[166] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ReasoningDecision) GetResource() string { + if x != nil { + return x.Resource } + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListAttachedNodeGroupPoliciesRequest) ProtoMessage() {} - -func (x *ListAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[166] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ReasoningDecision) GetField() string { + if x != nil { + return x.Field } - return mi.MessageOf(x) -} - -// Deprecated: Use ListAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{166} + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *ReasoningDecision) GetIntended() int64 { + if x != nil && x.Intended != nil { + return *x.Intended } - return "" + return 0 } -func (x *ListAttachedNodeGroupPoliciesRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *ReasoningDecision) GetActual() int64 { + if x != nil && x.Actual != nil { + return *x.Actual } - return nil + return 0 } -func (x *ListAttachedNodeGroupPoliciesRequest) GetPolicyIds() []string { +func (x *ReasoningDecision) GetConstraint() string { if x != nil { - return x.PolicyIds + return x.Constraint } - return nil + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) GetNodeGroupNames() []string { +func (x *ReasoningDecision) GetMessage() string { if x != nil { - return x.NodeGroupNames + return x.Message } - return nil + return "" } -// ListAttachedNodeGroupPoliciesResponse contains all attached policies and node groups with their relationships. -type ListAttachedNodeGroupPoliciesResponse struct { +type GetAttachedNodeGroupPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyMap map[string]*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to NodeGroupRecommendationPolicy - NodeGroupMap map[string]*NodeGroupItem `protobuf:"bytes,2,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of node group name to NodeGroupItem + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeGroupName string `protobuf:"bytes,3,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` } -func (x *ListAttachedNodeGroupPoliciesResponse) Reset() { - *x = ListAttachedNodeGroupPoliciesResponse{} +func (x *GetAttachedNodeGroupPoliciesRequest) Reset() { + *x = GetAttachedNodeGroupPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[167] + mi := &file_api_v1_recommendation_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListAttachedNodeGroupPoliciesResponse) String() string { +func (x *GetAttachedNodeGroupPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAttachedNodeGroupPoliciesResponse) ProtoMessage() {} +func (*GetAttachedNodeGroupPoliciesRequest) ProtoMessage() {} -func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[167] +func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[181] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14480,53 +17699,57 @@ func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{167} +// Deprecated: Use GetAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. +func (*GetAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{181} } -func (x *ListAttachedNodeGroupPoliciesResponse) GetPolicyMap() map[string]*NodeGroupRecommendationPolicy { +func (x *GetAttachedNodeGroupPoliciesRequest) GetTeamId() string { if x != nil { - return x.PolicyMap + return x.TeamId } - return nil + return "" } -func (x *ListAttachedNodeGroupPoliciesResponse) GetNodeGroupMap() map[string]*NodeGroupItem { +func (x *GetAttachedNodeGroupPoliciesRequest) GetClusterId() string { if x != nil { - return x.NodeGroupMap + return x.ClusterId } - return nil + return "" } -// NodeGroupItem represents a node group and its policy attachments. -type NodeGroupItem struct { +func (x *GetAttachedNodeGroupPoliciesRequest) GetNodeGroupName() string { + if x != nil { + return x.NodeGroupName + } + return "" +} + +type GetAttachedNodeGroupPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster ID where the node group exists. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this node group. + Policies []*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *NodeGroupItem) Reset() { - *x = NodeGroupItem{} +func (x *GetAttachedNodeGroupPoliciesResponse) Reset() { + *x = GetAttachedNodeGroupPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[168] + mi := &file_api_v1_recommendation_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupItem) String() string { +func (x *GetAttachedNodeGroupPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupItem) ProtoMessage() {} +func (*GetAttachedNodeGroupPoliciesResponse) ProtoMessage() {} -func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[168] +func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[182] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14537,60 +17760,47 @@ func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupItem.ProtoReflect.Descriptor instead. -func (*NodeGroupItem) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{168} -} - -func (x *NodeGroupItem) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NodeGroupItem) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. +func (*GetAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{182} } -func (x *NodeGroupItem) GetPolicyIds() []string { +func (x *GetAttachedNodeGroupPoliciesResponse) GetPolicies() []*NodeGroupRecommendationPolicy { if x != nil { - return x.PolicyIds + return x.Policies } return nil } -type RecommendationAppliedRequest struct { +type GetAttachedWorkloadPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + Kind K8SObjectKind `protobuf:"varint,4,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // The kind of workload + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } -func (x *RecommendationAppliedRequest) Reset() { - *x = RecommendationAppliedRequest{} +func (x *GetAttachedWorkloadPoliciesRequest) Reset() { + *x = GetAttachedWorkloadPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[169] + mi := &file_api_v1_recommendation_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationAppliedRequest) String() string { +func (x *GetAttachedWorkloadPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationAppliedRequest) ProtoMessage() {} +func (*GetAttachedWorkloadPoliciesRequest) ProtoMessage() {} -func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[169] +func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[183] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14601,62 +17811,72 @@ func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationAppliedRequest.ProtoReflect.Descriptor instead. -func (*RecommendationAppliedRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{169} +// Deprecated: Use GetAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. +func (*GetAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{183} } -func (x *RecommendationAppliedRequest) GetTeamId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *RecommendationAppliedRequest) GetClusterId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *RecommendationAppliedRequest) GetRecommendationId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetWorkloadUid() string { if x != nil { - return x.RecommendationId + return x.WorkloadUid } return "" } -func (x *RecommendationAppliedRequest) GetKind() K8SObjectKind { - if x != nil && x.Kind != nil { - return *x.Kind +func (x *GetAttachedWorkloadPoliciesRequest) GetKind() K8SObjectKind { + if x != nil { + return x.Kind } return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -type RecommendationAppliedResponse struct { +func (x *GetAttachedWorkloadPoliciesRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted + } + return false +} + +type GetAttachedWorkloadPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + RelevantPolicies *WorkloadRecommendationPolicyGroup `protobuf:"bytes,1,opt,name=relevant_policies,json=relevantPolicies,proto3" json:"relevant_policies,omitempty"` + PolicyIdToMatchedTargets map[string]*WorkloadPolicyTargetGroup `protobuf:"bytes,2,rep,name=policy_id_to_matched_targets,json=policyIdToMatchedTargets,proto3" json:"policy_id_to_matched_targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *RecommendationAppliedResponse) Reset() { - *x = RecommendationAppliedResponse{} +func (x *GetAttachedWorkloadPoliciesResponse) Reset() { + *x = GetAttachedWorkloadPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[170] + mi := &file_api_v1_recommendation_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationAppliedResponse) String() string { +func (x *GetAttachedWorkloadPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationAppliedResponse) ProtoMessage() {} +func (*GetAttachedWorkloadPoliciesResponse) ProtoMessage() {} -func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[170] +func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[184] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14667,44 +17887,50 @@ func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationAppliedResponse.ProtoReflect.Descriptor instead. -func (*RecommendationAppliedResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{170} +// Deprecated: Use GetAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. +func (*GetAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{184} } -type ApplyRecommendationRequest struct { +func (x *GetAttachedWorkloadPoliciesResponse) GetRelevantPolicies() *WorkloadRecommendationPolicyGroup { + if x != nil { + return x.RelevantPolicies + } + return nil +} + +func (x *GetAttachedWorkloadPoliciesResponse) GetPolicyIdToMatchedTargets() map[string]*WorkloadPolicyTargetGroup { + if x != nil { + return x.PolicyIdToMatchedTargets + } + return nil +} + +type WorkloadRecommendationPolicyGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload - // If true, generate a WorkloadRule instead of applying the recommendation directly. - // This is used when the policy has EnableInClusterMpa enabled, allowing the in-cluster - // MPA controller to evaluate the rule and generate recommendations locally. - GenerateRule bool `protobuf:"varint,13,opt,name=generate_rule,json=generateRule,proto3" json:"generate_rule,omitempty"` - WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,14,opt,name=workload_recommendation,json=workloadRecommendation,proto3,oneof" json:"workload_recommendation,omitempty"` + Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *ApplyRecommendationRequest) Reset() { - *x = ApplyRecommendationRequest{} +func (x *WorkloadRecommendationPolicyGroup) Reset() { + *x = WorkloadRecommendationPolicyGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[171] + mi := &file_api_v1_recommendation_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyRecommendationRequest) String() string { +func (x *WorkloadRecommendationPolicyGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyRecommendationRequest) ProtoMessage() {} +func (*WorkloadRecommendationPolicyGroup) ProtoMessage() {} -func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[171] +func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[185] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14715,76 +17941,43 @@ func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyRecommendationRequest.ProtoReflect.Descriptor instead. -func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{171} -} - -func (x *ApplyRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetRecommendationId() string { - if x != nil { - return x.RecommendationId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetKind() K8SObjectKind { - if x != nil && x.Kind != nil { - return *x.Kind - } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED -} - -func (x *ApplyRecommendationRequest) GetGenerateRule() bool { - if x != nil { - return x.GenerateRule - } - return false +// Deprecated: Use WorkloadRecommendationPolicyGroup.ProtoReflect.Descriptor instead. +func (*WorkloadRecommendationPolicyGroup) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{185} } -func (x *ApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { +func (x *WorkloadRecommendationPolicyGroup) GetPolicies() []*WorkloadRecommendationPolicy { if x != nil { - return x.WorkloadRecommendation + return x.Policies } return nil } -type ApplyRecommendationResponse struct { +type WorkloadPolicyTargetGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Targets []*WorkloadPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *ApplyRecommendationResponse) Reset() { - *x = ApplyRecommendationResponse{} +func (x *WorkloadPolicyTargetGroup) Reset() { + *x = WorkloadPolicyTargetGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[172] + mi := &file_api_v1_recommendation_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyRecommendationResponse) String() string { +func (x *WorkloadPolicyTargetGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyRecommendationResponse) ProtoMessage() {} +func (*WorkloadPolicyTargetGroup) ProtoMessage() {} -func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[172] +func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[186] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14795,34 +17988,43 @@ func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyRecommendationResponse.ProtoReflect.Descriptor instead. -func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{172} +// Deprecated: Use WorkloadPolicyTargetGroup.ProtoReflect.Descriptor instead. +func (*WorkloadPolicyTargetGroup) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{186} } -type RecommendationEventsRequest struct { +func (x *WorkloadPolicyTargetGroup) GetTargets() []*WorkloadPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type WorkloadIdentifiers struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` } -func (x *RecommendationEventsRequest) Reset() { - *x = RecommendationEventsRequest{} +func (x *WorkloadIdentifiers) Reset() { + *x = WorkloadIdentifiers{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[173] + mi := &file_api_v1_recommendation_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationEventsRequest) String() string { +func (x *WorkloadIdentifiers) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationEventsRequest) ProtoMessage() {} +func (*WorkloadIdentifiers) ProtoMessage() {} -func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[173] +func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[187] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14833,36 +18035,44 @@ func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationEventsRequest.ProtoReflect.Descriptor instead. -func (*RecommendationEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{173} +// Deprecated: Use WorkloadIdentifiers.ProtoReflect.Descriptor instead. +func (*WorkloadIdentifiers) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{187} } -type RecommendationEventsResponse struct { +func (x *WorkloadIdentifiers) GetWorkloads() []*WorkloadIdentifier { + if x != nil { + return x.Workloads + } + return nil +} + +type WorkloadPolicies struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []string `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Workload *WorkloadIdentifier `protobuf:"bytes,1,opt,name=workload,proto3" json:"workload,omitempty"` + Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *RecommendationEventsResponse) Reset() { - *x = RecommendationEventsResponse{} +func (x *WorkloadPolicies) Reset() { + *x = WorkloadPolicies{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[174] + mi := &file_api_v1_recommendation_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationEventsResponse) String() string { +func (x *WorkloadPolicies) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationEventsResponse) ProtoMessage() {} +func (*WorkloadPolicies) ProtoMessage() {} -func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[174] +func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[188] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14873,51 +18083,55 @@ func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationEventsResponse.ProtoReflect.Descriptor instead. -func (*RecommendationEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{174} +// Deprecated: Use WorkloadPolicies.ProtoReflect.Descriptor instead. +func (*WorkloadPolicies) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{188} } -func (x *RecommendationEventsResponse) GetEvents() []string { +func (x *WorkloadPolicies) GetWorkload() *WorkloadIdentifier { if x != nil { - return x.Events + return x.Workload } return nil } -// RetrieveSavingsForWorkloadRequest is used to fetch autoscaling impact information for workloads in a cluster. -type RetrieveSavingsForWorkloadRequest struct { +func (x *WorkloadPolicies) GetPolicies() []*WorkloadRecommendationPolicy { + if x != nil { + return x.Policies + } + return nil +} + +// ListAttachedWorkloadPoliciesRequest is used to fetch all attached workload policies and workloads for a team. +// All parameters except team_id are optional filters. +type ListAttachedWorkloadPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. - StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` - IncludeGetWorkloadResp bool `protobuf:"varint,12,opt,name=include_get_workload_resp,json=includeGetWorkloadResp,proto3" json:"include_get_workload_resp,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. + WorkloadUids []string `protobuf:"bytes,4,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` // Optional list of workload UIDs to filter by specific workloads. } -func (x *RetrieveSavingsForWorkloadRequest) Reset() { - *x = RetrieveSavingsForWorkloadRequest{} +func (x *ListAttachedWorkloadPoliciesRequest) Reset() { + *x = ListAttachedWorkloadPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[175] + mi := &file_api_v1_recommendation_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RetrieveSavingsForWorkloadRequest) String() string { +func (x *ListAttachedWorkloadPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RetrieveSavingsForWorkloadRequest) ProtoMessage() {} +func (*ListAttachedWorkloadPoliciesRequest) ProtoMessage() {} -func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[175] +func (x *ListAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[189] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14928,93 +18142,66 @@ func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use RetrieveSavingsForWorkloadRequest.ProtoReflect.Descriptor instead. -func (*RetrieveSavingsForWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{175} +// Deprecated: Use ListAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{189} } -func (x *RetrieveSavingsForWorkloadRequest) GetTeamId() string { +func (x *ListAttachedWorkloadPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *RetrieveSavingsForWorkloadRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { - if x != nil { - return x.Kind - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { +func (x *ListAttachedWorkloadPoliciesRequest) GetClusterIds() []string { if x != nil { - return x.StartTime + return x.ClusterIds } return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { +func (x *ListAttachedWorkloadPoliciesRequest) GetPolicyIds() []string { if x != nil { - return x.EndTime + return x.PolicyIds } return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { - if x != nil { - return x.IncludeDeleted - } - return false -} - -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeGetWorkloadResp() bool { +func (x *ListAttachedWorkloadPoliciesRequest) GetWorkloadUids() []string { if x != nil { - return x.IncludeGetWorkloadResp + return x.WorkloadUids } - return false + return nil } -type RetrieveSavingsForWorkloadResponse struct { +// ListAttachedWorkloadPoliciesResponse contains all attached policies and workloads with their relationships. +type ListAttachedWorkloadPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Savings *SavingsTimeSeries `protobuf:"bytes,1,opt,name=savings,proto3" json:"savings,omitempty"` - GetWorkloadResp *GetWorkloadResponse `protobuf:"bytes,11,opt,name=get_workload_resp,json=getWorkloadResp,proto3,oneof" json:"get_workload_resp,omitempty"` + PolicyMap map[string]*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to WorkloadRecommendationPolicy + WorkloadMap map[string]*WorkloadItem `protobuf:"bytes,2,rep,name=workload_map,json=workloadMap,proto3" json:"workload_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of workload UID to WorkloadItem } -func (x *RetrieveSavingsForWorkloadResponse) Reset() { - *x = RetrieveSavingsForWorkloadResponse{} +func (x *ListAttachedWorkloadPoliciesResponse) Reset() { + *x = ListAttachedWorkloadPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[176] + mi := &file_api_v1_recommendation_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RetrieveSavingsForWorkloadResponse) String() string { +func (x *ListAttachedWorkloadPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} +func (*ListAttachedWorkloadPoliciesResponse) ProtoMessage() {} -func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[176] +func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[190] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15025,51 +18212,55 @@ func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use RetrieveSavingsForWorkloadResponse.ProtoReflect.Descriptor instead. -func (*RetrieveSavingsForWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{176} +// Deprecated: Use ListAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{190} } -func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { +func (x *ListAttachedWorkloadPoliciesResponse) GetPolicyMap() map[string]*WorkloadRecommendationPolicy { if x != nil { - return x.Savings + return x.PolicyMap } return nil } -func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { +func (x *ListAttachedWorkloadPoliciesResponse) GetWorkloadMap() map[string]*WorkloadItem { if x != nil { - return x.GetWorkloadResp + return x.WorkloadMap } return nil } -type CreateNodePoliciesRequest struct { +// ListAttachedNodeGroupPoliciesRequest is used to fetch all attached node group policies and node groups for a team. +// All parameters except team_id are optional filters. +type ListAttachedNodeGroupPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Policies []*NodePolicy `protobuf:"bytes,11,rep,name=policies,proto3" json:"policies,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. + NodeGroupNames []string `protobuf:"bytes,4,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional list of node group names to filter by specific node groups. } -func (x *CreateNodePoliciesRequest) Reset() { - *x = CreateNodePoliciesRequest{} +func (x *ListAttachedNodeGroupPoliciesRequest) Reset() { + *x = ListAttachedNodeGroupPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[177] + mi := &file_api_v1_recommendation_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePoliciesRequest) String() string { +func (x *ListAttachedNodeGroupPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePoliciesRequest) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesRequest) ProtoMessage() {} -func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[177] +func (x *ListAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[191] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15080,98 +18271,66 @@ func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePoliciesRequest.ProtoReflect.Descriptor instead. -func (*CreateNodePoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{177} +// Deprecated: Use ListAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{191} } -func (x *CreateNodePoliciesRequest) GetTeamId() string { +func (x *ListAttachedNodeGroupPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { +func (x *ListAttachedNodeGroupPoliciesRequest) GetClusterIds() []string { if x != nil { - return x.Policies + return x.ClusterIds } return nil } -type CreateNodePoliciesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` -} - -func (x *CreateNodePoliciesResponse) Reset() { - *x = CreateNodePoliciesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[178] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateNodePoliciesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateNodePoliciesResponse) ProtoMessage() {} - -func (x *CreateNodePoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[178] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListAttachedNodeGroupPoliciesRequest) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateNodePoliciesResponse.ProtoReflect.Descriptor instead. -func (*CreateNodePoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{178} + return nil } -func (x *CreateNodePoliciesResponse) GetPolicies() []*NodePolicy { +func (x *ListAttachedNodeGroupPoliciesRequest) GetNodeGroupNames() []string { if x != nil { - return x.Policies + return x.NodeGroupNames } return nil } -type SuggestedNodePolicyRequest struct { +// ListAttachedNodeGroupPoliciesResponse contains all attached policies and node groups with their relationships. +type ListAttachedNodeGroupPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyMap map[string]*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to NodeGroupRecommendationPolicy + NodeGroupMap map[string]*NodeGroupItem `protobuf:"bytes,2,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of node group name to NodeGroupItem } -func (x *SuggestedNodePolicyRequest) Reset() { - *x = SuggestedNodePolicyRequest{} +func (x *ListAttachedNodeGroupPoliciesResponse) Reset() { + *x = ListAttachedNodeGroupPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[179] + mi := &file_api_v1_recommendation_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyRequest) String() string { +func (x *ListAttachedNodeGroupPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyRequest) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesResponse) ProtoMessage() {} -func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[179] +func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[192] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15182,50 +18341,53 @@ func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*SuggestedNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{179} +// Deprecated: Use ListAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{192} } -func (x *SuggestedNodePolicyRequest) GetTeamId() string { +func (x *ListAttachedNodeGroupPoliciesResponse) GetPolicyMap() map[string]*NodeGroupRecommendationPolicy { if x != nil { - return x.TeamId + return x.PolicyMap } - return "" + return nil } -func (x *SuggestedNodePolicyRequest) GetClusterId() string { +func (x *ListAttachedNodeGroupPoliciesResponse) GetNodeGroupMap() map[string]*NodeGroupItem { if x != nil { - return x.ClusterId + return x.NodeGroupMap } - return "" + return nil } -type SuggestedNodePolicyResponse struct { +// NodeGroupItem represents a node group and its policy attachments. +type NodeGroupItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster ID where the node group exists. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this node group. } -func (x *SuggestedNodePolicyResponse) Reset() { - *x = SuggestedNodePolicyResponse{} +func (x *NodeGroupItem) Reset() { + *x = NodeGroupItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[180] + mi := &file_api_v1_recommendation_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyResponse) String() string { +func (x *NodeGroupItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyResponse) ProtoMessage() {} +func (*NodeGroupItem) ProtoMessage() {} -func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[180] +func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[193] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15236,47 +18398,60 @@ func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*SuggestedNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{180} +// Deprecated: Use NodeGroupItem.ProtoReflect.Descriptor instead. +func (*NodeGroupItem) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} } -func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { +func (x *NodeGroupItem) GetName() string { if x != nil { - return x.Policy + return x.Name + } + return "" +} + +func (x *NodeGroupItem) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *NodeGroupItem) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds } return nil } -type GenerateNodePoliciesFromKarpenterRequest struct { +type RecommendationAppliedRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - // When true, the generated policies will be saved to the database - // and node policy targets will be created for each policy (with enabled=false). - PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload } -func (x *GenerateNodePoliciesFromKarpenterRequest) Reset() { - *x = GenerateNodePoliciesFromKarpenterRequest{} +func (x *RecommendationAppliedRequest) Reset() { + *x = RecommendationAppliedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[181] + mi := &file_api_v1_recommendation_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { +func (x *RecommendationAppliedRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} +func (*RecommendationAppliedRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[181] +func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[194] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15287,59 +18462,62 @@ func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromKarpenterRequest.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromKarpenterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{181} +// Deprecated: Use RecommendationAppliedRequest.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{194} } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { +func (x *RecommendationAppliedRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { +func (x *RecommendationAppliedRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { +func (x *RecommendationAppliedRequest) GetRecommendationId() string { if x != nil { - return x.PersistPolicies + return x.RecommendationId } - return false + return "" } -type GenerateNodePoliciesFromKarpenterResponse struct { +func (x *RecommendationAppliedRequest) GetKind() K8SObjectKind { + if x != nil && x.Kind != nil { + return *x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +type RecommendationAppliedResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` - // Targets created when persist_policies is true - Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GenerateNodePoliciesFromKarpenterResponse) Reset() { - *x = GenerateNodePoliciesFromKarpenterResponse{} +func (x *RecommendationAppliedResponse) Reset() { + *x = RecommendationAppliedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[182] + mi := &file_api_v1_recommendation_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { +func (x *RecommendationAppliedResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} +func (*RecommendationAppliedResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[182] +func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[195] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15350,54 +18528,44 @@ func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromKarpenterResponse.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromKarpenterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{182} -} - -func (x *GenerateNodePoliciesFromKarpenterResponse) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *GenerateNodePoliciesFromKarpenterResponse) GetTargets() []*NodePolicyTarget { - if x != nil { - return x.Targets - } - return nil +// Deprecated: Use RecommendationAppliedResponse.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{195} } -type GenerateNodePoliciesFromNodeGroupsRequest struct { +type ApplyRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - // When true, the generated policies will be saved to the database - // and node policy targets will be created for each policy (with enabled=false). - PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload + // If true, generate a WorkloadRule instead of applying the recommendation directly. + // This is used when the policy has EnableInClusterMpa enabled, allowing the in-cluster + // MPA controller to evaluate the rule and generate recommendations locally. + GenerateRule bool `protobuf:"varint,13,opt,name=generate_rule,json=generateRule,proto3" json:"generate_rule,omitempty"` + WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,14,opt,name=workload_recommendation,json=workloadRecommendation,proto3,oneof" json:"workload_recommendation,omitempty"` } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsRequest{} +func (x *ApplyRecommendationRequest) Reset() { + *x = ApplyRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[183] + mi := &file_api_v1_recommendation_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { +func (x *ApplyRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} +func (*ApplyRecommendationRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[183] +func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[196] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15408,59 +18576,76 @@ func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{183} +// Deprecated: Use ApplyRecommendationRequest.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{196} } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { +func (x *ApplyRecommendationRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { +func (x *ApplyRecommendationRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetPersistPolicies() bool { +func (x *ApplyRecommendationRequest) GetRecommendationId() string { if x != nil { - return x.PersistPolicies + return x.RecommendationId + } + return "" +} + +func (x *ApplyRecommendationRequest) GetKind() K8SObjectKind { + if x != nil && x.Kind != nil { + return *x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +func (x *ApplyRecommendationRequest) GetGenerateRule() bool { + if x != nil { + return x.GenerateRule } return false } -type GenerateNodePoliciesFromNodeGroupsResponse struct { +func (x *ApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { + if x != nil { + return x.WorkloadRecommendation + } + return nil +} + +type ApplyRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` - Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` - Warnings []*WorkloadCompatibilityWarning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsResponse{} +func (x *ApplyRecommendationResponse) Reset() { + *x = ApplyRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[184] + mi := &file_api_v1_recommendation_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { +func (x *ApplyRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} +func (*ApplyRecommendationResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[184] +func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[197] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15471,58 +18656,34 @@ func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{184} -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetTargets() []*NodePolicyTarget { - if x != nil { - return x.Targets - } - return nil -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetWarnings() []*WorkloadCompatibilityWarning { - if x != nil { - return x.Warnings - } - return nil +// Deprecated: Use ApplyRecommendationResponse.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{197} } -type GetNodeAnnotationReadinessRequest struct { +type RecommendationEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetNodeAnnotationReadinessRequest) Reset() { - *x = GetNodeAnnotationReadinessRequest{} +func (x *RecommendationEventsRequest) Reset() { + *x = RecommendationEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[185] + mi := &file_api_v1_recommendation_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessRequest) String() string { +func (x *RecommendationEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessRequest) ProtoMessage() {} +func (*RecommendationEventsRequest) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[185] +func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[198] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15533,58 +18694,91 @@ func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeAnnotationReadinessRequest.ProtoReflect.Descriptor instead. -func (*GetNodeAnnotationReadinessRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{185} +// Deprecated: Use RecommendationEventsRequest.ProtoReflect.Descriptor instead. +func (*RecommendationEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{198} } -func (x *GetNodeAnnotationReadinessRequest) GetTeamId() string { - if x != nil { - return x.TeamId +type RecommendationEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []string `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +} + +func (x *RecommendationEventsResponse) Reset() { + *x = RecommendationEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[199] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *GetNodeAnnotationReadinessRequest) GetClusterId() string { +func (x *RecommendationEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecommendationEventsResponse) ProtoMessage() {} + +func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[199] + 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 RecommendationEventsResponse.ProtoReflect.Descriptor instead. +func (*RecommendationEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{199} +} + +func (x *RecommendationEventsResponse) GetEvents() []string { if x != nil { - return x.ClusterId + return x.Events } - return "" + return nil } -type GetNodeAnnotationReadinessResponse struct { +// RetrieveSavingsForWorkloadRequest is used to fetch autoscaling impact information for workloads in a cluster. +type RetrieveSavingsForWorkloadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TotalNodes int32 `protobuf:"varint,1,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` - AnnotatedNodes int32 `protobuf:"varint,2,opt,name=annotated_nodes,json=annotatedNodes,proto3" json:"annotated_nodes,omitempty"` - UnannotatedNodes int32 `protobuf:"varint,3,opt,name=unannotated_nodes,json=unannotatedNodes,proto3" json:"unannotated_nodes,omitempty"` - Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` - UnannotatedNodeNames []string `protobuf:"bytes,5,rep,name=unannotated_node_names,json=unannotatedNodeNames,proto3" json:"unannotated_node_names,omitempty"` - // supported is false when the cluster's cloud provider has no annotation - // schema yet (Azure / OCI today). The wizard renders a clear "not - // supported" state instead of polling indefinitely. - Supported bool `protobuf:"varint,6,opt,name=supported,proto3" json:"supported,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. + StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + IncludeGetWorkloadResp bool `protobuf:"varint,12,opt,name=include_get_workload_resp,json=includeGetWorkloadResp,proto3" json:"include_get_workload_resp,omitempty"` } -func (x *GetNodeAnnotationReadinessResponse) Reset() { - *x = GetNodeAnnotationReadinessResponse{} +func (x *RetrieveSavingsForWorkloadRequest) Reset() { + *x = RetrieveSavingsForWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[186] + mi := &file_api_v1_recommendation_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessResponse) String() string { +func (x *RetrieveSavingsForWorkloadRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessResponse) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadRequest) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[186] +func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[200] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15595,80 +18789,93 @@ func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeAnnotationReadinessResponse.ProtoReflect.Descriptor instead. -func (*GetNodeAnnotationReadinessResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{186} +// Deprecated: Use RetrieveSavingsForWorkloadRequest.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{200} } -func (x *GetNodeAnnotationReadinessResponse) GetTotalNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetTeamId() string { if x != nil { - return x.TotalNodes + return x.TeamId } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetAnnotatedNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetClusterId() string { if x != nil { - return x.AnnotatedNodes + return x.ClusterId } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { if x != nil { - return x.UnannotatedNodes + return x.Kind } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetReady() bool { +func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { if x != nil { - return x.Ready + return x.Uid } - return false + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodeNames() []string { +func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.UnannotatedNodeNames + return x.StartTime } return nil } -func (x *GetNodeAnnotationReadinessResponse) GetSupported() bool { +func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Supported + return x.EndTime + } + return nil +} + +func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted } return false } -// Migration wizard state -type GetMigrationStateRequest struct { +func (x *RetrieveSavingsForWorkloadRequest) GetIncludeGetWorkloadResp() bool { + if x != nil { + return x.IncludeGetWorkloadResp + } + return false +} + +type RetrieveSavingsForWorkloadResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Savings *SavingsTimeSeries `protobuf:"bytes,1,opt,name=savings,proto3" json:"savings,omitempty"` + GetWorkloadResp *GetWorkloadResponse `protobuf:"bytes,11,opt,name=get_workload_resp,json=getWorkloadResp,proto3,oneof" json:"get_workload_resp,omitempty"` } -func (x *GetMigrationStateRequest) Reset() { - *x = GetMigrationStateRequest{} +func (x *RetrieveSavingsForWorkloadResponse) Reset() { + *x = RetrieveSavingsForWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[187] + mi := &file_api_v1_recommendation_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateRequest) String() string { +func (x *RetrieveSavingsForWorkloadResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateRequest) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} -func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[187] +func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[201] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15679,56 +18886,51 @@ func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMigrationStateRequest.ProtoReflect.Descriptor instead. -func (*GetMigrationStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{187} +// Deprecated: Use RetrieveSavingsForWorkloadResponse.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{201} } -func (x *GetMigrationStateRequest) GetTeamId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { if x != nil { - return x.TeamId + return x.Savings } - return "" + return nil } -func (x *GetMigrationStateRequest) GetClusterId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { if x != nil { - return x.ClusterId + return x.GetWorkloadResp } - return "" + return nil } -type GetMigrationStateResponse struct { +type CreateNodePoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` - StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,11,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetMigrationStateResponse) Reset() { - *x = GetMigrationStateResponse{} +func (x *CreateNodePoliciesRequest) Reset() { + *x = CreateNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[188] + mi := &file_api_v1_recommendation_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateResponse) String() string { +func (x *CreateNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateResponse) ProtoMessage() {} +func (*CreateNodePoliciesRequest) ProtoMessage() {} -func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[188] +func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[202] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15739,89 +18941,98 @@ func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMigrationStateResponse.ProtoReflect.Descriptor instead. -func (*GetMigrationStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{188} +// Deprecated: Use CreateNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{202} } -func (x *GetMigrationStateResponse) GetId() string { +func (x *CreateNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.Id + return x.TeamId } return "" } -func (x *GetMigrationStateResponse) GetClusterId() string { +func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { if x != nil { - return x.ClusterId + return x.Policies } - return "" + return nil } -func (x *GetMigrationStateResponse) GetStatus() string { - if x != nil { - return x.Status - } - return "" +type CreateNodePoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetMigrationStateResponse) GetCurrentStep() int32 { - if x != nil { - return x.CurrentStep +func (x *CreateNodePoliciesResponse) Reset() { + *x = CreateNodePoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[203] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *GetMigrationStateResponse) GetStateJson() string { - if x != nil { - return x.StateJson - } - return "" +func (x *CreateNodePoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *GetMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (*CreateNodePoliciesResponse) ProtoMessage() {} + +func (x *CreateNodePoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[203] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { +// Deprecated: Use CreateNodePoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateNodePoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{203} +} + +func (x *CreateNodePoliciesResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.UpdatedAt + return x.Policies } return nil } -type UpdateMigrationStateRequest struct { +type SuggestedNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` - StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *UpdateMigrationStateRequest) Reset() { - *x = UpdateMigrationStateRequest{} +func (x *SuggestedNodePolicyRequest) Reset() { + *x = SuggestedNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[189] + mi := &file_api_v1_recommendation_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateRequest) String() string { +func (x *SuggestedNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateRequest) ProtoMessage() {} +func (*SuggestedNodePolicyRequest) ProtoMessage() {} -func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[189] +func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[204] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15832,71 +19043,50 @@ func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateMigrationStateRequest.ProtoReflect.Descriptor instead. -func (*UpdateMigrationStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{189} +// Deprecated: Use SuggestedNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{204} } -func (x *UpdateMigrationStateRequest) GetTeamId() string { +func (x *SuggestedNodePolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateMigrationStateRequest) GetClusterId() string { +func (x *SuggestedNodePolicyRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *UpdateMigrationStateRequest) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *UpdateMigrationStateRequest) GetCurrentStep() int32 { - if x != nil { - return x.CurrentStep - } - return 0 -} - -func (x *UpdateMigrationStateRequest) GetStateJson() string { - if x != nil { - return x.StateJson - } - return "" -} - -type UpdateMigrationStateResponse struct { +type SuggestedNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *UpdateMigrationStateResponse) Reset() { - *x = UpdateMigrationStateResponse{} +func (x *SuggestedNodePolicyResponse) Reset() { + *x = SuggestedNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[190] + mi := &file_api_v1_recommendation_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateResponse) String() string { +func (x *SuggestedNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateResponse) ProtoMessage() {} +func (*SuggestedNodePolicyResponse) ProtoMessage() {} -func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[190] +func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[205] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15907,49 +19097,47 @@ func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateMigrationStateResponse.ProtoReflect.Descriptor instead. -func (*UpdateMigrationStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{190} +// Deprecated: Use SuggestedNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{205} } -func (x *UpdateMigrationStateResponse) GetId() string { +func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.Id + return x.Policy } - return "" + return nil } -// NodePool validation -type ReportNodePoolValidationRequest struct { +type GenerateNodePoliciesFromKarpenterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - NodepoolName string `protobuf:"bytes,2,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` - NodeName string `protobuf:"bytes,3,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - Zone string `protobuf:"bytes,5,opt,name=zone,proto3" json:"zone,omitempty"` - TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // When true, the generated policies will be saved to the database + // and node policy targets will be created for each policy (with enabled=false). + PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` } -func (x *ReportNodePoolValidationRequest) Reset() { - *x = ReportNodePoolValidationRequest{} +func (x *GenerateNodePoliciesFromKarpenterRequest) Reset() { + *x = GenerateNodePoliciesFromKarpenterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[191] + mi := &file_api_v1_recommendation_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationRequest) String() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} -func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[191] +func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[206] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15960,76 +19148,59 @@ func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReportNodePoolValidationRequest.ProtoReflect.Descriptor instead. -func (*ReportNodePoolValidationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{191} -} - -func (x *ReportNodePoolValidationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *ReportNodePoolValidationRequest) GetNodepoolName() string { - if x != nil { - return x.NodepoolName - } - return "" -} - -func (x *ReportNodePoolValidationRequest) GetNodeName() string { - if x != nil { - return x.NodeName - } - return "" +// Deprecated: Use GenerateNodePoliciesFromKarpenterRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{206} } -func (x *ReportNodePoolValidationRequest) GetInstanceType() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { if x != nil { - return x.InstanceType + return x.TeamId } return "" } -func (x *ReportNodePoolValidationRequest) GetZone() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { if x != nil { - return x.Zone + return x.ClusterId } return "" } -func (x *ReportNodePoolValidationRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { if x != nil { - return x.TeamId + return x.PersistPolicies } - return "" + return false } -type ReportNodePoolValidationResponse struct { +type GenerateNodePoliciesFromKarpenterResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // Targets created when persist_policies is true + Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *ReportNodePoolValidationResponse) Reset() { - *x = ReportNodePoolValidationResponse{} +func (x *GenerateNodePoliciesFromKarpenterResponse) Reset() { + *x = GenerateNodePoliciesFromKarpenterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[192] + mi := &file_api_v1_recommendation_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationResponse) String() string { +func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationResponse) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} -func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[192] +func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[207] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16040,37 +19211,54 @@ func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReportNodePoolValidationResponse.ProtoReflect.Descriptor instead. -func (*ReportNodePoolValidationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{192} +// Deprecated: Use GenerateNodePoliciesFromKarpenterResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{207} } -type GetNodePoolValidationsRequest struct { +func (x *GenerateNodePoliciesFromKarpenterResponse) GetPolicies() []*NodePolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *GenerateNodePoliciesFromKarpenterResponse) GetTargets() []*NodePolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type GenerateNodePoliciesFromNodeGroupsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // When true, the generated policies will be saved to the database + // and node policy targets will be created for each policy (with enabled=false). + PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` } -func (x *GetNodePoolValidationsRequest) Reset() { - *x = GetNodePoolValidationsRequest{} +func (x *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[193] + mi := &file_api_v1_recommendation_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodePoolValidationsRequest) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodePoolValidationsRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} -func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[193] +func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[208] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16081,54 +19269,67 @@ func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. -func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{208} } -func (x *GetNodePoolValidationsRequest) GetClusterId() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { if x != nil { - return x.ClusterId + return x.TeamId } return "" } -func (x *GetNodePoolValidationsRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { if x != nil { - return x.TeamId + return x.ClusterId } return "" } -type NodePoolValidationReport struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NodepoolName string `protobuf:"bytes,1,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` - NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - Zone string `protobuf:"bytes,4,opt,name=zone,proto3" json:"zone,omitempty"` - ReportedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=reported_at,json=reportedAt,proto3" json:"reported_at,omitempty"` +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetPersistPolicies() bool { + if x != nil { + return x.PersistPolicies + } + return false } -func (x *NodePoolValidationReport) Reset() { - *x = NodePoolValidationReport{} +type GenerateNodePoliciesFromNodeGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` + Warnings []*WorkloadCompatibilityWarning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` + // eligibility carries per-node-group "may this be migrated?" information + // computed from the current node observations. The wizard reads this to + // disable Step 3 rows for groups the operator must NOT migrate, with a + // tooltip explaining why. Keyed by group name (matches NodePolicy.name) + // and populated for every discovered group — including groups that are + // already managed by an existing node policy, which carry the + // "already_migrated" reason and have NO corresponding entry in policies. + Eligibility []*NodeGroupMigrationEligibility `protobuf:"bytes,4,rep,name=eligibility,proto3" json:"eligibility,omitempty"` +} + +func (x *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[194] + mi := &file_api_v1_recommendation_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePoolValidationReport) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePoolValidationReport) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} -func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[194] +func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[209] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16139,71 +19340,187 @@ func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePoolValidationReport.ProtoReflect.Descriptor instead. -func (*NodePoolValidationReport) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{194} +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{209} } -func (x *NodePoolValidationReport) GetNodepoolName() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.NodepoolName + return x.Policies } - return "" + return nil } -func (x *NodePoolValidationReport) GetNodeName() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.NodeName + return x.Targets } - return "" + return nil } -func (x *NodePoolValidationReport) GetInstanceType() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetWarnings() []*WorkloadCompatibilityWarning { if x != nil { - return x.InstanceType + return x.Warnings } - return "" + return nil } -func (x *NodePoolValidationReport) GetZone() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetEligibility() []*NodeGroupMigrationEligibility { if x != nil { - return x.Zone + return x.Eligibility + } + return nil +} + +// NodeGroupMigrationEligibility flags a node group as not-safe-to-migrate +// for the CAS-migration wizard. Eligibility is preview-time only — it +// describes the *current* state of the source pool, not a property of the +// generated NodePolicy, so it's surfaced alongside the policies rather +// than embedded in NodePolicy itself. +type NodeGroupMigrationEligibility struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // group_name matches NodePolicy.name (the source node group's name). + GroupName string `protobuf:"bytes,1,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` + // migratable=false means the wizard MUST disable this row in Step 3 + // (BLOCKING reason present). True (or absent) means safe-to-migrate; + // an ADVISORY reason may still be present, in which case the wizard + // should show a non-blocking yellow caveat next to the row. + Migratable bool `protobuf:"varint,2,opt,name=migratable,proto3" json:"migratable,omitempty"` + // reasons documents why migration is blocked OR carries caveats. + // Stable identifier strings the wizard maps to human-readable messages. + // + // Blocking reasons (force migratable=false; row is disabled): + // + // "system_pool" — AKS pool with kubernetes.azure.com/mode=system + // or GKE pool with cloud.google.com/gke-system-only=true + // or the GKE system-only taint + // (CriticalAddonsOnly=true:NoSchedule). AKS + // requires ≥1 System pool to keep kube-system + // schedulable; draining the last one bricks + // the control plane. + // "karpenter_ops_pool" — pool labelled devzero.io/karpenter-ops-pool=true + // by dz-installer (setup-azure.sh / + // setup-gcp.sh). Migrating the pool that runs + // karpenter itself is a chicken-and-egg — + // karpenter would have to drain itself. + // "azure_sku_restricted" — source pool runs an AKS-restricted VM size + // (Basic A-series, B1s/B1ms, F1/F1s, + // A0/A1/A1_v2). kp-azure refuses to provision + // these. No workaround at the policy layer. + // "azure_sku_confidential" — source pool runs a Confidential Compute + // SKU (DC* / EC*). kp-azure's isConfidential + // predicate excludes these. + // "already_migrated" — the group is already managed by a live node + // policy with a live target scoped to this + // cluster. Unlike the other reasons, such + // groups are excluded from the policies list + // entirely (regenerating would create a + // duplicate policy); the entry exists so the + // UI can explain why the group is absent. + // + // Advisory reasons (migratable stays true; show as caveat): + // + // "azure_sku_nvme_under_cig" — source pool's SKU is NVMe-only + // (Standard_D*ads_v6 / D*alds_v6 / E*ads_v6 etc). + // kp-azure's default CIG image source isn't + // NVMe-tagged, so the controller filters these + // SKUs out of its catalog. Migration still + // works because the generated NodePool only + // requires sku-family (instance-category) — + // karpenter picks a compatible non-NVMe SKU + // from the same family. Operator should know + // the launched nodes won't exactly match the + // source pool. + // "cast_ai_live_migration_pool" — the group hosts cast.ai + // live-migration components, which stop + // working once those components are disabled + // during this migration. + Reasons []string `protobuf:"bytes,3,rep,name=reasons,proto3" json:"reasons,omitempty"` +} + +func (x *NodeGroupMigrationEligibility) Reset() { + *x = NodeGroupMigrationEligibility{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[210] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupMigrationEligibility) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupMigrationEligibility) ProtoMessage() {} + +func (x *NodeGroupMigrationEligibility) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[210] + 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 NodeGroupMigrationEligibility.ProtoReflect.Descriptor instead. +func (*NodeGroupMigrationEligibility) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{210} +} + +func (x *NodeGroupMigrationEligibility) GetGroupName() string { + if x != nil { + return x.GroupName } return "" } -func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { +func (x *NodeGroupMigrationEligibility) GetMigratable() bool { if x != nil { - return x.ReportedAt + return x.Migratable + } + return false +} + +func (x *NodeGroupMigrationEligibility) GetReasons() []string { + if x != nil { + return x.Reasons } return nil } -type GetNodePoolValidationsResponse struct { +type GetNodeAnnotationReadinessRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Validations []*NodePoolValidationReport `protobuf:"bytes,1,rep,name=validations,proto3" json:"validations,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetNodePoolValidationsResponse) Reset() { - *x = GetNodePoolValidationsResponse{} +func (x *GetNodeAnnotationReadinessRequest) Reset() { + *x = GetNodeAnnotationReadinessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[195] + mi := &file_api_v1_recommendation_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodePoolValidationsResponse) String() string { +func (x *GetNodeAnnotationReadinessRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodePoolValidationsResponse) ProtoMessage() {} +func (*GetNodeAnnotationReadinessRequest) ProtoMessage() {} -func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[195] +func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[211] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16214,47 +19531,67 @@ func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodePoolValidationsResponse.ProtoReflect.Descriptor instead. -func (*GetNodePoolValidationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{195} +// Deprecated: Use GetNodeAnnotationReadinessRequest.ProtoReflect.Descriptor instead. +func (*GetNodeAnnotationReadinessRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{211} } -func (x *GetNodePoolValidationsResponse) GetValidations() []*NodePoolValidationReport { +func (x *GetNodeAnnotationReadinessRequest) GetTeamId() string { if x != nil { - return x.Validations + return x.TeamId } - return nil + return "" } -type WorkloadCompatibilityWarning struct { +func (x *GetNodeAnnotationReadinessRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type GetNodeAnnotationReadinessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadName string `protobuf:"bytes,1,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - WorkloadNamespace string `protobuf:"bytes,2,opt,name=workload_namespace,json=workloadNamespace,proto3" json:"workload_namespace,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - NodeGroup string `protobuf:"bytes,4,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` - Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + TotalNodes int32 `protobuf:"varint,1,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` + AnnotatedNodes int32 `protobuf:"varint,2,opt,name=annotated_nodes,json=annotatedNodes,proto3" json:"annotated_nodes,omitempty"` + UnannotatedNodes int32 `protobuf:"varint,3,opt,name=unannotated_nodes,json=unannotatedNodes,proto3" json:"unannotated_nodes,omitempty"` + Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` + UnannotatedNodeNames []string `protobuf:"bytes,5,rep,name=unannotated_node_names,json=unannotatedNodeNames,proto3" json:"unannotated_node_names,omitempty"` + // supported is false when the cluster's cloud provider has no annotation + // schema yet (OCI today). The wizard renders a clear "not supported" + // state instead of polling indefinitely. + Supported bool `protobuf:"varint,6,opt,name=supported,proto3" json:"supported,omitempty"` + // aks_cluster_resource_group is the resource group that hosts the AKS + // managed-cluster resource (NOT the MC_* node RG). Surfaced here so the + // wizard's Step 5 / Step 7 commands (`az aks nodepool update/scale`) + // can drop the placeholder. Populated from + // devzero.io/azure-aks-cluster-rg on any annotated node. Empty when + // the cluster isn't Azure or when the controller wasn't configured + // with ARM_RESOURCE_GROUP — in either case the wizard falls back to + // the placeholder. + AksClusterResourceGroup string `protobuf:"bytes,7,opt,name=aks_cluster_resource_group,json=aksClusterResourceGroup,proto3" json:"aks_cluster_resource_group,omitempty"` } -func (x *WorkloadCompatibilityWarning) Reset() { - *x = WorkloadCompatibilityWarning{} +func (x *GetNodeAnnotationReadinessResponse) Reset() { + *x = GetNodeAnnotationReadinessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[196] + mi := &file_api_v1_recommendation_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadCompatibilityWarning) String() string { +func (x *GetNodeAnnotationReadinessResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadCompatibilityWarning) ProtoMessage() {} +func (*GetNodeAnnotationReadinessResponse) ProtoMessage() {} -func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[196] +func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[212] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16265,71 +19602,86 @@ func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadCompatibilityWarning.ProtoReflect.Descriptor instead. -func (*WorkloadCompatibilityWarning) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{196} +// Deprecated: Use GetNodeAnnotationReadinessResponse.ProtoReflect.Descriptor instead. +func (*GetNodeAnnotationReadinessResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{212} } -func (x *WorkloadCompatibilityWarning) GetWorkloadName() string { +func (x *GetNodeAnnotationReadinessResponse) GetTotalNodes() int32 { if x != nil { - return x.WorkloadName + return x.TotalNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetWorkloadNamespace() string { +func (x *GetNodeAnnotationReadinessResponse) GetAnnotatedNodes() int32 { if x != nil { - return x.WorkloadNamespace + return x.AnnotatedNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetKind() string { +func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodes() int32 { if x != nil { - return x.Kind + return x.UnannotatedNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetNodeGroup() string { +func (x *GetNodeAnnotationReadinessResponse) GetReady() bool { if x != nil { - return x.NodeGroup + return x.Ready } - return "" + return false } -func (x *WorkloadCompatibilityWarning) GetReason() string { +func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodeNames() []string { if x != nil { - return x.Reason + return x.UnannotatedNodeNames + } + return nil +} + +func (x *GetNodeAnnotationReadinessResponse) GetSupported() bool { + if x != nil { + return x.Supported + } + return false +} + +func (x *GetNodeAnnotationReadinessResponse) GetAksClusterResourceGroup() string { + if x != nil { + return x.AksClusterResourceGroup } return "" } -type ListNodePoliciesRequest struct { +type DetectClusterAutoscalerRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *ListNodePoliciesRequest) Reset() { - *x = ListNodePoliciesRequest{} +func (x *DetectClusterAutoscalerRequest) Reset() { + *x = DetectClusterAutoscalerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[197] + mi := &file_api_v1_recommendation_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePoliciesRequest) String() string { +func (x *DetectClusterAutoscalerRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePoliciesRequest) ProtoMessage() {} +func (*DetectClusterAutoscalerRequest) ProtoMessage() {} -func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[197] +func (x *DetectClusterAutoscalerRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[213] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16340,43 +19692,58 @@ func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListNodePoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{197} +// Deprecated: Use DetectClusterAutoscalerRequest.ProtoReflect.Descriptor instead. +func (*DetectClusterAutoscalerRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{213} } -func (x *ListNodePoliciesRequest) GetTeamId() string { +func (x *DetectClusterAutoscalerRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -type ListNodePoliciesResponse struct { +func (x *DetectClusterAutoscalerRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type DetectClusterAutoscalerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // One of: karpenter | cluster_autoscaler | cast_ai | transitioning | unmanaged. + // Plain string (not an enum) so new families ship without a proto bump, + // matching node_scheduling_health.proto's autoscaler_type convention. + AutoscalerType string `protobuf:"bytes,1,opt,name=autoscaler_type,json=autoscalerType,proto3" json:"autoscaler_type,omitempty"` + // Per-family raw booleans so the wizard can pick the SOURCE autoscaler even + // while autoscaler_type reads transitioning (mid-migration both are live). + HasKarpenter bool `protobuf:"varint,2,opt,name=has_karpenter,json=hasKarpenter,proto3" json:"has_karpenter,omitempty"` + HasClusterAutoscaler bool `protobuf:"varint,3,opt,name=has_cluster_autoscaler,json=hasClusterAutoscaler,proto3" json:"has_cluster_autoscaler,omitempty"` + HasCastAi bool `protobuf:"varint,4,opt,name=has_cast_ai,json=hasCastAi,proto3" json:"has_cast_ai,omitempty"` } -func (x *ListNodePoliciesResponse) Reset() { - *x = ListNodePoliciesResponse{} +func (x *DetectClusterAutoscalerResponse) Reset() { + *x = DetectClusterAutoscalerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[198] + mi := &file_api_v1_recommendation_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePoliciesResponse) String() string { +func (x *DetectClusterAutoscalerResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePoliciesResponse) ProtoMessage() {} +func (*DetectClusterAutoscalerResponse) ProtoMessage() {} -func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[198] +func (x *DetectClusterAutoscalerResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[214] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16387,44 +19754,66 @@ func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListNodePoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{198} +// Deprecated: Use DetectClusterAutoscalerResponse.ProtoReflect.Descriptor instead. +func (*DetectClusterAutoscalerResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{214} } -func (x *ListNodePoliciesResponse) GetPolicies() []*NodePolicy { +func (x *DetectClusterAutoscalerResponse) GetAutoscalerType() string { if x != nil { - return x.Policies + return x.AutoscalerType } - return nil + return "" } -type UpdateNodePolicyRequest struct { +func (x *DetectClusterAutoscalerResponse) GetHasKarpenter() bool { + if x != nil { + return x.HasKarpenter + } + return false +} + +func (x *DetectClusterAutoscalerResponse) GetHasClusterAutoscaler() bool { + if x != nil { + return x.HasClusterAutoscaler + } + return false +} + +func (x *DetectClusterAutoscalerResponse) GetHasCastAi() bool { + if x != nil { + return x.HasCastAi + } + return false +} + +// Migration wizard state +type GetMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Policy *NodePolicy `protobuf:"bytes,11,opt,name=policy,proto3" json:"policy,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *UpdateNodePolicyRequest) Reset() { - *x = UpdateNodePolicyRequest{} +func (x *GetMigrationStateRequest) Reset() { + *x = GetMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[199] + mi := &file_api_v1_recommendation_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyRequest) String() string { +func (x *GetMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyRequest) ProtoMessage() {} +func (*GetMigrationStateRequest) ProtoMessage() {} -func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[199] +func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[215] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16435,50 +19824,56 @@ func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{199} +// Deprecated: Use GetMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*GetMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{215} } -func (x *UpdateNodePolicyRequest) GetTeamId() string { +func (x *GetMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateNodePolicyRequest) GetPolicy() *NodePolicy { +func (x *GetMigrationStateRequest) GetClusterId() string { if x != nil { - return x.Policy + return x.ClusterId } - return nil + return "" } -type UpdateNodePolicyResponse struct { +type GetMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *UpdateNodePolicyResponse) Reset() { - *x = UpdateNodePolicyResponse{} +func (x *GetMigrationStateResponse) Reset() { + *x = GetMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[200] + mi := &file_api_v1_recommendation_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyResponse) String() string { +func (x *GetMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyResponse) ProtoMessage() {} +func (*GetMigrationStateResponse) ProtoMessage() {} -func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[200] +func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[216] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16489,44 +19884,89 @@ func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{200} +// Deprecated: Use GetMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*GetMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{216} } -func (x *UpdateNodePolicyResponse) GetPolicy() *NodePolicy { +func (x *GetMigrationStateResponse) GetId() string { if x != nil { - return x.Policy + return x.Id + } + return "" +} + +func (x *GetMigrationStateResponse) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetMigrationStateResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *GetMigrationStateResponse) GetCurrentStep() int32 { + if x != nil { + return x.CurrentStep + } + return 0 +} + +func (x *GetMigrationStateResponse) GetStateJson() string { + if x != nil { + return x.StateJson + } + return "" +} + +func (x *GetMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } return nil } -type DeleteNodePolicyRequest struct { +func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type UpdateMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` } -func (x *DeleteNodePolicyRequest) Reset() { - *x = DeleteNodePolicyRequest{} +func (x *UpdateMigrationStateRequest) Reset() { + *x = UpdateMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[201] + mi := &file_api_v1_recommendation_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyRequest) String() string { +func (x *UpdateMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyRequest) ProtoMessage() {} +func (*UpdateMigrationStateRequest) ProtoMessage() {} -func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[201] +func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[217] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16537,52 +19977,71 @@ func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{201} +// Deprecated: Use UpdateMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{217} } -func (x *DeleteNodePolicyRequest) GetTeamId() string { +func (x *UpdateMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *DeleteNodePolicyRequest) GetPolicyId() string { +func (x *UpdateMigrationStateRequest) GetClusterId() string { if x != nil { - return x.PolicyId + return x.ClusterId } return "" } -type DeleteNodePolicyResponse struct { +func (x *UpdateMigrationStateRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *UpdateMigrationStateRequest) GetCurrentStep() int32 { + if x != nil { + return x.CurrentStep + } + return 0 +} + +func (x *UpdateMigrationStateRequest) GetStateJson() string { + if x != nil { + return x.StateJson + } + return "" +} + +type UpdateMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - // Number of NodePolicyTargets that were cascade-deleted along with the policy. - DeletedTargetCount int32 `protobuf:"varint,2,opt,name=deleted_target_count,json=deletedTargetCount,proto3" json:"deleted_target_count,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *DeleteNodePolicyResponse) Reset() { - *x = DeleteNodePolicyResponse{} +func (x *UpdateMigrationStateResponse) Reset() { + *x = UpdateMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[202] + mi := &file_api_v1_recommendation_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyResponse) String() string { +func (x *UpdateMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyResponse) ProtoMessage() {} +func (*UpdateMigrationStateResponse) ProtoMessage() {} -func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[202] +func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[218] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16593,109 +20052,45 @@ func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{202} -} - -func (x *DeleteNodePolicyResponse) GetSuccess() bool { - if x != nil { - return x.Success - } - return false +// Deprecated: Use UpdateMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{218} } -func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { +func (x *UpdateMigrationStateResponse) GetId() string { if x != nil { - return x.DeletedTargetCount + return x.Id } - return 0 + return "" } -type NodePolicy struct { +// Karpenter migration wizard +type GetKarpenterMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Cross-cloud core - InstanceCategories *LabelSelector `protobuf:"bytes,10,opt,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` // abstract, per-cloud mapping; UI: Family; e.g., D (Azure), m (AWS) - InstanceFamilies *LabelSelector `protobuf:"bytes,11,opt,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` // abstract, per-cloud mapping (c5, m5d, r4, etc) - InstanceCpus *LabelSelector `protobuf:"bytes,12,opt,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` // cpu count in cores (4, 8, 1, 2, etc) - InstanceHypervisors *LabelSelector `protobuf:"bytes,13,opt,name=instance_hypervisors,json=instanceHypervisors,proto3" json:"instance_hypervisors,omitempty"` // self explanatory - InstanceGenerations *LabelSelector `protobuf:"bytes,14,opt,name=instance_generations,json=instanceGenerations,proto3" json:"instance_generations,omitempty"` // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) - InstanceSizes *LabelSelector `protobuf:"bytes,15,opt,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` // UI: Size; eg: Standard_D4s (Azure), large (AWS) - InstanceTypes *LabelSelector `protobuf:"bytes,16,opt,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) - // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per - // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this - // field is silently dropped on the compile path for those providers. - InstanceLocalNvme *LabelSelector `protobuf:"bytes,113,opt,name=instance_local_nvme,json=instanceLocalNvme,proto3" json:"instance_local_nvme,omitempty"` - InstanceCategoriesTip *string `protobuf:"bytes,26,opt,name=instance_categories_tip,json=instanceCategoriesTip,proto3,oneof" json:"instance_categories_tip,omitempty"` - InstanceFamiliesTip *string `protobuf:"bytes,27,opt,name=instance_families_tip,json=instanceFamiliesTip,proto3,oneof" json:"instance_families_tip,omitempty"` - InstanceCpusTip *string `protobuf:"bytes,28,opt,name=instance_cpus_tip,json=instanceCpusTip,proto3,oneof" json:"instance_cpus_tip,omitempty"` - InstanceHypervisorsTip *string `protobuf:"bytes,29,opt,name=instance_hypervisors_tip,json=instanceHypervisorsTip,proto3,oneof" json:"instance_hypervisors_tip,omitempty"` - InstanceGenerationsTip *string `protobuf:"bytes,30,opt,name=instance_generations_tip,json=instanceGenerationsTip,proto3,oneof" json:"instance_generations_tip,omitempty"` - InstanceSizesTip *string `protobuf:"bytes,31,opt,name=instance_sizes_tip,json=instanceSizesTip,proto3,oneof" json:"instance_sizes_tip,omitempty"` - InstanceLocalNvmeTip *string `protobuf:"bytes,114,opt,name=instance_local_nvme_tip,json=instanceLocalNvmeTip,proto3,oneof" json:"instance_local_nvme_tip,omitempty"` - Zones *LabelSelector `protobuf:"bytes,36,opt,name=zones,proto3" json:"zones,omitempty"` // abstract, per-cloud mapping - Architectures *LabelSelector `protobuf:"bytes,37,opt,name=architectures,proto3" json:"architectures,omitempty"` // amd64, arm64 - CapacityTypes *LabelSelector `protobuf:"bytes,38,opt,name=capacity_types,json=capacityTypes,proto3" json:"capacity_types,omitempty"` // spot, on-demand, reserved - OperatingSystems *LabelSelector `protobuf:"bytes,39,opt,name=operating_systems,json=operatingSystems,proto3" json:"operating_systems,omitempty"` // linux, windows - Weight int32 `protobuf:"varint,40,opt,name=weight,proto3" json:"weight,omitempty"` - ZonesTip *string `protobuf:"bytes,45,opt,name=zones_tip,json=zonesTip,proto3,oneof" json:"zones_tip,omitempty"` - ArchitecturesTip *string `protobuf:"bytes,46,opt,name=architectures_tip,json=architecturesTip,proto3,oneof" json:"architectures_tip,omitempty"` - CapacityTypeTip *string `protobuf:"bytes,47,opt,name=capacity_type_tip,json=capacityTypeTip,proto3,oneof" json:"capacity_type_tip,omitempty"` - OperatingSystemsTip *string `protobuf:"bytes,48,opt,name=operating_systems_tip,json=operatingSystemsTip,proto3,oneof" json:"operating_systems_tip,omitempty"` - Labels map[string]string `protobuf:"bytes,51,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Taints []*Taint `protobuf:"bytes,52,rep,name=taints,proto3" json:"taints,omitempty"` - Disruption *DisruptionPolicy `protobuf:"bytes,53,opt,name=disruption,proto3" json:"disruption,omitempty"` - Limits *ResourceLimits `protobuf:"bytes,54,opt,name=limits,proto3" json:"limits,omitempty"` - StartupTaints []*Taint `protobuf:"bytes,55,rep,name=startup_taints,json=startupTaints,proto3" json:"startup_taints,omitempty"` - TaintsTip *string `protobuf:"bytes,57,opt,name=taints_tip,json=taintsTip,proto3,oneof" json:"taints_tip,omitempty"` - DisruptionsTip *string `protobuf:"bytes,58,opt,name=disruptions_tip,json=disruptionsTip,proto3,oneof" json:"disruptions_tip,omitempty"` - LimitsTip *string `protobuf:"bytes,59,opt,name=limits_tip,json=limitsTip,proto3,oneof" json:"limits_tip,omitempty"` - StartupTaintsTip *string `protobuf:"bytes,60,opt,name=startup_taints_tip,json=startupTaintsTip,proto3,oneof" json:"startup_taints_tip,omitempty"` - MasterOverrideRoleName string `protobuf:"bytes,61,opt,name=master_override_role_name,json=masterOverrideRoleName,proto3" json:"master_override_role_name,omitempty"` - NodePoolName string `protobuf:"bytes,71,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` - NodeClassName string `protobuf:"bytes,72,opt,name=node_class_name,json=nodeClassName,proto3" json:"node_class_name,omitempty"` - // Provider-specific overrides - Aws *AWSNodeClassSpec `protobuf:"bytes,81,opt,name=aws,proto3" json:"aws,omitempty"` - Gcp *GCPNodeClassSpec `protobuf:"bytes,82,opt,name=gcp,proto3" json:"gcp,omitempty"` - Azure *AzureNodeClassSpec `protobuf:"bytes,83,opt,name=azure,proto3" json:"azure,omitempty"` - Oci *OCINodeClassSpec `protobuf:"bytes,84,opt,name=oci,proto3" json:"oci,omitempty"` - CloudProviderId *int64 `protobuf:"varint,85,opt,name=cloud_provider_id,json=cloudProviderId,proto3,oneof" json:"cloud_provider_id,omitempty"` - CloudProvider *CloudProvider `protobuf:"bytes,86,opt,name=cloud_provider,json=cloudProvider,proto3" json:"cloud_provider,omitempty"` - // Cloud-agnostic opt-in for AZ outage handling (AWS ARC zonal shift today; - // analogous GCP behavior planned). The compile step translates this to - // provider-specific annotations on the Karpenter NodePool. - ZonalShift *ZonalShiftConfig `protobuf:"bytes,90,opt,name=zonal_shift,json=zonalShift,proto3" json:"zonal_shift,omitempty"` - // Raw escape hatch for node pool - Raw []*RawKarpenterSpec `protobuf:"bytes,100,rep,name=raw,proto3" json:"raw,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *NodePolicy) Reset() { - *x = NodePolicy{} +func (x *GetKarpenterMigrationStateRequest) Reset() { + *x = GetKarpenterMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[203] + mi := &file_api_v1_recommendation_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicy) String() string { +func (x *GetKarpenterMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicy) ProtoMessage() {} +func (*GetKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *NodePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[203] +func (x *GetKarpenterMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[219] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16706,396 +20101,478 @@ func (x *NodePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicy.ProtoReflect.Descriptor instead. -func (*NodePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{203} +// Deprecated: Use GetKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{219} } -func (x *NodePolicy) GetId() string { +func (x *GetKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { - return x.Id + return x.TeamId } return "" } -func (x *NodePolicy) GetName() string { +func (x *GetKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *NodePolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" +type GetKarpenterMigrationStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *NodePolicy) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *GetKarpenterMigrationStateResponse) Reset() { + *x = GetKarpenterMigrationStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[220] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetInstanceCategories() *LabelSelector { - if x != nil { - return x.InstanceCategories - } - return nil +func (x *GetKarpenterMigrationStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { - if x != nil { - return x.InstanceFamilies +func (*GetKarpenterMigrationStateResponse) ProtoMessage() {} + +func (x *GetKarpenterMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[220] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetInstanceCpus() *LabelSelector { +// Deprecated: Use GetKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{220} +} + +func (x *GetKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.InstanceCpus + return x.Id } - return nil + return "" } -func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetClusterId() string { if x != nil { - return x.InstanceHypervisors + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetStatus() string { if x != nil { - return x.InstanceGenerations + return x.Status } - return nil + return "" } -func (x *NodePolicy) GetInstanceSizes() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetCurrentStep() int32 { if x != nil { - return x.InstanceSizes + return x.CurrentStep } - return nil + return 0 } -func (x *NodePolicy) GetInstanceTypes() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetStateJson() string { if x != nil { - return x.InstanceTypes + return x.StateJson } - return nil + return "" } -func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceLocalNvme + return x.CreatedAt } return nil } -func (x *NodePolicy) GetInstanceCategoriesTip() string { - if x != nil && x.InstanceCategoriesTip != nil { - return *x.InstanceCategoriesTip +func (x *GetKarpenterMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt } - return "" + return nil } -func (x *NodePolicy) GetInstanceFamiliesTip() string { - if x != nil && x.InstanceFamiliesTip != nil { - return *x.InstanceFamiliesTip - } - return "" -} +type UpdateKarpenterMigrationStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *NodePolicy) GetInstanceCpusTip() string { - if x != nil && x.InstanceCpusTip != nil { - return *x.InstanceCpusTip - } - return "" + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` } -func (x *NodePolicy) GetInstanceHypervisorsTip() string { - if x != nil && x.InstanceHypervisorsTip != nil { - return *x.InstanceHypervisorsTip +func (x *UpdateKarpenterMigrationStateRequest) Reset() { + *x = UpdateKarpenterMigrationStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[221] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetInstanceGenerationsTip() string { - if x != nil && x.InstanceGenerationsTip != nil { - return *x.InstanceGenerationsTip - } - return "" +func (x *UpdateKarpenterMigrationStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceSizesTip() string { - if x != nil && x.InstanceSizesTip != nil { - return *x.InstanceSizesTip - } - return "" -} +func (*UpdateKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *NodePolicy) GetInstanceLocalNvmeTip() string { - if x != nil && x.InstanceLocalNvmeTip != nil { - return *x.InstanceLocalNvmeTip +func (x *UpdateKarpenterMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[221] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetZones() *LabelSelector { - if x != nil { - return x.Zones - } - return nil +// Deprecated: Use UpdateKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} } -func (x *NodePolicy) GetArchitectures() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { - return x.Architectures + return x.TeamId } - return nil + return "" } -func (x *NodePolicy) GetCapacityTypes() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.CapacityTypes + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetOperatingSystems() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetStatus() string { if x != nil { - return x.OperatingSystems + return x.Status } - return nil + return "" } -func (x *NodePolicy) GetWeight() int32 { +func (x *UpdateKarpenterMigrationStateRequest) GetCurrentStep() int32 { if x != nil { - return x.Weight + return x.CurrentStep } return 0 } -func (x *NodePolicy) GetZonesTip() string { - if x != nil && x.ZonesTip != nil { - return *x.ZonesTip +func (x *UpdateKarpenterMigrationStateRequest) GetStateJson() string { + if x != nil { + return x.StateJson } return "" } -func (x *NodePolicy) GetArchitecturesTip() string { - if x != nil && x.ArchitecturesTip != nil { - return *x.ArchitecturesTip - } - return "" +type UpdateKarpenterMigrationStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *NodePolicy) GetCapacityTypeTip() string { - if x != nil && x.CapacityTypeTip != nil { - return *x.CapacityTypeTip +func (x *UpdateKarpenterMigrationStateResponse) Reset() { + *x = UpdateKarpenterMigrationStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[222] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetOperatingSystemsTip() string { - if x != nil && x.OperatingSystemsTip != nil { - return *x.OperatingSystemsTip - } - return "" +func (x *UpdateKarpenterMigrationStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetLabels() map[string]string { - if x != nil { - return x.Labels +func (*UpdateKarpenterMigrationStateResponse) ProtoMessage() {} + +func (x *UpdateKarpenterMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[222] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetTaints() []*Taint { - if x != nil { - return x.Taints - } - return nil +// Deprecated: Use UpdateKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} } -func (x *NodePolicy) GetDisruption() *DisruptionPolicy { +func (x *UpdateKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.Disruption + return x.Id } - return nil + return "" } -func (x *NodePolicy) GetLimits() *ResourceLimits { - if x != nil { - return x.Limits - } - return nil +type KarpenterOwnershipConflict struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ResourceKind string `protobuf:"bytes,2,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` + ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + OwnerTool string `protobuf:"bytes,4,opt,name=owner_tool,json=ownerTool,proto3" json:"owner_tool,omitempty"` + DetectedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=detected_at,json=detectedAt,proto3" json:"detected_at,omitempty"` + AcknowledgedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=acknowledged_at,json=acknowledgedAt,proto3" json:"acknowledged_at,omitempty"` // unset if not yet acknowledged + AcknowledgedBy string `protobuf:"bytes,7,opt,name=acknowledged_by,json=acknowledgedBy,proto3" json:"acknowledged_by,omitempty"` } -func (x *NodePolicy) GetStartupTaints() []*Taint { - if x != nil { - return x.StartupTaints +func (x *KarpenterOwnershipConflict) Reset() { + *x = KarpenterOwnershipConflict{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[223] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetTaintsTip() string { - if x != nil && x.TaintsTip != nil { - return *x.TaintsTip - } - return "" +func (x *KarpenterOwnershipConflict) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetDisruptionsTip() string { - if x != nil && x.DisruptionsTip != nil { - return *x.DisruptionsTip +func (*KarpenterOwnershipConflict) ProtoMessage() {} + +func (x *KarpenterOwnershipConflict) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[223] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetLimitsTip() string { - if x != nil && x.LimitsTip != nil { - return *x.LimitsTip - } - return "" +// Deprecated: Use KarpenterOwnershipConflict.ProtoReflect.Descriptor instead. +func (*KarpenterOwnershipConflict) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{223} } -func (x *NodePolicy) GetStartupTaintsTip() string { - if x != nil && x.StartupTaintsTip != nil { - return *x.StartupTaintsTip +func (x *KarpenterOwnershipConflict) GetId() string { + if x != nil { + return x.Id } return "" } -func (x *NodePolicy) GetMasterOverrideRoleName() string { +func (x *KarpenterOwnershipConflict) GetResourceKind() string { if x != nil { - return x.MasterOverrideRoleName + return x.ResourceKind } return "" } -func (x *NodePolicy) GetNodePoolName() string { +func (x *KarpenterOwnershipConflict) GetResourceName() string { if x != nil { - return x.NodePoolName + return x.ResourceName } return "" } -func (x *NodePolicy) GetNodeClassName() string { +func (x *KarpenterOwnershipConflict) GetOwnerTool() string { if x != nil { - return x.NodeClassName + return x.OwnerTool } return "" } -func (x *NodePolicy) GetAws() *AWSNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetDetectedAt() *timestamppb.Timestamp { if x != nil { - return x.Aws + return x.DetectedAt } return nil } -func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetAcknowledgedAt() *timestamppb.Timestamp { if x != nil { - return x.Gcp + return x.AcknowledgedAt } return nil } -func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetAcknowledgedBy() string { if x != nil { - return x.Azure + return x.AcknowledgedBy } - return nil + return "" } -func (x *NodePolicy) GetOci() *OCINodeClassSpec { - if x != nil { - return x.Oci +type DetectKarpenterOwnershipConflictsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *DetectKarpenterOwnershipConflictsRequest) Reset() { + *x = DetectKarpenterOwnershipConflictsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[224] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetCloudProviderId() int64 { - if x != nil && x.CloudProviderId != nil { - return *x.CloudProviderId +func (x *DetectKarpenterOwnershipConflictsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectKarpenterOwnershipConflictsRequest) ProtoMessage() {} + +func (x *DetectKarpenterOwnershipConflictsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[224] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *NodePolicy) GetCloudProvider() *CloudProvider { +// Deprecated: Use DetectKarpenterOwnershipConflictsRequest.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{224} +} + +func (x *DetectKarpenterOwnershipConflictsRequest) GetTeamId() string { if x != nil { - return x.CloudProvider + return x.TeamId } - return nil + return "" } -func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { +func (x *DetectKarpenterOwnershipConflictsRequest) GetClusterId() string { if x != nil { - return x.ZonalShift + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { - if x != nil { - return x.Raw +type DetectKarpenterOwnershipConflictsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Conflicts []*KarpenterOwnershipConflict `protobuf:"bytes,1,rep,name=conflicts,proto3" json:"conflicts,omitempty"` // includes previously-acknowledged ones so the UI can show history + AlreadyDevZeroManaged bool `protobuf:"varint,2,opt,name=already_dev_zero_managed,json=alreadyDevZeroManaged,proto3" json:"already_dev_zero_managed,omitempty"` // true if karpDeployment.IsDevZeroManaged() — short-circuit signal for Detect step +} + +func (x *DetectKarpenterOwnershipConflictsResponse) Reset() { + *x = DetectKarpenterOwnershipConflictsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[225] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *DetectKarpenterOwnershipConflictsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectKarpenterOwnershipConflictsResponse) ProtoMessage() {} + +func (x *DetectKarpenterOwnershipConflictsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[225] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetUpdatedAt() *timestamppb.Timestamp { +// Deprecated: Use DetectKarpenterOwnershipConflictsResponse.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} +} + +func (x *DetectKarpenterOwnershipConflictsResponse) GetConflicts() []*KarpenterOwnershipConflict { if x != nil { - return x.UpdatedAt + return x.Conflicts } return nil } -func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { +func (x *DetectKarpenterOwnershipConflictsResponse) GetAlreadyDevZeroManaged() bool { if x != nil { - return x.DeletedAt + return x.AlreadyDevZeroManaged } - return nil + return false } -type PreviewNodeRecommendationConfigRequest struct { +type AcknowledgeKarpenterOwnershipConflictRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Policies []*NodePolicy `protobuf:"bytes,6,rep,name=policies,proto3" json:"policies,omitempty"` - PolicyIds []string `protobuf:"bytes,11,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // if set, `repeated NodePolicy policies = 6;` is ignored + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ConflictId string `protobuf:"bytes,2,opt,name=conflict_id,json=conflictId,proto3" json:"conflict_id,omitempty"` + AcknowledgedBy string `protobuf:"bytes,3,opt,name=acknowledged_by,json=acknowledgedBy,proto3" json:"acknowledged_by,omitempty"` } -func (x *PreviewNodeRecommendationConfigRequest) Reset() { - *x = PreviewNodeRecommendationConfigRequest{} +func (x *AcknowledgeKarpenterOwnershipConflictRequest) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[204] + mi := &file_api_v1_recommendation_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigRequest) String() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} +func (*AcknowledgeKarpenterOwnershipConflictRequest) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[204] +func (x *AcknowledgeKarpenterOwnershipConflictRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[226] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17106,64 +20583,57 @@ func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use PreviewNodeRecommendationConfigRequest.ProtoReflect.Descriptor instead. -func (*PreviewNodeRecommendationConfigRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{204} +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictRequest.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} } -func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetConflictId() string { if x != nil { - return x.ClusterId + return x.ConflictId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetAcknowledgedBy() string { if x != nil { - return x.PolicyIds + return x.AcknowledgedBy } - return nil + return "" } -type PreviewNodeRecommendationConfigResponse struct { +type AcknowledgeKarpenterOwnershipConflictResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *PreviewNodeRecommendationConfigResponse) Reset() { - *x = PreviewNodeRecommendationConfigResponse{} +func (x *AcknowledgeKarpenterOwnershipConflictResponse) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[205] + mi := &file_api_v1_recommendation_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigResponse) String() string { +func (x *AcknowledgeKarpenterOwnershipConflictResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} +func (*AcknowledgeKarpenterOwnershipConflictResponse) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[205] +func (x *AcknowledgeKarpenterOwnershipConflictResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[227] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17174,51 +20644,45 @@ func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use PreviewNodeRecommendationConfigResponse.ProtoReflect.Descriptor instead. -func (*PreviewNodeRecommendationConfigResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{205} +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictResponse.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} } -func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { +func (x *AcknowledgeKarpenterOwnershipConflictResponse) GetId() string { if x != nil { - return x.Nrc + return x.Id } - return nil + return "" } -type NodeRecommendationConfig struct { +type KarpenterSourceResource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PolicyContainersJson string `protobuf:"bytes,6,opt,name=policy_containers_json,json=policyContainersJson,proto3" json:"policy_containers_json,omitempty"` - PolicyContainersYaml string `protobuf:"bytes,7,opt,name=policy_containers_yaml,json=policyContainersYaml,proto3" json:"policy_containers_yaml,omitempty"` - Status RecommendationStatus `protobuf:"varint,11,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` - Error string `protobuf:"bytes,12,opt,name=error,proto3" json:"error,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // "NodePool" | "EC2NodeClass" | "AKSNodeClass" | "GCENodeClass" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Yaml string `protobuf:"bytes,3,opt,name=yaml,proto3" json:"yaml,omitempty"` } -func (x *NodeRecommendationConfig) Reset() { - *x = NodeRecommendationConfig{} +func (x *KarpenterSourceResource) Reset() { + *x = KarpenterSourceResource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[206] + mi := &file_api_v1_recommendation_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeRecommendationConfig) String() string { +func (x *KarpenterSourceResource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendationConfig) ProtoMessage() {} +func (*KarpenterSourceResource) ProtoMessage() {} -func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[206] +func (x *KarpenterSourceResource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[228] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17229,100 +20693,112 @@ func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeRecommendationConfig.ProtoReflect.Descriptor instead. -func (*NodeRecommendationConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{206} +// Deprecated: Use KarpenterSourceResource.ProtoReflect.Descriptor instead. +func (*KarpenterSourceResource) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} } -func (x *NodeRecommendationConfig) GetId() string { +func (x *KarpenterSourceResource) GetKind() string { if x != nil { - return x.Id + return x.Kind } return "" } -func (x *NodeRecommendationConfig) GetClusterId() string { +func (x *KarpenterSourceResource) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { +func (x *KarpenterSourceResource) GetYaml() string { if x != nil { - return x.PolicyContainersJson + return x.Yaml } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { - if x != nil { - return x.PolicyContainersYaml - } - return "" +type GetKarpenterSourceResourcesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *NodeRecommendationConfig) GetStatus() RecommendationStatus { - if x != nil { - return x.Status +func (x *GetKarpenterSourceResourcesRequest) Reset() { + *x = GetKarpenterSourceResourcesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[229] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -func (x *NodeRecommendationConfig) GetError() string { - if x != nil { - return x.Error - } - return "" +func (x *GetKarpenterSourceResourcesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (*GetKarpenterSourceResourcesRequest) ProtoMessage() {} + +func (x *GetKarpenterSourceResourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[229] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { +// Deprecated: Use GetKarpenterSourceResourcesRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterSourceResourcesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{229} +} + +func (x *GetKarpenterSourceResourcesRequest) GetTeamId() string { if x != nil { - return x.UpdatedAt + return x.TeamId } - return nil + return "" } -func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { +func (x *GetKarpenterSourceResourcesRequest) GetClusterId() string { if x != nil { - return x.DeletedAt + return x.ClusterId } - return nil + return "" } -type SuggestedKarpenterConfigRequest struct { +type GetKarpenterSourceResourcesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Resources []*KarpenterSourceResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *SuggestedKarpenterConfigRequest) Reset() { - *x = SuggestedKarpenterConfigRequest{} +func (x *GetKarpenterSourceResourcesResponse) Reset() { + *x = GetKarpenterSourceResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[207] + mi := &file_api_v1_recommendation_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigRequest) String() string { +func (x *GetKarpenterSourceResourcesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} +func (*GetKarpenterSourceResourcesResponse) ProtoMessage() {} -func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[207] +func (x *GetKarpenterSourceResourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[230] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17333,51 +20809,44 @@ func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedKarpenterConfigRequest.ProtoReflect.Descriptor instead. -func (*SuggestedKarpenterConfigRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{207} -} - -func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetKarpenterSourceResourcesResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterSourceResourcesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} } -func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { +func (x *GetKarpenterSourceResourcesResponse) GetResources() []*KarpenterSourceResource { if x != nil { - return x.TeamId + return x.Resources } - return "" + return nil } -type SuggestedKarpenterConfigResponse struct { +type NodePoolAdoptionStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NgToOriginal map[string]*NodeRecommendationConfig `protobuf:"bytes,1,rep,name=ng_to_original,json=ngToOriginal,proto3" json:"ng_to_original,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NgToSuggested map[string]*NodeRecommendationConfig `protobuf:"bytes,11,rep,name=ng_to_suggested,json=ngToSuggested,proto3" json:"ng_to_suggested,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NodePoolName string `protobuf:"bytes,1,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` } -func (x *SuggestedKarpenterConfigResponse) Reset() { - *x = SuggestedKarpenterConfigResponse{} +func (x *NodePoolAdoptionStatus) Reset() { + *x = NodePoolAdoptionStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[208] + mi := &file_api_v1_recommendation_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigResponse) String() string { +func (x *NodePoolAdoptionStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} +func (*NodePoolAdoptionStatus) ProtoMessage() {} -func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[208] +func (x *NodePoolAdoptionStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[231] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17388,52 +20857,52 @@ func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedKarpenterConfigResponse.ProtoReflect.Descriptor instead. -func (*SuggestedKarpenterConfigResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{208} +// Deprecated: Use NodePoolAdoptionStatus.ProtoReflect.Descriptor instead. +func (*NodePoolAdoptionStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} } -func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { +func (x *NodePoolAdoptionStatus) GetNodePoolName() string { if x != nil { - return x.NgToOriginal + return x.NodePoolName } - return nil + return "" } -func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { +func (x *NodePoolAdoptionStatus) GetReady() bool { if x != nil { - return x.NgToSuggested + return x.Ready } - return nil + return false } -type GetAvailableKindsByTargetingFiltersRequest struct { +type GetKarpenterAdoptionStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - TargetFilters *TargetFilters `protobuf:"bytes,3,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodePoolNames []string `protobuf:"bytes,3,rep,name=node_pool_names,json=nodePoolNames,proto3" json:"node_pool_names,omitempty"` } -func (x *GetAvailableKindsByTargetingFiltersRequest) Reset() { - *x = GetAvailableKindsByTargetingFiltersRequest{} +func (x *GetKarpenterAdoptionStatusRequest) Reset() { + *x = GetKarpenterAdoptionStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[209] + mi := &file_api_v1_recommendation_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { +func (x *GetKarpenterAdoptionStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusRequest) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[209] +func (x *GetKarpenterAdoptionStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[232] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17444,62 +20913,57 @@ func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use GetAvailableKindsByTargetingFiltersRequest.ProtoReflect.Descriptor instead. -func (*GetAvailableKindsByTargetingFiltersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{209} +// Deprecated: Use GetKarpenterAdoptionStatusRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { +func (x *GetKarpenterAdoptionStatusRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { +func (x *GetKarpenterAdoptionStatusRequest) GetClusterId() string { if x != nil { - return x.ClusterIds + return x.ClusterId } - return nil + return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *GetKarpenterAdoptionStatusRequest) GetNodePoolNames() []string { if x != nil { - return x.TargetFilters + return x.NodePoolNames } return nil } -// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria -type SearchResourcesByTargetingFiltersRequest struct { +type GetKarpenterAdoptionStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Unique identifiers for the clusters. - SearchQuery string `protobuf:"bytes,3,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"` // Search term to match against resources. - TargetFilterType TargetFilterType `protobuf:"varint,4,opt,name=target_filter_type,json=targetFilterType,proto3,enum=api.v1.TargetFilterType" json:"target_filter_type,omitempty"` // Type of filter to apply. - TargetFilters *TargetFilters `protobuf:"bytes,5,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` + Statuses []*NodePoolAdoptionStatus `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty"` } -func (x *SearchResourcesByTargetingFiltersRequest) Reset() { - *x = SearchResourcesByTargetingFiltersRequest{} +func (x *GetKarpenterAdoptionStatusResponse) Reset() { + *x = GetKarpenterAdoptionStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[210] + mi := &file_api_v1_recommendation_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersRequest) String() string { +func (x *GetKarpenterAdoptionStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusResponse) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[210] +func (x *GetKarpenterAdoptionStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[233] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17510,79 +20974,49 @@ func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use SearchResourcesByTargetingFiltersRequest.ProtoReflect.Descriptor instead. -func (*SearchResourcesByTargetingFiltersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{210} -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds - } - return nil -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetSearchQuery() string { - if x != nil { - return x.SearchQuery - } - return "" -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilterType() TargetFilterType { - if x != nil { - return x.TargetFilterType - } - return TargetFilterType_TARGET_FILTER_TYPE_UNSPECIFIED +// Deprecated: Use GetKarpenterAdoptionStatusResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{233} } -func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *GetKarpenterAdoptionStatusResponse) GetStatuses() []*NodePoolAdoptionStatus { if x != nil { - return x.TargetFilters + return x.Statuses } return nil } -type TargetFilters struct { +// NodePool validation +type ReportNodePoolValidationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NamespaceNames []string `protobuf:"bytes,1,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` - // optional LabelSelector namespace_selector = 1; // Target namespaces by labels - // optional LabelSelector annotation_selector = 2; // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,2,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,3,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - KindFilter []K8SObjectKind `protobuf:"varint,5,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodepoolName string `protobuf:"bytes,2,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` + NodeName string `protobuf:"bytes,3,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + Zone string `protobuf:"bytes,5,opt,name=zone,proto3" json:"zone,omitempty"` + TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *TargetFilters) Reset() { - *x = TargetFilters{} +func (x *ReportNodePoolValidationRequest) Reset() { + *x = ReportNodePoolValidationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[211] + mi := &file_api_v1_recommendation_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TargetFilters) String() string { +func (x *ReportNodePoolValidationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TargetFilters) ProtoMessage() {} +func (*ReportNodePoolValidationRequest) ProtoMessage() {} -func (x *TargetFilters) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[211] +func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[234] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17593,85 +21027,117 @@ func (x *TargetFilters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TargetFilters.ProtoReflect.Descriptor instead. -func (*TargetFilters) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{211} +// Deprecated: Use ReportNodePoolValidationRequest.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{234} } -func (x *TargetFilters) GetNamespaceNames() []string { +func (x *ReportNodePoolValidationRequest) GetClusterId() string { if x != nil { - return x.NamespaceNames + return x.ClusterId } - return nil + return "" } -func (x *TargetFilters) GetWorkloadNames() []string { +func (x *ReportNodePoolValidationRequest) GetNodepoolName() string { if x != nil { - return x.WorkloadNames + return x.NodepoolName } - return nil + return "" } -func (x *TargetFilters) GetNodeGroupNames() []string { +func (x *ReportNodePoolValidationRequest) GetNodeName() string { if x != nil { - return x.NodeGroupNames + return x.NodeName } - return nil + return "" } -func (x *TargetFilters) GetLabels() []string { +func (x *ReportNodePoolValidationRequest) GetInstanceType() string { if x != nil { - return x.Labels + return x.InstanceType } - return nil + return "" } -func (x *TargetFilters) GetKindFilter() []K8SObjectKind { +func (x *ReportNodePoolValidationRequest) GetZone() string { if x != nil { - return x.KindFilter + return x.Zone } - return nil + return "" } -func (x *TargetFilters) GetNamePattern() *RegexPattern { +func (x *ReportNodePoolValidationRequest) GetTeamId() string { if x != nil { - return x.NamePattern + return x.TeamId } - return nil + return "" } -func (x *TargetFilters) GetNamespacePattern() *RegexPattern { - if x != nil { - return x.NamespacePattern +type ReportNodePoolValidationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ReportNodePoolValidationResponse) Reset() { + *x = ReportNodePoolValidationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[235] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type GetAvailableKindsByTargetingFiltersResponse struct { +func (x *ReportNodePoolValidationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportNodePoolValidationResponse) ProtoMessage() {} + +func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[235] + 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 ReportNodePoolValidationResponse.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{235} +} + +type GetNodePoolValidationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kinds []K8SObjectKind `protobuf:"varint,1,rep,packed,name=kinds,proto3,enum=api.v1.K8SObjectKind" json:"kinds,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetAvailableKindsByTargetingFiltersResponse) Reset() { - *x = GetAvailableKindsByTargetingFiltersResponse{} +func (x *GetNodePoolValidationsRequest) Reset() { + *x = GetNodePoolValidationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[212] + mi := &file_api_v1_recommendation_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { +func (x *GetNodePoolValidationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} +func (*GetNodePoolValidationsRequest) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[212] +func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[236] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17682,46 +21148,54 @@ func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflec return mi.MessageOf(x) } -// Deprecated: Use GetAvailableKindsByTargetingFiltersResponse.ProtoReflect.Descriptor instead. -func (*GetAvailableKindsByTargetingFiltersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{212} +// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} } -func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { +func (x *GetNodePoolValidationsRequest) GetClusterId() string { if x != nil { - return x.Kinds + return x.ClusterId } - return nil + return "" } -type SearchResourcesByTargetingFiltersResponse struct { +func (x *GetNodePoolValidationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +type NodePoolValidationReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespaces []*NamespaceSearchResult `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` - Workloads []*WorkloadSearchResult `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` - NodeGroups []*NodeGroupSearchResult `protobuf:"bytes,3,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` - Labels []*LabelSearchResult `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + NodepoolName string `protobuf:"bytes,1,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` + NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + Zone string `protobuf:"bytes,4,opt,name=zone,proto3" json:"zone,omitempty"` + ReportedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=reported_at,json=reportedAt,proto3" json:"reported_at,omitempty"` } -func (x *SearchResourcesByTargetingFiltersResponse) Reset() { - *x = SearchResourcesByTargetingFiltersResponse{} +func (x *NodePoolValidationReport) Reset() { + *x = NodePoolValidationReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[213] + mi := &file_api_v1_recommendation_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersResponse) String() string { +func (x *NodePoolValidationReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} +func (*NodePoolValidationReport) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[213] +func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[237] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17732,64 +21206,71 @@ func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use SearchResourcesByTargetingFiltersResponse.ProtoReflect.Descriptor instead. -func (*SearchResourcesByTargetingFiltersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{213} +// Deprecated: Use NodePoolValidationReport.ProtoReflect.Descriptor instead. +func (*NodePoolValidationReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} } -func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { +func (x *NodePoolValidationReport) GetNodepoolName() string { if x != nil { - return x.Namespaces + return x.NodepoolName } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { +func (x *NodePoolValidationReport) GetNodeName() string { if x != nil { - return x.Workloads + return x.NodeName } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { +func (x *NodePoolValidationReport) GetInstanceType() string { if x != nil { - return x.NodeGroups + return x.InstanceType } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { +func (x *NodePoolValidationReport) GetZone() string { if x != nil { - return x.Labels + return x.Zone + } + return "" +} + +func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { + if x != nil { + return x.ReportedAt } return nil } -type NamespaceSearchResult struct { +type GetNodePoolValidationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Validations []*NodePoolValidationReport `protobuf:"bytes,1,rep,name=validations,proto3" json:"validations,omitempty"` } -func (x *NamespaceSearchResult) Reset() { - *x = NamespaceSearchResult{} +func (x *GetNodePoolValidationsResponse) Reset() { + *x = GetNodePoolValidationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[214] + mi := &file_api_v1_recommendation_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NamespaceSearchResult) String() string { +func (x *GetNodePoolValidationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NamespaceSearchResult) ProtoMessage() {} +func (*GetNodePoolValidationsResponse) ProtoMessage() {} -func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[214] +func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[238] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17800,44 +21281,47 @@ func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NamespaceSearchResult.ProtoReflect.Descriptor instead. -func (*NamespaceSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{214} +// Deprecated: Use GetNodePoolValidationsResponse.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{238} } -func (x *NamespaceSearchResult) GetName() string { +func (x *GetNodePoolValidationsResponse) GetValidations() []*NodePoolValidationReport { if x != nil { - return x.Name + return x.Validations } - return "" + return nil } -type WorkloadSearchResult struct { +type WorkloadCompatibilityWarning struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + WorkloadName string `protobuf:"bytes,1,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + WorkloadNamespace string `protobuf:"bytes,2,opt,name=workload_namespace,json=workloadNamespace,proto3" json:"workload_namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + NodeGroup string `protobuf:"bytes,4,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` } -func (x *WorkloadSearchResult) Reset() { - *x = WorkloadSearchResult{} +func (x *WorkloadCompatibilityWarning) Reset() { + *x = WorkloadCompatibilityWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[215] + mi := &file_api_v1_recommendation_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadSearchResult) String() string { +func (x *WorkloadCompatibilityWarning) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadSearchResult) ProtoMessage() {} +func (*WorkloadCompatibilityWarning) ProtoMessage() {} -func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[215] +func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[239] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17848,50 +21332,71 @@ func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadSearchResult.ProtoReflect.Descriptor instead. -func (*WorkloadSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{215} +// Deprecated: Use WorkloadCompatibilityWarning.ProtoReflect.Descriptor instead. +func (*WorkloadCompatibilityWarning) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{239} } -func (x *WorkloadSearchResult) GetKind() string { +func (x *WorkloadCompatibilityWarning) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *WorkloadCompatibilityWarning) GetWorkloadNamespace() string { + if x != nil { + return x.WorkloadNamespace + } + return "" +} + +func (x *WorkloadCompatibilityWarning) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *WorkloadSearchResult) GetName() string { +func (x *WorkloadCompatibilityWarning) GetNodeGroup() string { if x != nil { - return x.Name + return x.NodeGroup } return "" } -type NodeGroupSearchResult struct { +func (x *WorkloadCompatibilityWarning) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type ListNodePoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *NodeGroupSearchResult) Reset() { - *x = NodeGroupSearchResult{} +func (x *ListNodePoliciesRequest) Reset() { + *x = ListNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[216] + mi := &file_api_v1_recommendation_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupSearchResult) String() string { +func (x *ListNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupSearchResult) ProtoMessage() {} +func (*ListNodePoliciesRequest) ProtoMessage() {} -func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[216] +func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[240] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17902,44 +21407,43 @@ func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupSearchResult.ProtoReflect.Descriptor instead. -func (*NodeGroupSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{216} +// Deprecated: Use ListNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{240} } -func (x *NodeGroupSearchResult) GetName() string { +func (x *ListNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -type LabelSearchResult struct { +type ListNodePoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *LabelSearchResult) Reset() { - *x = LabelSearchResult{} +func (x *ListNodePoliciesResponse) Reset() { + *x = ListNodePoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[217] + mi := &file_api_v1_recommendation_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSearchResult) String() string { +func (x *ListNodePoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSearchResult) ProtoMessage() {} +func (*ListNodePoliciesResponse) ProtoMessage() {} -func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[217] +func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[241] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17950,50 +21454,44 @@ func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSearchResult.ProtoReflect.Descriptor instead. -func (*LabelSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{217} +// Deprecated: Use ListNodePoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{241} } -func (x *LabelSearchResult) GetKey() string { +func (x *ListNodePoliciesResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.Key + return x.Policies } - return "" -} - -func (x *LabelSearchResult) GetValue() string { - if x != nil { - return x.Value - } - return "" + return nil } -type CreateNodePolicyTargetsRequest struct { +type UpdateNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *NodePolicy `protobuf:"bytes,11,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *CreateNodePolicyTargetsRequest) Reset() { - *x = CreateNodePolicyTargetsRequest{} +func (x *UpdateNodePolicyRequest) Reset() { + *x = UpdateNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[218] + mi := &file_api_v1_recommendation_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsRequest) String() string { +func (x *UpdateNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} +func (*UpdateNodePolicyRequest) ProtoMessage() {} -func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[218] +func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[242] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18004,43 +21502,50 @@ func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*CreateNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{218} +// Deprecated: Use UpdateNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} } -func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { +func (x *UpdateNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Targets + return x.TeamId + } + return "" +} + +func (x *UpdateNodePolicyRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy } return nil } -type CreateNodePolicyTargetsResponse struct { +type UpdateNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *CreateNodePolicyTargetsResponse) Reset() { - *x = CreateNodePolicyTargetsResponse{} +func (x *UpdateNodePolicyResponse) Reset() { + *x = UpdateNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[219] + mi := &file_api_v1_recommendation_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsResponse) String() string { +func (x *UpdateNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} +func (*UpdateNodePolicyResponse) ProtoMessage() {} -func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[219] +func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[243] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18051,43 +21556,53 @@ func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*CreateNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{219} +// Deprecated: Use UpdateNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{243} } -func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *UpdateNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.Targets + return x.Policy } return nil } -type ListNodePolicyTargetsRequest struct { +type NodeGroupCheckpointStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + State NodeGroupCheckpointState `protobuf:"varint,1,opt,name=state,proto3,enum=api.v1.NodeGroupCheckpointState" json:"state,omitempty"` + // Associated node policy (empty when NOT_DZ_MANAGED). + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + // For scope disclosure on the CTA: all node pool names this policy compiles + // to / clusters it targets — toggling the label affects all of them. + SharedNodePoolNames []string `protobuf:"bytes,4,rep,name=shared_node_pool_names,json=sharedNodePoolNames,proto3" json:"shared_node_pool_names,omitempty"` + SharedClusterIds []string `protobuf:"bytes,5,rep,name=shared_cluster_ids,json=sharedClusterIds,proto3" json:"shared_cluster_ids,omitempty"` + // Why this NG is in CONFIGURED (vs ENABLED). UNSPECIFIED for non-CONFIGURED + // states. + Reason CheckpointReason `protobuf:"varint,6,opt,name=reason,proto3,enum=api.v1.CheckpointReason" json:"reason,omitempty"` } -func (x *ListNodePolicyTargetsRequest) Reset() { - *x = ListNodePolicyTargetsRequest{} +func (x *NodeGroupCheckpointStatus) Reset() { + *x = NodeGroupCheckpointStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[220] + mi := &file_api_v1_recommendation_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePolicyTargetsRequest) String() string { +func (x *NodeGroupCheckpointStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePolicyTargetsRequest) ProtoMessage() {} +func (*NodeGroupCheckpointStatus) ProtoMessage() {} -func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[220] +func (x *NodeGroupCheckpointStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[244] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18098,90 +21613,79 @@ func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*ListNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{220} +// Deprecated: Use NodeGroupCheckpointStatus.ProtoReflect.Descriptor instead. +func (*NodeGroupCheckpointStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{244} } -func (x *ListNodePolicyTargetsRequest) GetTeamId() string { +func (x *NodeGroupCheckpointStatus) GetState() NodeGroupCheckpointState { if x != nil { - return x.TeamId + return x.State } - return "" -} - -type ListNodePolicyTargetsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + return NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED } -func (x *ListNodePolicyTargetsResponse) Reset() { - *x = ListNodePolicyTargetsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[221] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodeGroupCheckpointStatus) GetPolicyId() string { + if x != nil { + return x.PolicyId } + return "" } -func (x *ListNodePolicyTargetsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodeGroupCheckpointStatus) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" } -func (*ListNodePolicyTargetsResponse) ProtoMessage() {} - -func (x *ListNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[221] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodeGroupCheckpointStatus) GetSharedNodePoolNames() []string { + if x != nil { + return x.SharedNodePoolNames } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} +func (x *NodeGroupCheckpointStatus) GetSharedClusterIds() []string { + if x != nil { + return x.SharedClusterIds + } + return nil } -func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *NodeGroupCheckpointStatus) GetReason() CheckpointReason { if x != nil { - return x.Targets + return x.Reason } - return nil + return CheckpointReason_CHECKPOINT_REASON_UNSPECIFIED } -type UpdateNodePolicyTargetRequest struct { +type GetNodeGroupsCheckpointStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *UpdateNodePolicyTargetRequest) Reset() { - *x = UpdateNodePolicyTargetRequest{} +func (x *GetNodeGroupsCheckpointStatusRequest) Reset() { + *x = GetNodeGroupsCheckpointStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[222] + mi := &file_api_v1_recommendation_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyTargetRequest) String() string { +func (x *GetNodeGroupsCheckpointStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusRequest) ProtoMessage() {} -func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[222] +func (x *GetNodeGroupsCheckpointStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[245] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18192,43 +21696,51 @@ func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} +// Deprecated: Use GetNodeGroupsCheckpointStatusRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} } -func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { +func (x *GetNodeGroupsCheckpointStatusRequest) GetTeamId() string { if x != nil { - return x.Target + return x.TeamId } - return nil + return "" } -type UpdateNodePolicyTargetResponse struct { +func (x *GetNodeGroupsCheckpointStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type GetNodeGroupsCheckpointStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + // Keyed by node group name. + ByNodeGroup map[string]*NodeGroupCheckpointStatus `protobuf:"bytes,1,rep,name=by_node_group,json=byNodeGroup,proto3" json:"by_node_group,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *UpdateNodePolicyTargetResponse) Reset() { - *x = UpdateNodePolicyTargetResponse{} +func (x *GetNodeGroupsCheckpointStatusResponse) Reset() { + *x = GetNodeGroupsCheckpointStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[223] + mi := &file_api_v1_recommendation_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyTargetResponse) String() string { +func (x *GetNodeGroupsCheckpointStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusResponse) ProtoMessage() {} -func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[223] +func (x *GetNodeGroupsCheckpointStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[246] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18239,58 +21751,46 @@ func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{223} +// Deprecated: Use GetNodeGroupsCheckpointStatusResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{246} } -func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { +func (x *GetNodeGroupsCheckpointStatusResponse) GetByNodeGroup() map[string]*NodeGroupCheckpointStatus { if x != nil { - return x.Target + return x.ByNodeGroup } return nil } -type NodePolicyTarget struct { +type SetNodePolicyCheckpointLabelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Invariant: at most 1 entry. Server rejects >1. Will be narrowed to a scalar once all clients migrate. - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // uuid[] - PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` - // Runtime status conditions read from the compiled Karpenter NodePool in the - // target cluster (e.g. ZonalShiftReady / ZonalShiftActive). Populated by - // ListNodePolicyTargets via a join against k8s_karpenter_resources. Empty - // when no conditions are observed for this target. - Status *NodePolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // true adds dakr.devzero.io/checkpoint-node=true; false removes the key. + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` } -func (x *NodePolicyTarget) Reset() { - *x = NodePolicyTarget{} +func (x *SetNodePolicyCheckpointLabelRequest) Reset() { + *x = SetNodePolicyCheckpointLabelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[224] + mi := &file_api_v1_recommendation_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyTarget) String() string { +func (x *SetNodePolicyCheckpointLabelRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyTarget) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelRequest) ProtoMessage() {} -func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[224] +func (x *SetNodePolicyCheckpointLabelRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[247] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18301,122 +21801,57 @@ func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyTarget.ProtoReflect.Descriptor instead. -func (*NodePolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{224} -} - -func (x *NodePolicyTarget) GetTargetId() string { - if x != nil { - return x.TargetId - } - return "" -} - -func (x *NodePolicyTarget) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NodePolicyTarget) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use SetNodePolicyCheckpointLabelRequest.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} } -func (x *NodePolicyTarget) GetTeamId() string { +func (x *SetNodePolicyCheckpointLabelRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *NodePolicyTarget) GetClusterIds() []string { - if x != nil { - return x.ClusterIds - } - return nil -} - -func (x *NodePolicyTarget) GetPolicyId() string { +func (x *SetNodePolicyCheckpointLabelRequest) GetPolicyId() string { if x != nil { return x.PolicyId } return "" } -func (x *NodePolicyTarget) GetEnabled() bool { +func (x *SetNodePolicyCheckpointLabelRequest) GetEnabled() bool { if x != nil { return x.Enabled } return false } -func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { - if x != nil { - return x.DeletedAt - } - return nil -} - -func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { - if x != nil { - return x.Status - } - return nil -} - -type NodePolicyCondition struct { +type SetNodePolicyCheckpointLabelResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // e.g. "ZonalShiftReady", "ZonalShiftActive" - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // "True" | "False" | "Unknown" - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - // Machine-readable reason code (e.g. "Ready", "ZonePinned", "NoFallbackZones", - // "NoActiveShift", "AwayFrom", "ZoneConstraintConflict"). - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` - // Human-readable detail (e.g. impacted zone names). - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` - LastTransitionTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *NodePolicyCondition) Reset() { - *x = NodePolicyCondition{} +func (x *SetNodePolicyCheckpointLabelResponse) Reset() { + *x = SetNodePolicyCheckpointLabelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[225] + mi := &file_api_v1_recommendation_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyCondition) String() string { +func (x *SetNodePolicyCheckpointLabelResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyCondition) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelResponse) ProtoMessage() {} -func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[225] +func (x *SetNodePolicyCheckpointLabelResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[248] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18427,71 +21862,44 @@ func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. -func (*NodePolicyCondition) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} -} - -func (x *NodePolicyCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *NodePolicyCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *NodePolicyCondition) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *NodePolicyCondition) GetMessage() string { - if x != nil { - return x.Message - } - return "" +// Deprecated: Use SetNodePolicyCheckpointLabelResponse.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{248} } -func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { +func (x *SetNodePolicyCheckpointLabelResponse) GetSuccess() bool { if x != nil { - return x.LastTransitionTime + return x.Success } - return nil + return false } -type NodePolicyTargetStatus struct { +type DeleteNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *NodePolicyTargetStatus) Reset() { - *x = NodePolicyTargetStatus{} +func (x *DeleteNodePolicyRequest) Reset() { + *x = DeleteNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[226] + mi := &file_api_v1_recommendation_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyTargetStatus) String() string { +func (x *DeleteNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyTargetStatus) ProtoMessage() {} +func (*DeleteNodePolicyRequest) ProtoMessage() {} -func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[226] +func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[249] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18502,55 +21910,52 @@ func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. -func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} +// Deprecated: Use DeleteNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{249} } -func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { +func (x *DeleteNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Conditions + return x.TeamId } - return nil + return "" } -// Cloud-agnostic config for how a node policy should react to AZ outage -// signals from the cloud provider (AWS ARC zonal shift today; GCP analogue -// planned). The compile step maps these intents to provider-specific -// annotations on the resulting Karpenter NodePool. -type ZonalShiftConfig struct { +func (x *DeleteNodePolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Master opt-in. When false the other two fields are ignored. - RespectZonalShift bool `protobuf:"varint,1,opt,name=respect_zonal_shift,json=respectZonalShift,proto3" json:"respect_zonal_shift,omitempty"` - // Also terminate existing nodes in the impacted zone, forcing reschedule. - // Respects pod disruption budgets. Only meaningful when respect_zonal_shift is true. - EvictImpactedNodes bool `protobuf:"varint,2,opt,name=evict_impacted_nodes,json=evictImpactedNodes,proto3" json:"evict_impacted_nodes,omitempty"` - // If the policy is pinned to a single zone and that zone is impacted, expand - // to other zones available on the node class. Only meaningful when - // respect_zonal_shift is true. - AllowZoneFallback bool `protobuf:"varint,3,opt,name=allow_zone_fallback,json=allowZoneFallback,proto3" json:"allow_zone_fallback,omitempty"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + // Number of NodePolicyTargets that were cascade-deleted along with the policy. + DeletedTargetCount int32 `protobuf:"varint,2,opt,name=deleted_target_count,json=deletedTargetCount,proto3" json:"deleted_target_count,omitempty"` } -func (x *ZonalShiftConfig) Reset() { - *x = ZonalShiftConfig{} +func (x *DeleteNodePolicyResponse) Reset() { + *x = DeleteNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[227] + mi := &file_api_v1_recommendation_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ZonalShiftConfig) String() string { +func (x *DeleteNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ZonalShiftConfig) ProtoMessage() {} +func (*DeleteNodePolicyResponse) ProtoMessage() {} -func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[227] +func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[250] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18561,59 +21966,126 @@ func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. -func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} -} - -func (x *ZonalShiftConfig) GetRespectZonalShift() bool { - if x != nil { - return x.RespectZonalShift - } - return false +// Deprecated: Use DeleteNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} } -func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { +func (x *DeleteNodePolicyResponse) GetSuccess() bool { if x != nil { - return x.EvictImpactedNodes + return x.Success } return false } -func (x *ZonalShiftConfig) GetAllowZoneFallback() bool { +func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { if x != nil { - return x.AllowZoneFallback + return x.DeletedTargetCount } - return false + return 0 } -type Taint struct { +type NodePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // NoSchedule, PreferNoSchedule, NoExecute + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Cross-cloud core + InstanceCategories *LabelSelector `protobuf:"bytes,10,opt,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` // abstract, per-cloud mapping; UI: Family; e.g., D (Azure), m (AWS) + InstanceFamilies *LabelSelector `protobuf:"bytes,11,opt,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` // abstract, per-cloud mapping (c5, m5d, r4, etc) + InstanceCpus *LabelSelector `protobuf:"bytes,12,opt,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` // cpu count in cores (4, 8, 1, 2, etc) + InstanceHypervisors *LabelSelector `protobuf:"bytes,13,opt,name=instance_hypervisors,json=instanceHypervisors,proto3" json:"instance_hypervisors,omitempty"` // self explanatory + InstanceGenerations *LabelSelector `protobuf:"bytes,14,opt,name=instance_generations,json=instanceGenerations,proto3" json:"instance_generations,omitempty"` // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) + InstanceSizes *LabelSelector `protobuf:"bytes,15,opt,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` // UI: Size; eg: Standard_D4s (Azure), large (AWS) + InstanceShapes *LabelSelector `protobuf:"bytes,116,opt,name=instance_shapes,json=instanceShapes,proto3" json:"instance_shapes,omitempty"` // GCP-only: standard/highcpu/highmem shape token + InstanceTypes *LabelSelector `protobuf:"bytes,16,opt,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) + // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per + // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this + // field is silently dropped on the compile path for those providers. + InstanceLocalNvme *LabelSelector `protobuf:"bytes,113,opt,name=instance_local_nvme,json=instanceLocalNvme,proto3" json:"instance_local_nvme,omitempty"` + InstanceCategoriesTip *string `protobuf:"bytes,26,opt,name=instance_categories_tip,json=instanceCategoriesTip,proto3,oneof" json:"instance_categories_tip,omitempty"` + InstanceFamiliesTip *string `protobuf:"bytes,27,opt,name=instance_families_tip,json=instanceFamiliesTip,proto3,oneof" json:"instance_families_tip,omitempty"` + InstanceCpusTip *string `protobuf:"bytes,28,opt,name=instance_cpus_tip,json=instanceCpusTip,proto3,oneof" json:"instance_cpus_tip,omitempty"` + InstanceHypervisorsTip *string `protobuf:"bytes,29,opt,name=instance_hypervisors_tip,json=instanceHypervisorsTip,proto3,oneof" json:"instance_hypervisors_tip,omitempty"` + InstanceGenerationsTip *string `protobuf:"bytes,30,opt,name=instance_generations_tip,json=instanceGenerationsTip,proto3,oneof" json:"instance_generations_tip,omitempty"` + InstanceSizesTip *string `protobuf:"bytes,31,opt,name=instance_sizes_tip,json=instanceSizesTip,proto3,oneof" json:"instance_sizes_tip,omitempty"` + InstanceShapesTip *string `protobuf:"bytes,117,opt,name=instance_shapes_tip,json=instanceShapesTip,proto3,oneof" json:"instance_shapes_tip,omitempty"` + InstanceLocalNvmeTip *string `protobuf:"bytes,114,opt,name=instance_local_nvme_tip,json=instanceLocalNvmeTip,proto3,oneof" json:"instance_local_nvme_tip,omitempty"` + Zones *LabelSelector `protobuf:"bytes,36,opt,name=zones,proto3" json:"zones,omitempty"` // abstract, per-cloud mapping + Architectures *LabelSelector `protobuf:"bytes,37,opt,name=architectures,proto3" json:"architectures,omitempty"` // amd64, arm64 + CapacityTypes *LabelSelector `protobuf:"bytes,38,opt,name=capacity_types,json=capacityTypes,proto3" json:"capacity_types,omitempty"` // spot, on-demand, reserved + OperatingSystems *LabelSelector `protobuf:"bytes,39,opt,name=operating_systems,json=operatingSystems,proto3" json:"operating_systems,omitempty"` // linux, windows + Weight int32 `protobuf:"varint,40,opt,name=weight,proto3" json:"weight,omitempty"` + ZonesTip *string `protobuf:"bytes,45,opt,name=zones_tip,json=zonesTip,proto3,oneof" json:"zones_tip,omitempty"` + ArchitecturesTip *string `protobuf:"bytes,46,opt,name=architectures_tip,json=architecturesTip,proto3,oneof" json:"architectures_tip,omitempty"` + CapacityTypeTip *string `protobuf:"bytes,47,opt,name=capacity_type_tip,json=capacityTypeTip,proto3,oneof" json:"capacity_type_tip,omitempty"` + OperatingSystemsTip *string `protobuf:"bytes,48,opt,name=operating_systems_tip,json=operatingSystemsTip,proto3,oneof" json:"operating_systems_tip,omitempty"` + Labels map[string]string `protobuf:"bytes,51,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Taints []*Taint `protobuf:"bytes,52,rep,name=taints,proto3" json:"taints,omitempty"` + Disruption *DisruptionPolicy `protobuf:"bytes,53,opt,name=disruption,proto3" json:"disruption,omitempty"` + Limits *ResourceLimits `protobuf:"bytes,54,opt,name=limits,proto3" json:"limits,omitempty"` + StartupTaints []*Taint `protobuf:"bytes,55,rep,name=startup_taints,json=startupTaints,proto3" json:"startup_taints,omitempty"` + TaintsTip *string `protobuf:"bytes,57,opt,name=taints_tip,json=taintsTip,proto3,oneof" json:"taints_tip,omitempty"` + DisruptionsTip *string `protobuf:"bytes,58,opt,name=disruptions_tip,json=disruptionsTip,proto3,oneof" json:"disruptions_tip,omitempty"` + LimitsTip *string `protobuf:"bytes,59,opt,name=limits_tip,json=limitsTip,proto3,oneof" json:"limits_tip,omitempty"` + StartupTaintsTip *string `protobuf:"bytes,60,opt,name=startup_taints_tip,json=startupTaintsTip,proto3,oneof" json:"startup_taints_tip,omitempty"` + MasterOverrideRoleName string `protobuf:"bytes,61,opt,name=master_override_role_name,json=masterOverrideRoleName,proto3" json:"master_override_role_name,omitempty"` + NodePoolName string `protobuf:"bytes,71,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + NodeClassName string `protobuf:"bytes,72,opt,name=node_class_name,json=nodeClassName,proto3" json:"node_class_name,omitempty"` + // Provider-specific overrides + Aws *AWSNodeClassSpec `protobuf:"bytes,81,opt,name=aws,proto3" json:"aws,omitempty"` + Gcp *GCPNodeClassSpec `protobuf:"bytes,82,opt,name=gcp,proto3" json:"gcp,omitempty"` + Azure *AzureNodeClassSpec `protobuf:"bytes,83,opt,name=azure,proto3" json:"azure,omitempty"` + Oci *OCINodeClassSpec `protobuf:"bytes,84,opt,name=oci,proto3" json:"oci,omitempty"` + CloudProviderId *int64 `protobuf:"varint,85,opt,name=cloud_provider_id,json=cloudProviderId,proto3,oneof" json:"cloud_provider_id,omitempty"` + CloudProvider *CloudProvider `protobuf:"bytes,86,opt,name=cloud_provider,json=cloudProvider,proto3" json:"cloud_provider,omitempty"` + // Cloud-agnostic opt-in for AZ outage handling (AWS ARC zonal shift today; + // analogous GCP behavior planned). The compile step translates this to + // provider-specific annotations on the Karpenter NodePool. + ZonalShift *ZonalShiftConfig `protobuf:"bytes,90,opt,name=zonal_shift,json=zonalShift,proto3" json:"zonal_shift,omitempty"` + // Raw escape hatch for node pool + Raw []*RawKarpenterSpec `protobuf:"bytes,100,rep,name=raw,proto3" json:"raw,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // "dakr" (user-authored, pushed to cluster) or "cluster" (read-only, + // computed from Karpenter CRDs NOT labeled devzero.io/managed-by=dakr — i.e. + // anything dakr does not own; see repositories.scopeNotDakrManaged). + Source string `protobuf:"bytes,115,opt,name=source,proto3" json:"source,omitempty"` + // For source == "cluster" only: the cluster whose Karpenter NodePool this + // policy mirrors. A cluster-managed policy belongs to exactly one cluster and + // has no NodePolicyTargets, so this is the frontend's only way to scope it + // (e.g. for suggestions). Empty for dakr-authored policies. + SourceClusterId string `protobuf:"bytes,118,opt,name=source_cluster_id,json=sourceClusterId,proto3" json:"source_cluster_id,omitempty"` + // For source == "cluster" only: NodePool requirement keys on the mirrored CRD + // that this message has no field for (Azure/GCP SKU keys, custom label + // requirements). Computed per request like source and source_cluster_id, never + // stored, and empty for dakr-authored policies — which are authoritative by + // construction, since dakr compiled the NodePool from them. + UnrepresentedRequirementKeys []string `protobuf:"bytes,119,rep,name=unrepresented_requirement_keys,json=unrepresentedRequirementKeys,proto3" json:"unrepresented_requirement_keys,omitempty"` } -func (x *Taint) Reset() { - *x = Taint{} +func (x *NodePolicy) Reset() { + *x = NodePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[228] + mi := &file_api_v1_recommendation_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Taint) String() string { +func (x *NodePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Taint) ProtoMessage() {} +func (*NodePolicy) ProtoMessage() {} -func (x *Taint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[228] +func (x *NodePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[251] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18624,438 +22096,431 @@ func (x *Taint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Taint.ProtoReflect.Descriptor instead. -func (*Taint) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} +// Deprecated: Use NodePolicy.ProtoReflect.Descriptor instead. +func (*NodePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{251} } -func (x *Taint) GetKey() string { +func (x *NodePolicy) GetId() string { if x != nil { - return x.Key + return x.Id } return "" } -func (x *Taint) GetValue() string { +func (x *NodePolicy) GetName() string { if x != nil { - return x.Value + return x.Name } return "" } -func (x *Taint) GetEffect() string { +func (x *NodePolicy) GetDescription() string { if x != nil { - return x.Effect + return x.Description } return "" } -type DisruptionBudget struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Reasons []string `protobuf:"bytes,1,rep,name=reasons,proto3" json:"reasons,omitempty"` // e.g. ["Underutilized", "Empty"] - Nodes string `protobuf:"bytes,2,opt,name=nodes,proto3" json:"nodes,omitempty"` // e.g. "10%" or "2" - Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` // optional cron schedule - Duration string `protobuf:"bytes,4,opt,name=duration,proto3" json:"duration,omitempty"` // e.g. "1h30m" +func (x *NodePolicy) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" } -func (x *DisruptionBudget) Reset() { - *x = DisruptionBudget{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[229] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetInstanceCategories() *LabelSelector { + if x != nil { + return x.InstanceCategories } + return nil } -func (x *DisruptionBudget) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { + if x != nil { + return x.InstanceFamilies + } + return nil } -func (*DisruptionBudget) ProtoMessage() {} - -func (x *DisruptionBudget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[229] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetInstanceCpus() *LabelSelector { + if x != nil { + return x.InstanceCpus } - return mi.MessageOf(x) + return nil } -// Deprecated: Use DisruptionBudget.ProtoReflect.Descriptor instead. -func (*DisruptionBudget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{229} +func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { + if x != nil { + return x.InstanceHypervisors + } + return nil } -func (x *DisruptionBudget) GetReasons() []string { +func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { if x != nil { - return x.Reasons + return x.InstanceGenerations } return nil } -func (x *DisruptionBudget) GetNodes() string { +func (x *NodePolicy) GetInstanceSizes() *LabelSelector { if x != nil { - return x.Nodes + return x.InstanceSizes } - return "" + return nil } -func (x *DisruptionBudget) GetSchedule() string { +func (x *NodePolicy) GetInstanceShapes() *LabelSelector { if x != nil { - return x.Schedule + return x.InstanceShapes } - return "" + return nil } -func (x *DisruptionBudget) GetDuration() string { +func (x *NodePolicy) GetInstanceTypes() *LabelSelector { if x != nil { - return x.Duration + return x.InstanceTypes } - return "" + return nil } -type DisruptionPolicy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConsolidateAfter string `protobuf:"bytes,1,opt,name=consolidate_after,json=consolidateAfter,proto3" json:"consolidate_after,omitempty"` // required by Karpenter - ConsolidationPolicy string `protobuf:"bytes,2,opt,name=consolidation_policy,json=consolidationPolicy,proto3" json:"consolidation_policy,omitempty"` // WhenEmpty / WhenEmptyOrUnderutilized - ExpireAfter string `protobuf:"bytes,3,opt,name=expire_after,json=expireAfter,proto3" json:"expire_after,omitempty"` - TtlSecondsAfterEmpty int32 `protobuf:"varint,4,opt,name=ttl_seconds_after_empty,json=ttlSecondsAfterEmpty,proto3" json:"ttl_seconds_after_empty,omitempty"` - TerminationGracePeriodSeconds int32 `protobuf:"varint,5,opt,name=termination_grace_period_seconds,json=terminationGracePeriodSeconds,proto3" json:"termination_grace_period_seconds,omitempty"` - Budgets []*DisruptionBudget `protobuf:"bytes,6,rep,name=budgets,proto3" json:"budgets,omitempty"` +func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { + if x != nil { + return x.InstanceLocalNvme + } + return nil } -func (x *DisruptionPolicy) Reset() { - *x = DisruptionPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[230] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetInstanceCategoriesTip() string { + if x != nil && x.InstanceCategoriesTip != nil { + return *x.InstanceCategoriesTip } + return "" } -func (x *DisruptionPolicy) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetInstanceFamiliesTip() string { + if x != nil && x.InstanceFamiliesTip != nil { + return *x.InstanceFamiliesTip + } + return "" } -func (*DisruptionPolicy) ProtoMessage() {} +func (x *NodePolicy) GetInstanceCpusTip() string { + if x != nil && x.InstanceCpusTip != nil { + return *x.InstanceCpusTip + } + return "" +} -func (x *DisruptionPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[230] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetInstanceHypervisorsTip() string { + if x != nil && x.InstanceHypervisorsTip != nil { + return *x.InstanceHypervisorsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. -func (*DisruptionPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} +func (x *NodePolicy) GetInstanceGenerationsTip() string { + if x != nil && x.InstanceGenerationsTip != nil { + return *x.InstanceGenerationsTip + } + return "" } -func (x *DisruptionPolicy) GetConsolidateAfter() string { - if x != nil { - return x.ConsolidateAfter +func (x *NodePolicy) GetInstanceSizesTip() string { + if x != nil && x.InstanceSizesTip != nil { + return *x.InstanceSizesTip } return "" } -func (x *DisruptionPolicy) GetConsolidationPolicy() string { - if x != nil { - return x.ConsolidationPolicy +func (x *NodePolicy) GetInstanceShapesTip() string { + if x != nil && x.InstanceShapesTip != nil { + return *x.InstanceShapesTip } return "" } -func (x *DisruptionPolicy) GetExpireAfter() string { - if x != nil { - return x.ExpireAfter +func (x *NodePolicy) GetInstanceLocalNvmeTip() string { + if x != nil && x.InstanceLocalNvmeTip != nil { + return *x.InstanceLocalNvmeTip } return "" } -func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { +func (x *NodePolicy) GetZones() *LabelSelector { if x != nil { - return x.TtlSecondsAfterEmpty + return x.Zones } - return 0 + return nil } -func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { +func (x *NodePolicy) GetArchitectures() *LabelSelector { if x != nil { - return x.TerminationGracePeriodSeconds + return x.Architectures } - return 0 + return nil } -func (x *DisruptionPolicy) GetBudgets() []*DisruptionBudget { +func (x *NodePolicy) GetCapacityTypes() *LabelSelector { if x != nil { - return x.Budgets + return x.CapacityTypes } return nil } -type ResourceLimits struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetOperatingSystems() *LabelSelector { + if x != nil { + return x.OperatingSystems + } + return nil +} - Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` +func (x *NodePolicy) GetWeight() int32 { + if x != nil { + return x.Weight + } + return 0 } -func (x *ResourceLimits) Reset() { - *x = ResourceLimits{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[231] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetZonesTip() string { + if x != nil && x.ZonesTip != nil { + return *x.ZonesTip } + return "" } -func (x *ResourceLimits) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetArchitecturesTip() string { + if x != nil && x.ArchitecturesTip != nil { + return *x.ArchitecturesTip + } + return "" } -func (*ResourceLimits) ProtoMessage() {} +func (x *NodePolicy) GetCapacityTypeTip() string { + if x != nil && x.CapacityTypeTip != nil { + return *x.CapacityTypeTip + } + return "" +} -func (x *ResourceLimits) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[231] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetOperatingSystemsTip() string { + if x != nil && x.OperatingSystemsTip != nil { + return *x.OperatingSystemsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. -func (*ResourceLimits) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} +func (x *NodePolicy) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil } -func (x *ResourceLimits) GetCpu() string { +func (x *NodePolicy) GetTaints() []*Taint { if x != nil { - return x.Cpu + return x.Taints } - return "" + return nil } -func (x *ResourceLimits) GetMemory() string { +func (x *NodePolicy) GetDisruption() *DisruptionPolicy { if x != nil { - return x.Memory + return x.Disruption } - return "" + return nil } -// Provider-specific stubs -type AWSNodeClassSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetLimits() *ResourceLimits { + if x != nil { + return x.Limits + } + return nil +} - SubnetSelectorTerms []*SubnetSelectorTerm `protobuf:"bytes,1,rep,name=subnet_selector_terms,json=subnetSelectorTerms,proto3" json:"subnet_selector_terms,omitempty"` - SecurityGroupSelectorTerms []*SecurityGroupSelectorTerm `protobuf:"bytes,2,rep,name=security_group_selector_terms,json=securityGroupSelectorTerms,proto3" json:"security_group_selector_terms,omitempty"` - CapacityReservationSelectorTerms []*CapacityReservationSelectorTerm `protobuf:"bytes,3,rep,name=capacity_reservation_selector_terms,json=capacityReservationSelectorTerms,proto3" json:"capacity_reservation_selector_terms,omitempty"` - AssociatePublicIpAddress *bool `protobuf:"varint,4,opt,name=associate_public_ip_address,json=associatePublicIpAddress,proto3,oneof" json:"associate_public_ip_address,omitempty"` - AmiSelectorTerms []*AMISelectorTerm `protobuf:"bytes,5,rep,name=ami_selector_terms,json=amiSelectorTerms,proto3" json:"ami_selector_terms,omitempty"` - AmiFamily *string `protobuf:"bytes,6,opt,name=ami_family,json=amiFamily,proto3,oneof" json:"ami_family,omitempty"` - UserData *string `protobuf:"bytes,7,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` - Role *string `protobuf:"bytes,8,opt,name=role,proto3,oneof" json:"role,omitempty"` - InstanceProfile *string `protobuf:"bytes,9,opt,name=instance_profile,json=instanceProfile,proto3,oneof" json:"instance_profile,omitempty"` - Tags map[string]string `protobuf:"bytes,10,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Kubelet *KubeletConfiguration `protobuf:"bytes,11,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` - BlockDeviceMappings []*BlockDeviceMapping `protobuf:"bytes,12,rep,name=block_device_mappings,json=blockDeviceMappings,proto3" json:"block_device_mappings,omitempty"` - InstanceStorePolicy *InstanceStorePolicy `protobuf:"varint,13,opt,name=instance_store_policy,json=instanceStorePolicy,proto3,enum=api.v1.InstanceStorePolicy,oneof" json:"instance_store_policy,omitempty"` - DetailedMonitoring *bool `protobuf:"varint,14,opt,name=detailed_monitoring,json=detailedMonitoring,proto3,oneof" json:"detailed_monitoring,omitempty"` - MetadataOptions *MetadataOptions `protobuf:"bytes,15,opt,name=metadata_options,json=metadataOptions,proto3,oneof" json:"metadata_options,omitempty"` - Context *string `protobuf:"bytes,16,opt,name=context,proto3,oneof" json:"context,omitempty"` +func (x *NodePolicy) GetStartupTaints() []*Taint { + if x != nil { + return x.StartupTaints + } + return nil } -func (x *AWSNodeClassSpec) Reset() { - *x = AWSNodeClassSpec{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[232] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetTaintsTip() string { + if x != nil && x.TaintsTip != nil { + return *x.TaintsTip } + return "" } -func (x *AWSNodeClassSpec) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetDisruptionsTip() string { + if x != nil && x.DisruptionsTip != nil { + return *x.DisruptionsTip + } + return "" } -func (*AWSNodeClassSpec) ProtoMessage() {} +func (x *NodePolicy) GetLimitsTip() string { + if x != nil && x.LimitsTip != nil { + return *x.LimitsTip + } + return "" +} -func (x *AWSNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[232] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetStartupTaintsTip() string { + if x != nil && x.StartupTaintsTip != nil { + return *x.StartupTaintsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. -func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} +func (x *NodePolicy) GetMasterOverrideRoleName() string { + if x != nil { + return x.MasterOverrideRoleName + } + return "" } -func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { +func (x *NodePolicy) GetNodePoolName() string { if x != nil { - return x.SubnetSelectorTerms + return x.NodePoolName } - return nil + return "" } -func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { +func (x *NodePolicy) GetNodeClassName() string { if x != nil { - return x.SecurityGroupSelectorTerms + return x.NodeClassName } - return nil + return "" } -func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { +func (x *NodePolicy) GetAws() *AWSNodeClassSpec { if x != nil { - return x.CapacityReservationSelectorTerms + return x.Aws } return nil } -func (x *AWSNodeClassSpec) GetAssociatePublicIpAddress() bool { - if x != nil && x.AssociatePublicIpAddress != nil { - return *x.AssociatePublicIpAddress +func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { + if x != nil { + return x.Gcp } - return false + return nil } -func (x *AWSNodeClassSpec) GetAmiSelectorTerms() []*AMISelectorTerm { +func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { if x != nil { - return x.AmiSelectorTerms + return x.Azure } return nil } -func (x *AWSNodeClassSpec) GetAmiFamily() string { - if x != nil && x.AmiFamily != nil { - return *x.AmiFamily +func (x *NodePolicy) GetOci() *OCINodeClassSpec { + if x != nil { + return x.Oci } - return "" + return nil } -func (x *AWSNodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData +func (x *NodePolicy) GetCloudProviderId() int64 { + if x != nil && x.CloudProviderId != nil { + return *x.CloudProviderId } - return "" + return 0 } -func (x *AWSNodeClassSpec) GetRole() string { - if x != nil && x.Role != nil { - return *x.Role +func (x *NodePolicy) GetCloudProvider() *CloudProvider { + if x != nil { + return x.CloudProvider } - return "" + return nil } -func (x *AWSNodeClassSpec) GetInstanceProfile() string { - if x != nil && x.InstanceProfile != nil { - return *x.InstanceProfile +func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { + if x != nil { + return x.ZonalShift } - return "" + return nil } -func (x *AWSNodeClassSpec) GetTags() map[string]string { +func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { if x != nil { - return x.Tags + return x.Raw } return nil } -func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { +func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kubelet + return x.CreatedAt } return nil } -func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { +func (x *NodePolicy) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.BlockDeviceMappings + return x.UpdatedAt } return nil } -func (x *AWSNodeClassSpec) GetInstanceStorePolicy() InstanceStorePolicy { - if x != nil && x.InstanceStorePolicy != nil { - return *x.InstanceStorePolicy +func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { + if x != nil { + return x.DeletedAt } - return InstanceStorePolicy_INSTANCE_STORE_POLICY_RAID0 + return nil } -func (x *AWSNodeClassSpec) GetDetailedMonitoring() bool { - if x != nil && x.DetailedMonitoring != nil { - return *x.DetailedMonitoring +func (x *NodePolicy) GetSource() string { + if x != nil { + return x.Source } - return false + return "" } -func (x *AWSNodeClassSpec) GetMetadataOptions() *MetadataOptions { +func (x *NodePolicy) GetSourceClusterId() string { if x != nil { - return x.MetadataOptions + return x.SourceClusterId } - return nil + return "" } -func (x *AWSNodeClassSpec) GetContext() string { - if x != nil && x.Context != nil { - return *x.Context +func (x *NodePolicy) GetUnrepresentedRequirementKeys() []string { + if x != nil { + return x.UnrepresentedRequirementKeys } - return "" + return nil } -type GetInstanceFamiliesRequest struct { +type PreviewNodeRecommendationConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,6,rep,name=policies,proto3" json:"policies,omitempty"` + PolicyIds []string `protobuf:"bytes,11,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // if set, `repeated NodePolicy policies = 6;` is ignored } -func (x *GetInstanceFamiliesRequest) Reset() { - *x = GetInstanceFamiliesRequest{} +func (x *PreviewNodeRecommendationConfigRequest) Reset() { + *x = PreviewNodeRecommendationConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[233] + mi := &file_api_v1_recommendation_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesRequest) String() string { +func (x *PreviewNodeRecommendationConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesRequest) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} -func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[233] +func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[252] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19066,43 +22531,64 @@ func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceFamiliesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceFamiliesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{233} +// Deprecated: Use PreviewNodeRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{252} } -func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { +func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { if x != nil { - return x.CloudProviders + return x.TeamId + } + return "" +} + +func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { + if x != nil { + return x.Policies } return nil } -type GetInstanceFamiliesResponse struct { +func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds + } + return nil +} + +type PreviewNodeRecommendationConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceFamilies []*InstanceFamily `protobuf:"bytes,1,rep,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` + Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` } -func (x *GetInstanceFamiliesResponse) Reset() { - *x = GetInstanceFamiliesResponse{} +func (x *PreviewNodeRecommendationConfigResponse) Reset() { + *x = PreviewNodeRecommendationConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[234] + mi := &file_api_v1_recommendation_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesResponse) String() string { +func (x *PreviewNodeRecommendationConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesResponse) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} -func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[234] +func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[253] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19113,43 +22599,51 @@ func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceFamiliesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceFamiliesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{234} +// Deprecated: Use PreviewNodeRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{253} } -func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { +func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { if x != nil { - return x.InstanceFamilies + return x.Nrc } return nil } -type GetInstanceSizesRequest struct { +type NodeRecommendationConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") -} - -func (x *GetInstanceSizesRequest) Reset() { - *x = GetInstanceSizesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[235] + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyContainersJson string `protobuf:"bytes,6,opt,name=policy_containers_json,json=policyContainersJson,proto3" json:"policy_containers_json,omitempty"` + PolicyContainersYaml string `protobuf:"bytes,7,opt,name=policy_containers_yaml,json=policyContainersYaml,proto3" json:"policy_containers_yaml,omitempty"` + Status RecommendationStatus `protobuf:"varint,11,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` + Error string `protobuf:"bytes,12,opt,name=error,proto3" json:"error,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` +} + +func (x *NodeRecommendationConfig) Reset() { + *x = NodeRecommendationConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceSizesRequest) String() string { +func (x *NodeRecommendationConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceSizesRequest) ProtoMessage() {} +func (*NodeRecommendationConfig) ProtoMessage() {} -func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[235] +func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[254] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19160,91 +22654,100 @@ func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceSizesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceSizesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{235} +// Deprecated: Use NodeRecommendationConfig.ProtoReflect.Descriptor instead. +func (*NodeRecommendationConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{254} } -func (x *GetInstanceSizesRequest) GetCloudProviders() []string { +func (x *NodeRecommendationConfig) GetId() string { if x != nil { - return x.CloudProviders + return x.Id } - return nil + return "" } -type GetInstanceSizesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodeRecommendationConfig) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} - InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` +func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { + if x != nil { + return x.PolicyContainersJson + } + return "" } -func (x *GetInstanceSizesResponse) Reset() { - *x = GetInstanceSizesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[236] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { + if x != nil { + return x.PolicyContainersYaml } + return "" } -func (x *GetInstanceSizesResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodeRecommendationConfig) GetStatus() RecommendationStatus { + if x != nil { + return x.Status + } + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -func (*GetInstanceSizesResponse) ProtoMessage() {} +func (x *NodeRecommendationConfig) GetError() string { + if x != nil { + return x.Error + } + return "" +} -func (x *GetInstanceSizesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[236] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } - return mi.MessageOf(x) + return nil } -// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} +func (x *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil } -func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { +func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceSizes + return x.DeletedAt } return nil } -type InstanceFamily struct { +type SuggestedKarpenterConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *InstanceFamily) Reset() { - *x = InstanceFamily{} +func (x *SuggestedKarpenterConfigRequest) Reset() { + *x = SuggestedKarpenterConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[237] + mi := &file_api_v1_recommendation_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceFamily) String() string { +func (x *SuggestedKarpenterConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceFamily) ProtoMessage() {} +func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} -func (x *InstanceFamily) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[237] +func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[255] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19255,51 +22758,51 @@ func (x *InstanceFamily) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. -func (*InstanceFamily) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} +// Deprecated: Use SuggestedKarpenterConfigRequest.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{255} } -func (x *InstanceFamily) GetName() string { +func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *InstanceFamily) GetProviderName() string { +func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { if x != nil { - return x.ProviderName + return x.TeamId } return "" } -type InstanceSize struct { +type SuggestedKarpenterConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + NgToOriginal map[string]*NodeRecommendationConfig `protobuf:"bytes,1,rep,name=ng_to_original,json=ngToOriginal,proto3" json:"ng_to_original,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NgToSuggested map[string]*NodeRecommendationConfig `protobuf:"bytes,11,rep,name=ng_to_suggested,json=ngToSuggested,proto3" json:"ng_to_suggested,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *InstanceSize) Reset() { - *x = InstanceSize{} +func (x *SuggestedKarpenterConfigResponse) Reset() { + *x = SuggestedKarpenterConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[238] + mi := &file_api_v1_recommendation_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceSize) String() string { +func (x *SuggestedKarpenterConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceSize) ProtoMessage() {} +func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} -func (x *InstanceSize) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[238] +func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[256] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19310,52 +22813,61 @@ func (x *InstanceSize) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceSize.ProtoReflect.Descriptor instead. -func (*InstanceSize) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{238} +// Deprecated: Use SuggestedKarpenterConfigResponse.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{256} } -func (x *InstanceSize) GetName() string { +func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { if x != nil { - return x.Name + return x.NgToOriginal } - return "" + return nil } -func (x *InstanceSize) GetProviderName() string { +func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { if x != nil { - return x.ProviderName + return x.NgToSuggested } - return "" + return nil } -type InstanceCategory struct { +type SuggestNodePolicyImprovementsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // e.g., "c", "D", "n" - Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` // e.g., "Compute Optimized" - ProviderName string `protobuf:"bytes,3,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure", "GCP" + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Required. Suggestions are computed per (policy, cluster) pair: the evidence is the + // cluster's live NodePools/nodes/workloads attributed to this policy. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // Stored policy to evaluate. Takes precedence over `policy`, mirroring + // PreviewNodeRecommendationConfigRequest. + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // Inline draft to evaluate when `policy_id` is empty. Always computed live, never + // persisted. + Policy *NodePolicy `protobuf:"bytes,4,opt,name=policy,proto3" json:"policy,omitempty"` + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + Window ProfileWindow `protobuf:"varint,5,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } -func (x *InstanceCategory) Reset() { - *x = InstanceCategory{} +func (x *SuggestNodePolicyImprovementsRequest) Reset() { + *x = SuggestNodePolicyImprovementsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[239] + mi := &file_api_v1_recommendation_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCategory) String() string { +func (x *SuggestNodePolicyImprovementsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCategory) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsRequest) ProtoMessage() {} -func (x *InstanceCategory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[239] +func (x *SuggestNodePolicyImprovementsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[257] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19366,58 +22878,84 @@ func (x *InstanceCategory) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceCategory.ProtoReflect.Descriptor instead. -func (*InstanceCategory) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{239} +// Deprecated: Use SuggestNodePolicyImprovementsRequest.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{257} } -func (x *InstanceCategory) GetKey() string { +func (x *SuggestNodePolicyImprovementsRequest) GetTeamId() string { if x != nil { - return x.Key + return x.TeamId } return "" } -func (x *InstanceCategory) GetLabel() string { +func (x *SuggestNodePolicyImprovementsRequest) GetClusterId() string { if x != nil { - return x.Label + return x.ClusterId } return "" } -func (x *InstanceCategory) GetProviderName() string { +func (x *SuggestNodePolicyImprovementsRequest) GetPolicyId() string { if x != nil { - return x.ProviderName + return x.PolicyId } return "" } -type InstanceCPU struct { +func (x *SuggestNodePolicyImprovementsRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy + } + return nil +} + +func (x *SuggestNodePolicyImprovementsRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +type SuggestNodePolicyImprovementsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Vcpu int32 `protobuf:"varint,1,opt,name=vcpu,proto3" json:"vcpu,omitempty"` // e.g., 2, 4, 8, 16 - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" + Original *NodePolicy `protobuf:"bytes,1,opt,name=original,proto3" json:"original,omitempty"` + // Deep copy of `original` with every suggestion applied — the "accept all" payload. + Suggested *NodePolicy `protobuf:"bytes,2,opt,name=suggested,proto3" json:"suggested,omitempty"` + Suggestions []*NodePolicySuggestion `protobuf:"bytes,3,rep,name=suggestions,proto3" json:"suggestions,omitempty"` + Context *SuggestionContext `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // False when the response was computed synchronously for this request rather than + // served from a precomputed row. + FromCache bool `protobuf:"varint,6,opt,name=from_cache,json=fromCache,proto3" json:"from_cache,omitempty"` + // True when the served row predates the policy's current revision (or an engine + // rule-set change). A background refresh has been enqueued; clients should surface + // the computed_at staleness and may refetch shortly. Large clusters serve stale + // rather than recomputing in the request path. + Stale bool `protobuf:"varint,7,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *InstanceCPU) Reset() { - *x = InstanceCPU{} +func (x *SuggestNodePolicyImprovementsResponse) Reset() { + *x = SuggestNodePolicyImprovementsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[240] + mi := &file_api_v1_recommendation_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCPU) String() string { +func (x *SuggestNodePolicyImprovementsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCPU) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsResponse) ProtoMessage() {} -func (x *InstanceCPU) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[240] +func (x *SuggestNodePolicyImprovementsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[258] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19428,51 +22966,88 @@ func (x *InstanceCPU) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceCPU.ProtoReflect.Descriptor instead. -func (*InstanceCPU) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{240} +// Deprecated: Use SuggestNodePolicyImprovementsResponse.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{258} } -func (x *InstanceCPU) GetVcpu() int32 { +func (x *SuggestNodePolicyImprovementsResponse) GetOriginal() *NodePolicy { if x != nil { - return x.Vcpu + return x.Original } - return 0 + return nil } -func (x *InstanceCPU) GetProviderName() string { +func (x *SuggestNodePolicyImprovementsResponse) GetSuggested() *NodePolicy { if x != nil { - return x.ProviderName + return x.Suggested } - return "" + return nil } -type InstanceTypeName struct { +func (x *SuggestNodePolicyImprovementsResponse) GetSuggestions() []*NodePolicySuggestion { + if x != nil { + return x.Suggestions + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetContext() *SuggestionContext { + if x != nil { + return x.Context + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetFromCache() bool { + if x != nil { + return x.FromCache + } + return false +} + +func (x *SuggestNodePolicyImprovementsResponse) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +type ListClusterNodePolicySuggestionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // e.g., "m5.large", "Standard_D4s_v3" - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + Window ProfileWindow `protobuf:"varint,3,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } -func (x *InstanceTypeName) Reset() { - *x = InstanceTypeName{} +func (x *ListClusterNodePolicySuggestionsRequest) Reset() { + *x = ListClusterNodePolicySuggestionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[241] + mi := &file_api_v1_recommendation_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceTypeName) String() string { +func (x *ListClusterNodePolicySuggestionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceTypeName) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsRequest) ProtoMessage() {} -func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[241] +func (x *ListClusterNodePolicySuggestionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[259] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19483,50 +23058,65 @@ func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceTypeName.ProtoReflect.Descriptor instead. -func (*InstanceTypeName) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{241} +// Deprecated: Use ListClusterNodePolicySuggestionsRequest.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{259} } -func (x *InstanceTypeName) GetName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -func (x *InstanceTypeName) GetProviderName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetClusterId() string { if x != nil { - return x.ProviderName + return x.ClusterId } return "" } -type GetInstanceCategoriesRequest struct { +func (x *ListClusterNodePolicySuggestionsRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +type ListClusterNodePolicySuggestionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` + Policies []*NodePolicySuggestionsForPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // The oldest computed_at among the included policies — the bound a caller can trust + // the whole response by, even though each policy's own row has its own computed_at. + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // True when at least one policy has no row yet, or a row stale enough to recompute. + // A background refresh of the whole cluster has been enqueued; clients should + // surface staleness and may refetch shortly, the same contract as + // SuggestNodePolicyImprovementsResponse.stale. + Stale bool `protobuf:"varint,3,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *GetInstanceCategoriesRequest) Reset() { - *x = GetInstanceCategoriesRequest{} +func (x *ListClusterNodePolicySuggestionsResponse) Reset() { + *x = ListClusterNodePolicySuggestionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[242] + mi := &file_api_v1_recommendation_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCategoriesRequest) String() string { +func (x *ListClusterNodePolicySuggestionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCategoriesRequest) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsResponse) ProtoMessage() {} -func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[242] +func (x *ListClusterNodePolicySuggestionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[260] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19537,43 +23127,73 @@ func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} +// Deprecated: Use ListClusterNodePolicySuggestionsResponse.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{260} } -func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { +func (x *ListClusterNodePolicySuggestionsResponse) GetPolicies() []*NodePolicySuggestionsForPolicy { if x != nil { - return x.CloudProviders + return x.Policies } return nil } -type GetInstanceCategoriesResponse struct { +func (x *ListClusterNodePolicySuggestionsResponse) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *ListClusterNodePolicySuggestionsResponse) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +// NodePolicySuggestionsForPolicy is one policy's entry in a cluster-wide suggestions +// list: everything ListClusterNodePolicySuggestions can say about a single policy +// without the original/suggested NodePolicy payload SuggestNodePolicyImprovements +// carries — that RPC is still where accepting a suggestion happens. +type NodePolicySuggestionsForPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + // "dakr" or "cluster", mirroring NodePolicy.source — cluster-managed mirrors get + // suggestions surfaced here the same as dakr-authored policies, visualization-only: + // accepting one still routes to that mirror's own Karpenter manifest, not this RPC. + PolicySource string `protobuf:"bytes,3,opt,name=policy_source,json=policySource,proto3" json:"policy_source,omitempty"` + Suggestions []*NodePolicySuggestion `protobuf:"bytes,4,rep,name=suggestions,proto3" json:"suggestions,omitempty"` + Context *SuggestionContext `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // True when this policy's own row is missing, predates its current revision, or + // predates an engine rule-set change — same definition as + // SuggestNodePolicyImprovementsResponse.stale, just scoped to this one policy. + Stale bool `protobuf:"varint,7,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *GetInstanceCategoriesResponse) Reset() { - *x = GetInstanceCategoriesResponse{} +func (x *NodePolicySuggestionsForPolicy) Reset() { + *x = NodePolicySuggestionsForPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[243] + mi := &file_api_v1_recommendation_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCategoriesResponse) String() string { +func (x *NodePolicySuggestionsForPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCategoriesResponse) ProtoMessage() {} +func (*NodePolicySuggestionsForPolicy) ProtoMessage() {} -func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[243] +func (x *NodePolicySuggestionsForPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[261] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19584,43 +23204,139 @@ func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCategoriesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceCategoriesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{243} +// Deprecated: Use NodePolicySuggestionsForPolicy.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestionsForPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{261} } -func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { +func (x *NodePolicySuggestionsForPolicy) GetPolicyId() string { if x != nil { - return x.InstanceCategories + return x.PolicyId + } + return "" +} + +func (x *NodePolicySuggestionsForPolicy) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *NodePolicySuggestionsForPolicy) GetPolicySource() string { + if x != nil { + return x.PolicySource + } + return "" +} + +func (x *NodePolicySuggestionsForPolicy) GetSuggestions() []*NodePolicySuggestion { + if x != nil { + return x.Suggestions } return nil } -type GetInstanceCPUsRequest struct { +func (x *NodePolicySuggestionsForPolicy) GetContext() *SuggestionContext { + if x != nil { + return x.Context + } + return nil +} + +func (x *NodePolicySuggestionsForPolicy) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *NodePolicySuggestionsForPolicy) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +type NodePolicySuggestion struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` -} - -func (x *GetInstanceCPUsRequest) Reset() { - *x = GetInstanceCPUsRequest{} + // Stable rule identifier, e.g. "disruption.consolidation_policy". Stable across + // engine versions so the frontend can special-case rendering per rule. + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Group SuggestionGroup `protobuf:"varint,2,opt,name=group,proto3,enum=api.v1.SuggestionGroup" json:"group,omitempty"` + Flavor SuggestionFlavor `protobuf:"varint,3,opt,name=flavor,proto3,enum=api.v1.SuggestionFlavor" json:"flavor,omitempty"` + Severity SuggestionSeverity `protobuf:"varint,4,opt,name=severity,proto3,enum=api.v1.SuggestionSeverity" json:"severity,omitempty"` + // NodePolicy field the suggestion mutates, as a proto field path relative to + // NodePolicy, e.g. "disruption.consolidate_after", "capacity_types" or "limits.cpu". + // This names the FIRST (or only) field the suggestion changes; additional_field_changes + // below carries the rest for the rare suggestion that changes more than one. Two + // guarantees the per-card accept in the UI depends on, over the union of this path and + // every additional_field_changes[].field_path. First, the paths name exactly what this + // suggestion changes and nothing more: taking `original` and copying only these paths' + // values out of `suggested` yields the same policy as applying this one suggestion, so a + // card can be accepted on its own. Second, at most one suggestion per response claims a + // given path, and no claimed path is an ancestor of another — "limits" and "limits.cpu" + // never both appear — so accepting one card can never carry a neighbouring card's change + // with it. A rule with a finding on fields that do not belong together emits separate + // suggestions instead of naming their parent. + // + // Empty for a SUGGESTION_GROUP_COVERAGE suggestion, the one deliberate exception: it names + // no field because it does not mutate this NodePolicy at all. current_value_yaml and + // suggested_value_yaml are empty for the same reason. + FieldPath string `protobuf:"bytes,5,opt,name=field_path,json=fieldPath,proto3" json:"field_path,omitempty"` + Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` + // Detailed explanation of why this change is being suggested, written against the + // cited evidence. Rendered as the card body. + Rationale string `protobuf:"bytes,7,opt,name=rationale,proto3" json:"rationale,omitempty"` + // Display-ready YAML renderings of the field's current and suggested values, for + // field_path above. + CurrentValueYaml string `protobuf:"bytes,8,opt,name=current_value_yaml,json=currentValueYaml,proto3" json:"current_value_yaml,omitempty"` + SuggestedValueYaml string `protobuf:"bytes,9,opt,name=suggested_value_yaml,json=suggestedValueYaml,proto3" json:"suggested_value_yaml,omitempty"` + Evidence []*SuggestionEvidence `protobuf:"bytes,10,rep,name=evidence,proto3" json:"evidence,omitempty"` + // A directly attributable, non-overlapping monthly saving: a price delta (spot vs + // on-demand, gp2 vs gp3, a cheaper eligible candidate) applied to a known quantity. Safe + // to sum across every suggestion in a response, including others on the same policy, + // because each rule that sets this draws from its own independent price comparison — + // never from a shared, policy-wide figure two rules could both cite. + EstimatedMonthlySavingsUsd *float64 `protobuf:"fixed64,11,opt,name=estimated_monthly_savings_usd,json=estimatedMonthlySavingsUsd,proto3,oneof" json:"estimated_monthly_savings_usd,omitempty"` + // Additional NodePolicy fields this suggestion mutates together with field_path, when + // loosening several selector fields as one combination fits the population better than + // loosening any single one. Empty for almost every suggestion; see field_path's comment + // for the guarantees that apply across the whole set. + AdditionalFieldChanges []*SuggestionFieldChange `protobuf:"bytes,12,rep,name=additional_field_changes,json=additionalFieldChanges,proto3" json:"additional_field_changes,omitempty"` + // The most this suggestion could save if fully realized, for a rule whose saving is real + // but not directly attributable to this one change: reclaiming a pool's idle capacity + // (disruption.consolidation_policy, disruption.consolidate_after, disruption.budgets, + // requirements.size_mismatch) all draw the same ceiling from that pool's own idle spend, + // since each only widens Karpenter's ability to reclaim it rather than guaranteeing it + // does. Unlike estimated_monthly_savings_usd, this is NOT safe to sum across a policy: + // when more than one suggestion on the same policy sets it, the true ceiling is the + // maximum across them, not their total, because they are bounds on the same underlying + // capacity rather than independent savings. A rule never sets both this and + // estimated_monthly_savings_usd on the same suggestion. + UpperBoundMonthlySavingsUsd *float64 `protobuf:"fixed64,13,opt,name=upper_bound_monthly_savings_usd,json=upperBoundMonthlySavingsUsd,proto3,oneof" json:"upper_bound_monthly_savings_usd,omitempty"` +} + +func (x *NodePolicySuggestion) Reset() { + *x = NodePolicySuggestion{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[244] + mi := &file_api_v1_recommendation_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCPUsRequest) String() string { +func (x *NodePolicySuggestion) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCPUsRequest) ProtoMessage() {} +func (*NodePolicySuggestion) ProtoMessage() {} -func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[244] +func (x *NodePolicySuggestion) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[262] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19631,90 +23347,134 @@ func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCPUsRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceCPUsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{244} +// Deprecated: Use NodePolicySuggestion.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestion) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{262} } -func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { +func (x *NodePolicySuggestion) GetRuleId() string { if x != nil { - return x.CloudProviders + return x.RuleId } - return nil + return "" } -type GetInstanceCPUsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicySuggestion) GetGroup() SuggestionGroup { + if x != nil { + return x.Group + } + return SuggestionGroup_SUGGESTION_GROUP_UNSPECIFIED +} - InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` +func (x *NodePolicySuggestion) GetFlavor() SuggestionFlavor { + if x != nil { + return x.Flavor + } + return SuggestionFlavor_SUGGESTION_FLAVOR_UNSPECIFIED } -func (x *GetInstanceCPUsResponse) Reset() { - *x = GetInstanceCPUsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[245] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicySuggestion) GetSeverity() SuggestionSeverity { + if x != nil { + return x.Severity } + return SuggestionSeverity_SUGGESTION_SEVERITY_UNSPECIFIED } -func (x *GetInstanceCPUsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicySuggestion) GetFieldPath() string { + if x != nil { + return x.FieldPath + } + return "" } -func (*GetInstanceCPUsResponse) ProtoMessage() {} +func (x *NodePolicySuggestion) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} -func (x *GetInstanceCPUsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[245] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicySuggestion) GetRationale() string { + if x != nil { + return x.Rationale } - return mi.MessageOf(x) + return "" } -// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} +func (x *NodePolicySuggestion) GetCurrentValueYaml() string { + if x != nil { + return x.CurrentValueYaml + } + return "" } -func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { +func (x *NodePolicySuggestion) GetSuggestedValueYaml() string { if x != nil { - return x.InstanceCpus + return x.SuggestedValueYaml + } + return "" +} + +func (x *NodePolicySuggestion) GetEvidence() []*SuggestionEvidence { + if x != nil { + return x.Evidence } return nil } -type GetInstanceTypeNamesRequest struct { +func (x *NodePolicySuggestion) GetEstimatedMonthlySavingsUsd() float64 { + if x != nil && x.EstimatedMonthlySavingsUsd != nil { + return *x.EstimatedMonthlySavingsUsd + } + return 0 +} + +func (x *NodePolicySuggestion) GetAdditionalFieldChanges() []*SuggestionFieldChange { + if x != nil { + return x.AdditionalFieldChanges + } + return nil +} + +func (x *NodePolicySuggestion) GetUpperBoundMonthlySavingsUsd() float64 { + if x != nil && x.UpperBoundMonthlySavingsUsd != nil { + return *x.UpperBoundMonthlySavingsUsd + } + return 0 +} + +// SuggestionFieldChange is one additional NodePolicy field a suggestion mutates, beyond +// field_path/current_value_yaml/suggested_value_yaml on NodePolicySuggestion, which always +// name the first (or only) one. Almost every suggestion touches exactly one field and +// leaves NodePolicySuggestion.additional_field_changes empty; only a combination-search +// suggestion (currently just requirements.overpinned) populates it. +type SuggestionFieldChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` + FieldPath string `protobuf:"bytes,1,opt,name=field_path,json=fieldPath,proto3" json:"field_path,omitempty"` + CurrentValueYaml string `protobuf:"bytes,2,opt,name=current_value_yaml,json=currentValueYaml,proto3" json:"current_value_yaml,omitempty"` + SuggestedValueYaml string `protobuf:"bytes,3,opt,name=suggested_value_yaml,json=suggestedValueYaml,proto3" json:"suggested_value_yaml,omitempty"` } -func (x *GetInstanceTypeNamesRequest) Reset() { - *x = GetInstanceTypeNamesRequest{} +func (x *SuggestionFieldChange) Reset() { + *x = SuggestionFieldChange{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[246] + mi := &file_api_v1_recommendation_proto_msgTypes[263] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceTypeNamesRequest) String() string { +func (x *SuggestionFieldChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceTypeNamesRequest) ProtoMessage() {} +func (*SuggestionFieldChange) ProtoMessage() {} -func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[246] +func (x *SuggestionFieldChange) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[263] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19725,43 +23485,70 @@ func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceTypeNamesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceTypeNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{246} +// Deprecated: Use SuggestionFieldChange.ProtoReflect.Descriptor instead. +func (*SuggestionFieldChange) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{263} } -func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { +func (x *SuggestionFieldChange) GetFieldPath() string { if x != nil { - return x.CloudProviders + return x.FieldPath } - return nil + return "" } -type GetInstanceTypeNamesResponse struct { +func (x *SuggestionFieldChange) GetCurrentValueYaml() string { + if x != nil { + return x.CurrentValueYaml + } + return "" +} + +func (x *SuggestionFieldChange) GetSuggestedValueYaml() string { + if x != nil { + return x.SuggestedValueYaml + } + return "" +} + +// SuggestionEvidence is one observed data point cited by a suggestion, e.g. +// label="p95 CPU utilization (7d)", value="22%", detail="across 14 nodes managed by +// nodepool workers-a". +type SuggestionEvidence struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` + Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Detail string `protobuf:"bytes,3,opt,name=detail,proto3" json:"detail,omitempty"` + Scope EvidenceScope `protobuf:"varint,4,opt,name=scope,proto3,enum=api.v1.EvidenceScope" json:"scope,omitempty"` + // The workloads this citation names, in the order they appear in `detail` and in + // the rationale. Carries the identity behind the "namespace/name" text so the UI + // can open each one's drawer, which needs the uid and kind that the display + // string drops. Empty for citations about nodes or pricing rather than + // workloads, and for a workload whose metadata read missed it (the display + // string falls back to a bare uid there, and the drawer needs the kind too). + Workloads []*SuggestionWorkloadRef `protobuf:"bytes,5,rep,name=workloads,proto3" json:"workloads,omitempty"` } -func (x *GetInstanceTypeNamesResponse) Reset() { - *x = GetInstanceTypeNamesResponse{} +func (x *SuggestionEvidence) Reset() { + *x = SuggestionEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[247] + mi := &file_api_v1_recommendation_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceTypeNamesResponse) String() string { +func (x *SuggestionEvidence) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceTypeNamesResponse) ProtoMessage() {} +func (*SuggestionEvidence) ProtoMessage() {} -func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[247] +func (x *SuggestionEvidence) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[264] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19772,44 +23559,84 @@ func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} +// Deprecated: Use SuggestionEvidence.ProtoReflect.Descriptor instead. +func (*SuggestionEvidence) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{264} } -func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { +func (x *SuggestionEvidence) GetLabel() string { if x != nil { - return x.InstanceTypes + return x.Label } - return nil + return "" } -type SubnetSelectorTerm struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +func (x *SuggestionEvidence) GetValue() string { + if x != nil { + return x.Value + } + return "" } -func (x *SubnetSelectorTerm) Reset() { - *x = SubnetSelectorTerm{} +func (x *SuggestionEvidence) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +func (x *SuggestionEvidence) GetScope() EvidenceScope { + if x != nil { + return x.Scope + } + return EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED +} + +func (x *SuggestionEvidence) GetWorkloads() []*SuggestionWorkloadRef { + if x != nil { + return x.Workloads + } + return nil +} + +// SuggestionWorkloadRef identifies one workload named by a suggestion well enough +// to open its drawer: the panel takes uid, kind and the cluster the suggestion was +// computed for. +type SuggestionWorkloadRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + // Kubernetes kind as written on the owner ("Deployment", "StatefulSet"), not the + // K8sObjectKind enum: this is passed straight to GetWorkload, which matches on + // the string. + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // Exactly the text this workload appears as in `detail` and in the rationale, so + // the UI links the same token the sentence was written with instead of + // reassembling one and hoping it matches. + Display string `protobuf:"bytes,5,opt,name=display,proto3" json:"display,omitempty"` +} + +func (x *SuggestionWorkloadRef) Reset() { + *x = SuggestionWorkloadRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[248] + mi := &file_api_v1_recommendation_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SubnetSelectorTerm) String() string { +func (x *SuggestionWorkloadRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SubnetSelectorTerm) ProtoMessage() {} +func (*SuggestionWorkloadRef) ProtoMessage() {} -func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[248] +func (x *SuggestionWorkloadRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[265] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19820,52 +23647,87 @@ func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SubnetSelectorTerm.ProtoReflect.Descriptor instead. -func (*SubnetSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{248} +// Deprecated: Use SuggestionWorkloadRef.ProtoReflect.Descriptor instead. +func (*SuggestionWorkloadRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{265} } -func (x *SubnetSelectorTerm) GetTags() map[string]string { +func (x *SuggestionWorkloadRef) GetUid() string { if x != nil { - return x.Tags + return x.Uid } - return nil + return "" } -func (x *SubnetSelectorTerm) GetId() string { +func (x *SuggestionWorkloadRef) GetKind() string { if x != nil { - return x.Id + return x.Kind } return "" } -type SecurityGroupSelectorTerm struct { +func (x *SuggestionWorkloadRef) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SuggestionWorkloadRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SuggestionWorkloadRef) GetDisplay() string { + if x != nil { + return x.Display + } + return "" +} + +// SuggestionContext describes the evidence population a suggestion run was computed +// against, so the UI can qualify the results ("based on 14 nodes across 2 nodepools, +// last 7d, 23 workload profiles"). +type SuggestionContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + // Live NodePool names attributed to the policy via the dakr.devzero.io/node-policy-id + // annotation. Empty on cold-start. + MatchedNodePools []string `protobuf:"bytes,2,rep,name=matched_node_pools,json=matchedNodePools,proto3" json:"matched_node_pools,omitempty"` + NodeCount int32 `protobuf:"varint,3,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` + EvidenceScope EvidenceScope `protobuf:"varint,4,opt,name=evidence_scope,json=evidenceScope,proto3,enum=api.v1.EvidenceScope" json:"evidence_scope,omitempty"` + // Number of fresh workload profile snapshots that informed the run. + WorkloadProfileCount int32 `protobuf:"varint,5,opt,name=workload_profile_count,json=workloadProfileCount,proto3" json:"workload_profile_count,omitempty"` + // For cluster-managed policies only: NodePool requirement keys present on the + // customer's CRD that this policy view cannot represent (Azure/GCP SKU keys, + // custom label requirements). Non-empty means both the suggestions and the + // compiled preview describe a partial picture of the real NodePool, and the + // UI should say so. Always empty for dakr-authored policies. + UnrepresentedRequirementKeys []string `protobuf:"bytes,6,rep,name=unrepresented_requirement_keys,json=unrepresentedRequirementKeys,proto3" json:"unrepresented_requirement_keys,omitempty"` } -func (x *SecurityGroupSelectorTerm) Reset() { - *x = SecurityGroupSelectorTerm{} +func (x *SuggestionContext) Reset() { + *x = SuggestionContext{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[249] + mi := &file_api_v1_recommendation_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SecurityGroupSelectorTerm) String() string { +func (x *SuggestionContext) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SecurityGroupSelectorTerm) ProtoMessage() {} +func (*SuggestionContext) ProtoMessage() {} -func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[249] +func (x *SuggestionContext) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[266] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19876,59 +23738,80 @@ func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. -func (*SecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{249} +// Deprecated: Use SuggestionContext.ProtoReflect.Descriptor instead. +func (*SuggestionContext) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} } -func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { +func (x *SuggestionContext) GetWindow() ProfileWindow { if x != nil { - return x.Tags + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *SuggestionContext) GetMatchedNodePools() []string { + if x != nil { + return x.MatchedNodePools } return nil } -func (x *SecurityGroupSelectorTerm) GetId() string { +func (x *SuggestionContext) GetNodeCount() int32 { if x != nil { - return x.Id + return x.NodeCount } - return "" + return 0 } -func (x *SecurityGroupSelectorTerm) GetName() string { +func (x *SuggestionContext) GetEvidenceScope() EvidenceScope { if x != nil { - return x.Name + return x.EvidenceScope } - return "" + return EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED } -type CapacityReservationSelectorTerm struct { +func (x *SuggestionContext) GetWorkloadProfileCount() int32 { + if x != nil { + return x.WorkloadProfileCount + } + return 0 +} + +func (x *SuggestionContext) GetUnrepresentedRequirementKeys() []string { + if x != nil { + return x.UnrepresentedRequirementKeys + } + return nil +} + +type GetAvailableKindsByTargetingFiltersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + TargetFilters *TargetFilters `protobuf:"bytes,3,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` } -func (x *CapacityReservationSelectorTerm) Reset() { - *x = CapacityReservationSelectorTerm{} +func (x *GetAvailableKindsByTargetingFiltersRequest) Reset() { + *x = GetAvailableKindsByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[250] + mi := &file_api_v1_recommendation_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CapacityReservationSelectorTerm) String() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CapacityReservationSelectorTerm) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} -func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[250] +func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[267] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19939,62 +23822,62 @@ func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. -func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} +// Deprecated: Use GetAvailableKindsByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{267} } -func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Tags + return x.TeamId } - return nil + return "" } -func (x *CapacityReservationSelectorTerm) GetId() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { if x != nil { - return x.Id + return x.ClusterIds } - return "" + return nil } -func (x *CapacityReservationSelectorTerm) GetOwnerId() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.OwnerId + return x.TargetFilters } - return "" + return nil } -type AMISelectorTerm struct { +// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria +type SearchResourcesByTargetingFiltersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - SsmParameter string `protobuf:"bytes,6,opt,name=ssm_parameter,json=ssmParameter,proto3" json:"ssm_parameter,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Unique identifiers for the clusters. + SearchQuery string `protobuf:"bytes,3,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"` // Search term to match against resources. + TargetFilterType TargetFilterType `protobuf:"varint,4,opt,name=target_filter_type,json=targetFilterType,proto3,enum=api.v1.TargetFilterType" json:"target_filter_type,omitempty"` // Type of filter to apply. + TargetFilters *TargetFilters `protobuf:"bytes,5,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` } -func (x *AMISelectorTerm) Reset() { - *x = AMISelectorTerm{} +func (x *SearchResourcesByTargetingFiltersRequest) Reset() { + *x = SearchResourcesByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[251] + mi := &file_api_v1_recommendation_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AMISelectorTerm) String() string { +func (x *SearchResourcesByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AMISelectorTerm) ProtoMessage() {} +func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} -func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[251] +func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[268] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20005,89 +23888,79 @@ func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AMISelectorTerm.ProtoReflect.Descriptor instead. -func (*AMISelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{251} +// Deprecated: Use SearchResourcesByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{268} } -func (x *AMISelectorTerm) GetAlias() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Alias + return x.TeamId } return "" } -func (x *AMISelectorTerm) GetTags() map[string]string { +func (x *SearchResourcesByTargetingFiltersRequest) GetClusterIds() []string { if x != nil { - return x.Tags + return x.ClusterIds } return nil } -func (x *AMISelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *AMISelectorTerm) GetName() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetSearchQuery() string { if x != nil { - return x.Name + return x.SearchQuery } return "" } -func (x *AMISelectorTerm) GetOwner() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilterType() TargetFilterType { if x != nil { - return x.Owner + return x.TargetFilterType } - return "" + return TargetFilterType_TARGET_FILTER_TYPE_UNSPECIFIED } -func (x *AMISelectorTerm) GetSsmParameter() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.SsmParameter + return x.TargetFilters } - return "" + return nil } -type KubeletConfiguration struct { +type TargetFilters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterDns []string `protobuf:"bytes,1,rep,name=cluster_dns,json=clusterDns,proto3" json:"cluster_dns,omitempty"` - MaxPods *int32 `protobuf:"varint,2,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` - PodsPerCore *int32 `protobuf:"varint,3,opt,name=pods_per_core,json=podsPerCore,proto3,oneof" json:"pods_per_core,omitempty"` - SystemReserved map[string]string `protobuf:"bytes,4,rep,name=system_reserved,json=systemReserved,proto3" json:"system_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - KubeReserved map[string]string `protobuf:"bytes,5,rep,name=kube_reserved,json=kubeReserved,proto3" json:"kube_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionHard map[string]string `protobuf:"bytes,6,rep,name=eviction_hard,json=evictionHard,proto3" json:"eviction_hard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionSoft map[string]string `protobuf:"bytes,7,rep,name=eviction_soft,json=evictionSoft,proto3" json:"eviction_soft,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionSoftGracePeriod map[string]string `protobuf:"bytes,8,rep,name=eviction_soft_grace_period,json=evictionSoftGracePeriod,proto3" json:"eviction_soft_grace_period,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionMaxPodGracePeriod *int32 `protobuf:"varint,9,opt,name=eviction_max_pod_grace_period,json=evictionMaxPodGracePeriod,proto3,oneof" json:"eviction_max_pod_grace_period,omitempty"` - ImageGcHighThresholdPercent *int32 `protobuf:"varint,10,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` - ImageGcLowThresholdPercent *int32 `protobuf:"varint,11,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` - CpuCfsQuota *bool `protobuf:"varint,12,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` + NamespaceNames []string `protobuf:"bytes,1,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` + // optional LabelSelector namespace_selector = 1; // Target namespaces by labels + // optional LabelSelector annotation_selector = 2; // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,2,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` + NodeGroupNames []string `protobuf:"bytes,3,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` + Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + KindFilter []K8SObjectKind `protobuf:"varint,5,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern } -func (x *KubeletConfiguration) Reset() { - *x = KubeletConfiguration{} +func (x *TargetFilters) Reset() { + *x = TargetFilters{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[252] + mi := &file_api_v1_recommendation_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KubeletConfiguration) String() string { +func (x *TargetFilters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KubeletConfiguration) ProtoMessage() {} +func (*TargetFilters) ProtoMessage() {} -func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[252] +func (x *TargetFilters) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[269] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20098,122 +23971,85 @@ func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KubeletConfiguration.ProtoReflect.Descriptor instead. -func (*KubeletConfiguration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{252} +// Deprecated: Use TargetFilters.ProtoReflect.Descriptor instead. +func (*TargetFilters) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{269} } -func (x *KubeletConfiguration) GetClusterDns() []string { +func (x *TargetFilters) GetNamespaceNames() []string { if x != nil { - return x.ClusterDns + return x.NamespaceNames } return nil } -func (x *KubeletConfiguration) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods - } - return 0 -} - -func (x *KubeletConfiguration) GetPodsPerCore() int32 { - if x != nil && x.PodsPerCore != nil { - return *x.PodsPerCore - } - return 0 -} - -func (x *KubeletConfiguration) GetSystemReserved() map[string]string { +func (x *TargetFilters) GetWorkloadNames() []string { if x != nil { - return x.SystemReserved + return x.WorkloadNames } return nil } -func (x *KubeletConfiguration) GetKubeReserved() map[string]string { +func (x *TargetFilters) GetNodeGroupNames() []string { if x != nil { - return x.KubeReserved + return x.NodeGroupNames } return nil } -func (x *KubeletConfiguration) GetEvictionHard() map[string]string { +func (x *TargetFilters) GetLabels() []string { if x != nil { - return x.EvictionHard + return x.Labels } return nil } -func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { +func (x *TargetFilters) GetKindFilter() []K8SObjectKind { if x != nil { - return x.EvictionSoft + return x.KindFilter } return nil } -func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { +func (x *TargetFilters) GetNamePattern() *RegexPattern { if x != nil { - return x.EvictionSoftGracePeriod + return x.NamePattern } return nil } -func (x *KubeletConfiguration) GetEvictionMaxPodGracePeriod() int32 { - if x != nil && x.EvictionMaxPodGracePeriod != nil { - return *x.EvictionMaxPodGracePeriod - } - return 0 -} - -func (x *KubeletConfiguration) GetImageGcHighThresholdPercent() int32 { - if x != nil && x.ImageGcHighThresholdPercent != nil { - return *x.ImageGcHighThresholdPercent - } - return 0 -} - -func (x *KubeletConfiguration) GetImageGcLowThresholdPercent() int32 { - if x != nil && x.ImageGcLowThresholdPercent != nil { - return *x.ImageGcLowThresholdPercent - } - return 0 -} - -func (x *KubeletConfiguration) GetCpuCfsQuota() bool { - if x != nil && x.CpuCfsQuota != nil { - return *x.CpuCfsQuota +func (x *TargetFilters) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern } - return false + return nil } -type BlockDeviceMapping struct { +type GetAvailableKindsByTargetingFiltersResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceName *string `protobuf:"bytes,1,opt,name=device_name,json=deviceName,proto3,oneof" json:"device_name,omitempty"` - Ebs *BlockDevice `protobuf:"bytes,2,opt,name=ebs,proto3,oneof" json:"ebs,omitempty"` - RootVolume *bool `protobuf:"varint,3,opt,name=root_volume,json=rootVolume,proto3,oneof" json:"root_volume,omitempty"` + Kinds []K8SObjectKind `protobuf:"varint,1,rep,packed,name=kinds,proto3,enum=api.v1.K8SObjectKind" json:"kinds,omitempty"` } -func (x *BlockDeviceMapping) Reset() { - *x = BlockDeviceMapping{} +func (x *GetAvailableKindsByTargetingFiltersResponse) Reset() { + *x = GetAvailableKindsByTargetingFiltersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[253] + mi := &file_api_v1_recommendation_proto_msgTypes[270] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDeviceMapping) String() string { +func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDeviceMapping) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} -func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[253] +func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[270] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20224,65 +24060,46 @@ func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BlockDeviceMapping.ProtoReflect.Descriptor instead. -func (*BlockDeviceMapping) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{253} -} - -func (x *BlockDeviceMapping) GetDeviceName() string { - if x != nil && x.DeviceName != nil { - return *x.DeviceName - } - return "" +// Deprecated: Use GetAvailableKindsByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{270} } -func (x *BlockDeviceMapping) GetEbs() *BlockDevice { +func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { if x != nil { - return x.Ebs + return x.Kinds } return nil } -func (x *BlockDeviceMapping) GetRootVolume() bool { - if x != nil && x.RootVolume != nil { - return *x.RootVolume - } - return false -} - -type BlockDevice struct { +type SearchResourcesByTargetingFiltersResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeleteOnTermination *bool `protobuf:"varint,1,opt,name=delete_on_termination,json=deleteOnTermination,proto3,oneof" json:"delete_on_termination,omitempty"` - Encrypted *bool `protobuf:"varint,2,opt,name=encrypted,proto3,oneof" json:"encrypted,omitempty"` - Iops *int64 `protobuf:"varint,3,opt,name=iops,proto3,oneof" json:"iops,omitempty"` - KmsKeyId *string `protobuf:"bytes,4,opt,name=kms_key_id,json=kmsKeyId,proto3,oneof" json:"kms_key_id,omitempty"` - SnapshotId *string `protobuf:"bytes,5,opt,name=snapshot_id,json=snapshotId,proto3,oneof" json:"snapshot_id,omitempty"` - Throughput *int64 `protobuf:"varint,6,opt,name=throughput,proto3,oneof" json:"throughput,omitempty"` - VolumeInitializationRate *int32 `protobuf:"varint,7,opt,name=volume_initialization_rate,json=volumeInitializationRate,proto3,oneof" json:"volume_initialization_rate,omitempty"` - VolumeSize *string `protobuf:"bytes,8,opt,name=volume_size,json=volumeSize,proto3,oneof" json:"volume_size,omitempty"` - VolumeType *string `protobuf:"bytes,9,opt,name=volume_type,json=volumeType,proto3,oneof" json:"volume_type,omitempty"` + Namespaces []*NamespaceSearchResult `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + Workloads []*WorkloadSearchResult `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` + NodeGroups []*NodeGroupSearchResult `protobuf:"bytes,3,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` + Labels []*LabelSearchResult `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` } -func (x *BlockDevice) Reset() { - *x = BlockDevice{} +func (x *SearchResourcesByTargetingFiltersResponse) Reset() { + *x = SearchResourcesByTargetingFiltersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[254] + mi := &file_api_v1_recommendation_proto_msgTypes[271] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDevice) String() string { +func (x *SearchResourcesByTargetingFiltersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDevice) ProtoMessage() {} +func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} -func (x *BlockDevice) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[254] +func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[271] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20293,102 +24110,64 @@ func (x *BlockDevice) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BlockDevice.ProtoReflect.Descriptor instead. -func (*BlockDevice) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{254} -} - -func (x *BlockDevice) GetDeleteOnTermination() bool { - if x != nil && x.DeleteOnTermination != nil { - return *x.DeleteOnTermination - } - return false -} - -func (x *BlockDevice) GetEncrypted() bool { - if x != nil && x.Encrypted != nil { - return *x.Encrypted - } - return false -} - -func (x *BlockDevice) GetIops() int64 { - if x != nil && x.Iops != nil { - return *x.Iops - } - return 0 -} - -func (x *BlockDevice) GetKmsKeyId() string { - if x != nil && x.KmsKeyId != nil { - return *x.KmsKeyId - } - return "" -} - -func (x *BlockDevice) GetSnapshotId() string { - if x != nil && x.SnapshotId != nil { - return *x.SnapshotId - } - return "" +// Deprecated: Use SearchResourcesByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{271} } -func (x *BlockDevice) GetThroughput() int64 { - if x != nil && x.Throughput != nil { - return *x.Throughput +func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { + if x != nil { + return x.Namespaces } - return 0 + return nil } -func (x *BlockDevice) GetVolumeInitializationRate() int32 { - if x != nil && x.VolumeInitializationRate != nil { - return *x.VolumeInitializationRate +func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { + if x != nil { + return x.Workloads } - return 0 + return nil } -func (x *BlockDevice) GetVolumeSize() string { - if x != nil && x.VolumeSize != nil { - return *x.VolumeSize +func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { + if x != nil { + return x.NodeGroups } - return "" + return nil } -func (x *BlockDevice) GetVolumeType() string { - if x != nil && x.VolumeType != nil { - return *x.VolumeType +func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { + if x != nil { + return x.Labels } - return "" + return nil } -type MetadataOptions struct { +type NamespaceSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - HttpEndpoint *string `protobuf:"bytes,1,opt,name=http_endpoint,json=httpEndpoint,proto3,oneof" json:"http_endpoint,omitempty"` - HttpProtocolIpv6 *string `protobuf:"bytes,2,opt,name=http_protocol_ipv6,json=httpProtocolIpv6,proto3,oneof" json:"http_protocol_ipv6,omitempty"` - HttpPutResponseHopLimit *int64 `protobuf:"varint,3,opt,name=http_put_response_hop_limit,json=httpPutResponseHopLimit,proto3,oneof" json:"http_put_response_hop_limit,omitempty"` - HttpTokens *string `protobuf:"bytes,4,opt,name=http_tokens,json=httpTokens,proto3,oneof" json:"http_tokens,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *MetadataOptions) Reset() { - *x = MetadataOptions{} +func (x *NamespaceSearchResult) Reset() { + *x = NamespaceSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[255] + mi := &file_api_v1_recommendation_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetadataOptions) String() string { +func (x *NamespaceSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetadataOptions) ProtoMessage() {} +func (*NamespaceSearchResult) ProtoMessage() {} -func (x *MetadataOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[255] +func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[272] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20399,71 +24178,44 @@ func (x *MetadataOptions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. -func (*MetadataOptions) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{255} +// Deprecated: Use NamespaceSearchResult.ProtoReflect.Descriptor instead. +func (*NamespaceSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{272} } -func (x *MetadataOptions) GetHttpEndpoint() string { - if x != nil && x.HttpEndpoint != nil { - return *x.HttpEndpoint +func (x *NamespaceSearchResult) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *MetadataOptions) GetHttpProtocolIpv6() string { - if x != nil && x.HttpProtocolIpv6 != nil { - return *x.HttpProtocolIpv6 - } - return "" -} - -func (x *MetadataOptions) GetHttpPutResponseHopLimit() int64 { - if x != nil && x.HttpPutResponseHopLimit != nil { - return *x.HttpPutResponseHopLimit - } - return 0 -} - -func (x *MetadataOptions) GetHttpTokens() string { - if x != nil && x.HttpTokens != nil { - return *x.HttpTokens - } - return "" -} - -type GCPNodeClassSpec struct { +type WorkloadSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ServiceAccount string `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` - ImageSelectorTerms []*GCPImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector_terms,json=imageSelectorTerms,proto3" json:"image_selector_terms,omitempty"` - ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` - KubeletConfiguration *KubeletConfiguration `protobuf:"bytes,4,opt,name=kubelet_configuration,json=kubeletConfiguration,proto3,oneof" json:"kubelet_configuration,omitempty"` - Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NetworkTags []string `protobuf:"bytes,7,rep,name=network_tags,json=networkTags,proto3" json:"network_tags,omitempty"` - Disks []*GCPDisk `protobuf:"bytes,8,rep,name=disks,proto3" json:"disks,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *GCPNodeClassSpec) Reset() { - *x = GCPNodeClassSpec{} +func (x *WorkloadSearchResult) Reset() { + *x = WorkloadSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[256] + mi := &file_api_v1_recommendation_proto_msgTypes[273] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPNodeClassSpec) String() string { +func (x *WorkloadSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPNodeClassSpec) ProtoMessage() {} +func (*WorkloadSearchResult) ProtoMessage() {} -func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[256] +func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[273] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20474,93 +24226,50 @@ func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPNodeClassSpec.ProtoReflect.Descriptor instead. -func (*GCPNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{256} +// Deprecated: Use WorkloadSearchResult.ProtoReflect.Descriptor instead. +func (*WorkloadSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{273} } -func (x *GCPNodeClassSpec) GetServiceAccount() string { +func (x *WorkloadSearchResult) GetKind() string { if x != nil { - return x.ServiceAccount + return x.Kind } return "" } -func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { +func (x *WorkloadSearchResult) GetName() string { if x != nil { - return x.ImageSelectorTerms - } - return nil -} - -func (x *GCPNodeClassSpec) GetImageFamily() string { - if x != nil && x.ImageFamily != nil { - return *x.ImageFamily + return x.Name } return "" } -func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { - if x != nil { - return x.KubeletConfiguration - } - return nil -} - -func (x *GCPNodeClassSpec) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil -} - -func (x *GCPNodeClassSpec) GetMetadata() map[string]string { - if x != nil { - return x.Metadata - } - return nil -} - -func (x *GCPNodeClassSpec) GetNetworkTags() []string { - if x != nil { - return x.NetworkTags - } - return nil -} - -func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { - if x != nil { - return x.Disks - } - return nil -} - -type GCPImageSelectorTerm struct { +type NodeGroupSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *GCPImageSelectorTerm) Reset() { - *x = GCPImageSelectorTerm{} +func (x *NodeGroupSearchResult) Reset() { + *x = NodeGroupSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[257] + mi := &file_api_v1_recommendation_proto_msgTypes[274] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPImageSelectorTerm) String() string { +func (x *NodeGroupSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPImageSelectorTerm) ProtoMessage() {} +func (*NodeGroupSearchResult) ProtoMessage() {} -func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[257] +func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[274] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20571,54 +24280,44 @@ func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPImageSelectorTerm.ProtoReflect.Descriptor instead. -func (*GCPImageSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{257} -} - -func (x *GCPImageSelectorTerm) GetAlias() string { - if x != nil { - return x.Alias - } - return "" +// Deprecated: Use NodeGroupSearchResult.ProtoReflect.Descriptor instead. +func (*NodeGroupSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{274} } -func (x *GCPImageSelectorTerm) GetId() string { +func (x *NodeGroupSearchResult) GetName() string { if x != nil { - return x.Id + return x.Name } return "" } -type GCPDisk struct { +type LabelSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SizeGib int32 `protobuf:"varint,1,opt,name=size_gib,json=sizeGib,proto3" json:"size_gib,omitempty"` - Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` - Boot bool `protobuf:"varint,3,opt,name=boot,proto3" json:"boot,omitempty"` - SecondaryBootImage string `protobuf:"bytes,4,opt,name=secondary_boot_image,json=secondaryBootImage,proto3" json:"secondary_boot_image,omitempty"` - SecondaryBootMode string `protobuf:"bytes,5,opt,name=secondary_boot_mode,json=secondaryBootMode,proto3" json:"secondary_boot_mode,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (x *GCPDisk) Reset() { - *x = GCPDisk{} +func (x *LabelSearchResult) Reset() { + *x = LabelSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[258] + mi := &file_api_v1_recommendation_proto_msgTypes[275] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPDisk) String() string { +func (x *LabelSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPDisk) ProtoMessage() {} +func (*LabelSearchResult) ProtoMessage() {} -func (x *GCPDisk) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[258] +func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[275] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20629,77 +24328,50 @@ func (x *GCPDisk) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPDisk.ProtoReflect.Descriptor instead. -func (*GCPDisk) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{258} -} - -func (x *GCPDisk) GetSizeGib() int32 { - if x != nil { - return x.SizeGib - } - return 0 -} - -func (x *GCPDisk) GetCategory() string { - if x != nil { - return x.Category - } - return "" -} - -func (x *GCPDisk) GetBoot() bool { - if x != nil { - return x.Boot - } - return false +// Deprecated: Use LabelSearchResult.ProtoReflect.Descriptor instead. +func (*LabelSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{275} } -func (x *GCPDisk) GetSecondaryBootImage() string { +func (x *LabelSearchResult) GetKey() string { if x != nil { - return x.SecondaryBootImage + return x.Key } return "" } -func (x *GCPDisk) GetSecondaryBootMode() string { +func (x *LabelSearchResult) GetValue() string { if x != nil { - return x.SecondaryBootMode + return x.Value } return "" } -type AzureNodeClassSpec struct { +type CreateNodePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VnetSubnetId *string `protobuf:"bytes,1,opt,name=vnet_subnet_id,json=vnetSubnetId,proto3,oneof" json:"vnet_subnet_id,omitempty"` - OsDiskSizeGb *int32 `protobuf:"varint,2,opt,name=os_disk_size_gb,json=osDiskSizeGb,proto3,oneof" json:"os_disk_size_gb,omitempty"` - ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` // Ubuntu, Ubuntu2204, Ubuntu2404, AzureLinux - FipsMode *string `protobuf:"bytes,4,opt,name=fips_mode,json=fipsMode,proto3,oneof" json:"fips_mode,omitempty"` // FIPS or Disabled - Tags map[string]string `protobuf:"bytes,5,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Kubelet *AzureKubeletConfiguration `protobuf:"bytes,6,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` - MaxPods *int32 `protobuf:"varint,7,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *AzureNodeClassSpec) Reset() { - *x = AzureNodeClassSpec{} +func (x *CreateNodePolicyTargetsRequest) Reset() { + *x = CreateNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[259] + mi := &file_api_v1_recommendation_proto_msgTypes[276] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureNodeClassSpec) String() string { +func (x *CreateNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureNodeClassSpec) ProtoMessage() {} +func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} -func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[259] +func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[276] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20710,94 +24382,43 @@ func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AzureNodeClassSpec.ProtoReflect.Descriptor instead. -func (*AzureNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{259} -} - -func (x *AzureNodeClassSpec) GetVnetSubnetId() string { - if x != nil && x.VnetSubnetId != nil { - return *x.VnetSubnetId - } - return "" -} - -func (x *AzureNodeClassSpec) GetOsDiskSizeGb() int32 { - if x != nil && x.OsDiskSizeGb != nil { - return *x.OsDiskSizeGb - } - return 0 -} - -func (x *AzureNodeClassSpec) GetImageFamily() string { - if x != nil && x.ImageFamily != nil { - return *x.ImageFamily - } - return "" -} - -func (x *AzureNodeClassSpec) GetFipsMode() string { - if x != nil && x.FipsMode != nil { - return *x.FipsMode - } - return "" -} - -func (x *AzureNodeClassSpec) GetTags() map[string]string { - if x != nil { - return x.Tags - } - return nil +// Deprecated: Use CreateNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{276} } -func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { +func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { if x != nil { - return x.Kubelet + return x.Targets } return nil } -func (x *AzureNodeClassSpec) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods - } - return 0 -} - -type AzureKubeletConfiguration struct { +type CreateNodePolicyTargetsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CpuManagerPolicy *string `protobuf:"bytes,1,opt,name=cpu_manager_policy,json=cpuManagerPolicy,proto3,oneof" json:"cpu_manager_policy,omitempty"` // none, static - CpuCfsQuota *bool `protobuf:"varint,2,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` - CpuCfsQuotaPeriod *string `protobuf:"bytes,3,opt,name=cpu_cfs_quota_period,json=cpuCfsQuotaPeriod,proto3,oneof" json:"cpu_cfs_quota_period,omitempty"` // e.g., "100ms" - ImageGcHighThresholdPercent *int32 `protobuf:"varint,4,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` - ImageGcLowThresholdPercent *int32 `protobuf:"varint,5,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` - TopologyManagerPolicy *string `protobuf:"bytes,6,opt,name=topology_manager_policy,json=topologyManagerPolicy,proto3,oneof" json:"topology_manager_policy,omitempty"` // restricted, best-effort, none, single-numa-node - AllowedUnsafeSysctls []string `protobuf:"bytes,7,rep,name=allowed_unsafe_sysctls,json=allowedUnsafeSysctls,proto3" json:"allowed_unsafe_sysctls,omitempty"` - ContainerLogMaxSize *string `protobuf:"bytes,8,opt,name=container_log_max_size,json=containerLogMaxSize,proto3,oneof" json:"container_log_max_size,omitempty"` // e.g., "50Mi" - ContainerLogMaxFiles *int32 `protobuf:"varint,9,opt,name=container_log_max_files,json=containerLogMaxFiles,proto3,oneof" json:"container_log_max_files,omitempty"` - PodPidsLimit *int64 `protobuf:"varint,10,opt,name=pod_pids_limit,json=podPidsLimit,proto3,oneof" json:"pod_pids_limit,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *AzureKubeletConfiguration) Reset() { - *x = AzureKubeletConfiguration{} +func (x *CreateNodePolicyTargetsResponse) Reset() { + *x = CreateNodePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[260] + mi := &file_api_v1_recommendation_proto_msgTypes[277] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureKubeletConfiguration) String() string { +func (x *CreateNodePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureKubeletConfiguration) ProtoMessage() {} +func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} -func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[260] +func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[277] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20808,108 +24429,43 @@ func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AzureKubeletConfiguration.ProtoReflect.Descriptor instead. -func (*AzureKubeletConfiguration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{260} -} - -func (x *AzureKubeletConfiguration) GetCpuManagerPolicy() string { - if x != nil && x.CpuManagerPolicy != nil { - return *x.CpuManagerPolicy - } - return "" -} - -func (x *AzureKubeletConfiguration) GetCpuCfsQuota() bool { - if x != nil && x.CpuCfsQuota != nil { - return *x.CpuCfsQuota - } - return false -} - -func (x *AzureKubeletConfiguration) GetCpuCfsQuotaPeriod() string { - if x != nil && x.CpuCfsQuotaPeriod != nil { - return *x.CpuCfsQuotaPeriod - } - return "" -} - -func (x *AzureKubeletConfiguration) GetImageGcHighThresholdPercent() int32 { - if x != nil && x.ImageGcHighThresholdPercent != nil { - return *x.ImageGcHighThresholdPercent - } - return 0 -} - -func (x *AzureKubeletConfiguration) GetImageGcLowThresholdPercent() int32 { - if x != nil && x.ImageGcLowThresholdPercent != nil { - return *x.ImageGcLowThresholdPercent - } - return 0 -} - -func (x *AzureKubeletConfiguration) GetTopologyManagerPolicy() string { - if x != nil && x.TopologyManagerPolicy != nil { - return *x.TopologyManagerPolicy - } - return "" +// Deprecated: Use CreateNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{277} } -func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { +func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.AllowedUnsafeSysctls + return x.Targets } return nil } -func (x *AzureKubeletConfiguration) GetContainerLogMaxSize() string { - if x != nil && x.ContainerLogMaxSize != nil { - return *x.ContainerLogMaxSize - } - return "" -} - -func (x *AzureKubeletConfiguration) GetContainerLogMaxFiles() int32 { - if x != nil && x.ContainerLogMaxFiles != nil { - return *x.ContainerLogMaxFiles - } - return 0 -} - -func (x *AzureKubeletConfiguration) GetPodPidsLimit() int64 { - if x != nil && x.PodPidsLimit != nil { - return *x.PodPidsLimit - } - return 0 -} - -type OCIImageSelectorTerm struct { +type ListNodePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - CompartmentId string `protobuf:"bytes,3,opt,name=compartment_id,json=compartmentId,proto3" json:"compartment_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *OCIImageSelectorTerm) Reset() { - *x = OCIImageSelectorTerm{} +func (x *ListNodePolicyTargetsRequest) Reset() { + *x = ListNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[261] + mi := &file_api_v1_recommendation_proto_msgTypes[278] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIImageSelectorTerm) String() string { +func (x *ListNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIImageSelectorTerm) ProtoMessage() {} +func (*ListNodePolicyTargetsRequest) ProtoMessage() {} -func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[261] +func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[278] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20920,58 +24476,43 @@ func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIImageSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCIImageSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{261} -} - -func (x *OCIImageSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *OCIImageSelectorTerm) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use ListNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{278} } -func (x *OCIImageSelectorTerm) GetCompartmentId() string { +func (x *ListNodePolicyTargetsRequest) GetTeamId() string { if x != nil { - return x.CompartmentId + return x.TeamId } return "" } -type OCISubnetSelectorTerm struct { +type ListNodePolicyTargetsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *OCISubnetSelectorTerm) Reset() { - *x = OCISubnetSelectorTerm{} +func (x *ListNodePolicyTargetsResponse) Reset() { + *x = ListNodePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[262] + mi := &file_api_v1_recommendation_proto_msgTypes[279] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISubnetSelectorTerm) String() string { +func (x *ListNodePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISubnetSelectorTerm) ProtoMessage() {} +func (*ListNodePolicyTargetsResponse) ProtoMessage() {} -func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[262] +func (x *ListNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[279] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20982,51 +24523,43 @@ func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCISubnetSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCISubnetSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{262} -} - -func (x *OCISubnetSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{279} } -func (x *OCISubnetSelectorTerm) GetName() string { +func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.Name + return x.Targets } - return "" + return nil } -type OCISecurityGroupSelectorTerm struct { +type UpdateNodePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *OCISecurityGroupSelectorTerm) Reset() { - *x = OCISecurityGroupSelectorTerm{} +func (x *UpdateNodePolicyTargetRequest) Reset() { + *x = UpdateNodePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[263] + mi := &file_api_v1_recommendation_proto_msgTypes[280] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISecurityGroupSelectorTerm) String() string { +func (x *UpdateNodePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} +func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} -func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[263] +func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[280] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21037,51 +24570,43 @@ func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCISecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCISecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{263} -} - -func (x *OCISecurityGroupSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{280} } -func (x *OCISecurityGroupSelectorTerm) GetName() string { +func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { if x != nil { - return x.Name + return x.Target } - return "" + return nil } -type OCIBootConfig struct { +type UpdateNodePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BootVolumeSizeInGbs int64 `protobuf:"varint,1,opt,name=boot_volume_size_in_gbs,json=bootVolumeSizeInGbs,proto3" json:"boot_volume_size_in_gbs,omitempty"` - BootVolumeVpusPerGb int64 `protobuf:"varint,2,opt,name=boot_volume_vpus_per_gb,json=bootVolumeVpusPerGb,proto3" json:"boot_volume_vpus_per_gb,omitempty"` + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *OCIBootConfig) Reset() { - *x = OCIBootConfig{} +func (x *UpdateNodePolicyTargetResponse) Reset() { + *x = UpdateNodePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[264] + mi := &file_api_v1_recommendation_proto_msgTypes[281] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIBootConfig) String() string { +func (x *UpdateNodePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIBootConfig) ProtoMessage() {} +func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} -func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[264] +func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[281] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21092,54 +24617,58 @@ func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIBootConfig.ProtoReflect.Descriptor instead. -func (*OCIBootConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{264} -} - -func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { - if x != nil { - return x.BootVolumeSizeInGbs - } - return 0 +// Deprecated: Use UpdateNodePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{281} } -func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { +func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { if x != nil { - return x.BootVolumeVpusPerGb + return x.Target } - return 0 + return nil } -type OCILaunchOptions struct { +type NodePolicyTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BootVolumeType *string `protobuf:"bytes,1,opt,name=boot_volume_type,json=bootVolumeType,proto3,oneof" json:"boot_volume_type,omitempty"` - Firmware *string `protobuf:"bytes,2,opt,name=firmware,proto3,oneof" json:"firmware,omitempty"` - NetworkType *string `protobuf:"bytes,3,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"` - RemoteDataVolumeType *string `protobuf:"bytes,4,opt,name=remote_data_volume_type,json=remoteDataVolumeType,proto3,oneof" json:"remote_data_volume_type,omitempty"` - IsConsistentVolumeNamingEnabled *bool `protobuf:"varint,5,opt,name=is_consistent_volume_naming_enabled,json=isConsistentVolumeNamingEnabled,proto3,oneof" json:"is_consistent_volume_naming_enabled,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Invariant: at most 1 entry. Server rejects >1. Will be narrowed to a scalar once all clients migrate. + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // uuid[] + PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // Runtime status conditions read from the compiled Karpenter NodePool in the + // target cluster (e.g. ZonalShiftReady / ZonalShiftActive). Populated by + // ListNodePolicyTargets via a join against k8s_karpenter_resources. Empty + // when no conditions are observed for this target. + Status *NodePolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` } -func (x *OCILaunchOptions) Reset() { - *x = OCILaunchOptions{} +func (x *NodePolicyTarget) Reset() { + *x = NodePolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[265] + mi := &file_api_v1_recommendation_proto_msgTypes[282] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCILaunchOptions) String() string { +func (x *NodePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCILaunchOptions) ProtoMessage() {} +func (*NodePolicyTarget) ProtoMessage() {} -func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[265] +func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[282] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21150,139 +24679,122 @@ func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCILaunchOptions.ProtoReflect.Descriptor instead. -func (*OCILaunchOptions) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{265} +// Deprecated: Use NodePolicyTarget.ProtoReflect.Descriptor instead. +func (*NodePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{282} } -func (x *OCILaunchOptions) GetBootVolumeType() string { - if x != nil && x.BootVolumeType != nil { - return *x.BootVolumeType +func (x *NodePolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId } return "" } -func (x *OCILaunchOptions) GetFirmware() string { - if x != nil && x.Firmware != nil { - return *x.Firmware +func (x *NodePolicyTarget) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *OCILaunchOptions) GetNetworkType() string { - if x != nil && x.NetworkType != nil { - return *x.NetworkType +func (x *NodePolicyTarget) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { - if x != nil && x.RemoteDataVolumeType != nil { - return *x.RemoteDataVolumeType +func (x *NodePolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId } return "" } -func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { - if x != nil && x.IsConsistentVolumeNamingEnabled != nil { - return *x.IsConsistentVolumeNamingEnabled +func (x *NodePolicyTarget) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } - return false -} - -type OCIVolumeAttributes struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SizeInGbs int64 `protobuf:"varint,1,opt,name=size_in_gbs,json=sizeInGbs,proto3" json:"size_in_gbs,omitempty"` - VpusPerGb int64 `protobuf:"varint,2,opt,name=vpus_per_gb,json=vpusPerGb,proto3" json:"vpus_per_gb,omitempty"` + return nil } -func (x *OCIVolumeAttributes) Reset() { - *x = OCIVolumeAttributes{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[266] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId } + return "" } -func (x *OCIVolumeAttributes) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false } -func (*OCIVolumeAttributes) ProtoMessage() {} - -func (x *OCIVolumeAttributes) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[266] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } - return mi.MessageOf(x) + return nil } -// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. -func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} +func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil } -func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { +func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.SizeInGbs + return x.DeletedAt } - return 0 + return nil } -func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { +func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { if x != nil { - return x.VpusPerGb + return x.Status } - return 0 + return nil } -type OCINodeClassSpec struct { +type NodePolicyCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VcnId string `protobuf:"bytes,1,opt,name=vcn_id,json=vcnId,proto3" json:"vcn_id,omitempty"` - ImageSelector []*OCIImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector,json=imageSelector,proto3" json:"image_selector,omitempty"` - SubnetSelector []*OCISubnetSelectorTerm `protobuf:"bytes,3,rep,name=subnet_selector,json=subnetSelector,proto3" json:"subnet_selector,omitempty"` - SecurityGroupSelector []*OCISecurityGroupSelectorTerm `protobuf:"bytes,4,rep,name=security_group_selector,json=securityGroupSelector,proto3" json:"security_group_selector,omitempty"` - UserData *string `protobuf:"bytes,5,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` - PreInstallScript *string `protobuf:"bytes,6,opt,name=pre_install_script,json=preInstallScript,proto3,oneof" json:"pre_install_script,omitempty"` - MetaData map[string]string `protobuf:"bytes,7,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ImageFamily string `protobuf:"bytes,8,opt,name=image_family,json=imageFamily,proto3" json:"image_family,omitempty"` - Tags map[string]string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - FreeFormTags map[string]string `protobuf:"bytes,10,rep,name=free_form_tags,json=freeFormTags,proto3" json:"free_form_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - BootConfig *OCIBootConfig `protobuf:"bytes,11,opt,name=boot_config,json=bootConfig,proto3" json:"boot_config,omitempty"` - LaunchOptions *OCILaunchOptions `protobuf:"bytes,12,opt,name=launch_options,json=launchOptions,proto3" json:"launch_options,omitempty"` - BlockDevices []*OCIVolumeAttributes `protobuf:"bytes,13,rep,name=block_devices,json=blockDevices,proto3" json:"block_devices,omitempty"` - AgentList []string `protobuf:"bytes,14,rep,name=agent_list,json=agentList,proto3" json:"agent_list,omitempty"` + // e.g. "ZonalShiftReady", "ZonalShiftActive" + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // "True" | "False" | "Unknown" + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + // Machine-readable reason code (e.g. "Ready", "ZonePinned", "NoFallbackZones", + // "NoActiveShift", "AwayFrom", "ZoneConstraintConflict"). + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` + // Human-readable detail (e.g. impacted zone names). + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` + LastTransitionTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` } -func (x *OCINodeClassSpec) Reset() { - *x = OCINodeClassSpec{} +func (x *NodePolicyCondition) Reset() { + *x = NodePolicyCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[267] + mi := &file_api_v1_recommendation_proto_msgTypes[283] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCINodeClassSpec) String() string { +func (x *NodePolicyCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClassSpec) ProtoMessage() {} +func (*NodePolicyCondition) ProtoMessage() {} -func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[267] +func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[283] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21293,136 +24805,130 @@ func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCINodeClassSpec.ProtoReflect.Descriptor instead. -func (*OCINodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{267} +// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. +func (*NodePolicyCondition) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{283} } -func (x *OCINodeClassSpec) GetVcnId() string { +func (x *NodePolicyCondition) GetType() string { if x != nil { - return x.VcnId + return x.Type } return "" } -func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { - if x != nil { - return x.ImageSelector - } - return nil -} - -func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { +func (x *NodePolicyCondition) GetStatus() string { if x != nil { - return x.SubnetSelector + return x.Status } - return nil + return "" } -func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { +func (x *NodePolicyCondition) GetReason() string { if x != nil { - return x.SecurityGroupSelector - } - return nil -} - -func (x *OCINodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData + return x.Reason } return "" } -func (x *OCINodeClassSpec) GetPreInstallScript() string { - if x != nil && x.PreInstallScript != nil { - return *x.PreInstallScript +func (x *NodePolicyCondition) GetMessage() string { + if x != nil { + return x.Message } return "" } -func (x *OCINodeClassSpec) GetMetaData() map[string]string { +func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { if x != nil { - return x.MetaData + return x.LastTransitionTime } return nil } -func (x *OCINodeClassSpec) GetImageFamily() string { - if x != nil { - return x.ImageFamily - } - return "" -} +type NodePolicyTargetStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *OCINodeClassSpec) GetTags() map[string]string { - if x != nil { - return x.Tags - } - return nil + Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` } -func (x *OCINodeClassSpec) GetFreeFormTags() map[string]string { - if x != nil { - return x.FreeFormTags +func (x *NodePolicyTargetStatus) Reset() { + *x = NodePolicyTargetStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[284] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *OCINodeClassSpec) GetBootConfig() *OCIBootConfig { - if x != nil { - return x.BootConfig - } - return nil +func (x *NodePolicyTargetStatus) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *OCINodeClassSpec) GetLaunchOptions() *OCILaunchOptions { - if x != nil { - return x.LaunchOptions +func (*NodePolicyTargetStatus) ProtoMessage() {} + +func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[284] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *OCINodeClassSpec) GetBlockDevices() []*OCIVolumeAttributes { - if x != nil { - return x.BlockDevices - } - return nil +// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{284} } -func (x *OCINodeClassSpec) GetAgentList() []string { +func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { if x != nil { - return x.AgentList + return x.Conditions } return nil } -type KarpenterSettingsRecommendation struct { +// Cloud-agnostic config for how a node policy should react to AZ outage +// signals from the cloud provider (AWS ARC zonal shift today; GCP analogue +// planned). The compile step maps these intents to provider-specific +// annotations on the resulting Karpenter NodePool. +type ZonalShiftConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // contents is the full KarpenterSettings YAML (devzero.karpenter.sh/v1alpha1, name "default"). - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` - RecommendationId string `protobuf:"bytes,2,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + // Master opt-in. When false the other two fields are ignored. + RespectZonalShift bool `protobuf:"varint,1,opt,name=respect_zonal_shift,json=respectZonalShift,proto3" json:"respect_zonal_shift,omitempty"` + // Also terminate existing nodes in the impacted zone, forcing reschedule. + // Respects pod disruption budgets. Only meaningful when respect_zonal_shift is true. + EvictImpactedNodes bool `protobuf:"varint,2,opt,name=evict_impacted_nodes,json=evictImpactedNodes,proto3" json:"evict_impacted_nodes,omitempty"` + // If the policy is pinned to a single zone and that zone is impacted, expand + // to other zones available on the node class. Only meaningful when + // respect_zonal_shift is true. + AllowZoneFallback bool `protobuf:"varint,3,opt,name=allow_zone_fallback,json=allowZoneFallback,proto3" json:"allow_zone_fallback,omitempty"` } -func (x *KarpenterSettingsRecommendation) Reset() { - *x = KarpenterSettingsRecommendation{} +func (x *ZonalShiftConfig) Reset() { + *x = ZonalShiftConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[268] + mi := &file_api_v1_recommendation_proto_msgTypes[285] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterSettingsRecommendation) String() string { +func (x *ZonalShiftConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterSettingsRecommendation) ProtoMessage() {} +func (*ZonalShiftConfig) ProtoMessage() {} -func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[268] +func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[285] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21433,51 +24939,59 @@ func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterSettingsRecommendation.ProtoReflect.Descriptor instead. -func (*KarpenterSettingsRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{268} +// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. +func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{285} } -func (x *KarpenterSettingsRecommendation) GetContents() []byte { +func (x *ZonalShiftConfig) GetRespectZonalShift() bool { if x != nil { - return x.Contents + return x.RespectZonalShift } - return nil + return false } -func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { +func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { if x != nil { - return x.RecommendationId + return x.EvictImpactedNodes } - return "" + return false } -type RawKarpenterSpec struct { +func (x *ZonalShiftConfig) GetAllowZoneFallback() bool { + if x != nil { + return x.AllowZoneFallback + } + return false +} + +type Taint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodepoolYaml string `protobuf:"bytes,1,opt,name=nodepool_yaml,json=nodepoolYaml,proto3" json:"nodepool_yaml,omitempty"` - NodeclassYaml string `protobuf:"bytes,2,opt,name=nodeclass_yaml,json=nodeclassYaml,proto3" json:"nodeclass_yaml,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // NoSchedule, PreferNoSchedule, NoExecute } -func (x *RawKarpenterSpec) Reset() { - *x = RawKarpenterSpec{} +func (x *Taint) Reset() { + *x = Taint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[269] + mi := &file_api_v1_recommendation_proto_msgTypes[286] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RawKarpenterSpec) String() string { +func (x *Taint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RawKarpenterSpec) ProtoMessage() {} +func (*Taint) ProtoMessage() {} -func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[269] +func (x *Taint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[286] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21488,54 +25002,60 @@ func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RawKarpenterSpec.ProtoReflect.Descriptor instead. -func (*RawKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{269} +// Deprecated: Use Taint.ProtoReflect.Descriptor instead. +func (*Taint) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{286} } -func (x *RawKarpenterSpec) GetNodepoolYaml() string { +func (x *Taint) GetKey() string { if x != nil { - return x.NodepoolYaml + return x.Key } return "" } -func (x *RawKarpenterSpec) GetNodeclassYaml() string { +func (x *Taint) GetValue() string { if x != nil { - return x.NodeclassYaml + return x.Value } return "" } -type NodeRecommendation struct { +func (x *Taint) GetEffect() string { + if x != nil { + return x.Effect + } + return "" +} + +type DisruptionBudget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Aws *AWSKarpenterSpec `protobuf:"bytes,1,opt,name=aws,proto3" json:"aws,omitempty"` - Aks *AKSKarpenterSpec `protobuf:"bytes,2,opt,name=aks,proto3" json:"aks,omitempty"` - Gcp *GCPKarpenterSpec `protobuf:"bytes,3,opt,name=gcp,proto3" json:"gcp,omitempty"` - Oci *OCIKarpenterSpec `protobuf:"bytes,4,opt,name=oci,proto3" json:"oci,omitempty"` - NodeRecCfgId string `protobuf:"bytes,41,opt,name=node_rec_cfg_id,json=nodeRecCfgId,proto3" json:"node_rec_cfg_id,omitempty"` + Reasons []string `protobuf:"bytes,1,rep,name=reasons,proto3" json:"reasons,omitempty"` // e.g. ["Underutilized", "Empty"] + Nodes string `protobuf:"bytes,2,opt,name=nodes,proto3" json:"nodes,omitempty"` // e.g. "10%" or "2" + Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` // optional cron schedule + Duration string `protobuf:"bytes,4,opt,name=duration,proto3" json:"duration,omitempty"` // e.g. "1h30m" } -func (x *NodeRecommendation) Reset() { - *x = NodeRecommendation{} +func (x *DisruptionBudget) Reset() { + *x = DisruptionBudget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[270] + mi := &file_api_v1_recommendation_proto_msgTypes[287] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeRecommendation) String() string { +func (x *DisruptionBudget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendation) ProtoMessage() {} +func (*DisruptionBudget) ProtoMessage() {} -func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[270] +func (x *DisruptionBudget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[287] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21546,72 +25066,69 @@ func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeRecommendation.ProtoReflect.Descriptor instead. -func (*NodeRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{270} -} - -func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { - if x != nil { - return x.Aws - } - return nil +// Deprecated: Use DisruptionBudget.ProtoReflect.Descriptor instead. +func (*DisruptionBudget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{287} } -func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { +func (x *DisruptionBudget) GetReasons() []string { if x != nil { - return x.Aks + return x.Reasons } return nil } -func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { +func (x *DisruptionBudget) GetNodes() string { if x != nil { - return x.Gcp + return x.Nodes } - return nil + return "" } -func (x *NodeRecommendation) GetOci() *OCIKarpenterSpec { +func (x *DisruptionBudget) GetSchedule() string { if x != nil { - return x.Oci + return x.Schedule } - return nil + return "" } -func (x *NodeRecommendation) GetNodeRecCfgId() string { +func (x *DisruptionBudget) GetDuration() string { if x != nil { - return x.NodeRecCfgId + return x.Duration } return "" } -type AWSKarpenterSpec struct { +type DisruptionPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - Ec2Nc []*EC2NodeClass `protobuf:"bytes,6,rep,name=ec2nc,proto3" json:"ec2nc,omitempty"` + ConsolidateAfter string `protobuf:"bytes,1,opt,name=consolidate_after,json=consolidateAfter,proto3" json:"consolidate_after,omitempty"` // required by Karpenter + ConsolidationPolicy string `protobuf:"bytes,2,opt,name=consolidation_policy,json=consolidationPolicy,proto3" json:"consolidation_policy,omitempty"` // WhenEmpty / WhenEmptyOrUnderutilized + ExpireAfter string `protobuf:"bytes,3,opt,name=expire_after,json=expireAfter,proto3" json:"expire_after,omitempty"` + TtlSecondsAfterEmpty int32 `protobuf:"varint,4,opt,name=ttl_seconds_after_empty,json=ttlSecondsAfterEmpty,proto3" json:"ttl_seconds_after_empty,omitempty"` + TerminationGracePeriodSeconds int32 `protobuf:"varint,5,opt,name=termination_grace_period_seconds,json=terminationGracePeriodSeconds,proto3" json:"termination_grace_period_seconds,omitempty"` + Budgets []*DisruptionBudget `protobuf:"bytes,6,rep,name=budgets,proto3" json:"budgets,omitempty"` } -func (x *AWSKarpenterSpec) Reset() { - *x = AWSKarpenterSpec{} +func (x *DisruptionPolicy) Reset() { + *x = DisruptionPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[271] + mi := &file_api_v1_recommendation_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AWSKarpenterSpec) String() string { +func (x *DisruptionPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AWSKarpenterSpec) ProtoMessage() {} +func (*DisruptionPolicy) ProtoMessage() {} -func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[271] +func (x *DisruptionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[288] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21622,51 +25139,79 @@ func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AWSKarpenterSpec.ProtoReflect.Descriptor instead. -func (*AWSKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{271} +// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. +func (*DisruptionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{288} } -func (x *AWSKarpenterSpec) GetNp() []*NodePool { +func (x *DisruptionPolicy) GetConsolidateAfter() string { if x != nil { - return x.Np + return x.ConsolidateAfter } - return nil + return "" } -func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { +func (x *DisruptionPolicy) GetConsolidationPolicy() string { if x != nil { - return x.Ec2Nc + return x.ConsolidationPolicy } - return nil -} - -type AKSKarpenterSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - Aksnc []*AKSNodeClass `protobuf:"bytes,6,rep,name=aksnc,proto3" json:"aksnc,omitempty"` + return "" } -func (x *AKSKarpenterSpec) Reset() { - *x = AKSKarpenterSpec{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[272] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *DisruptionPolicy) GetExpireAfter() string { + if x != nil { + return x.ExpireAfter } + return "" } -func (x *AKSKarpenterSpec) String() string { +func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { + if x != nil { + return x.TtlSecondsAfterEmpty + } + return 0 +} + +func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { + if x != nil { + return x.TerminationGracePeriodSeconds + } + return 0 +} + +func (x *DisruptionPolicy) GetBudgets() []*DisruptionBudget { + if x != nil { + return x.Budgets + } + return nil +} + +type ResourceLimits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` +} + +func (x *ResourceLimits) Reset() { + *x = ResourceLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[289] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceLimits) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSKarpenterSpec) ProtoMessage() {} +func (*ResourceLimits) ProtoMessage() {} -func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[272] +func (x *ResourceLimits) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[289] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21677,50 +25222,66 @@ func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AKSKarpenterSpec.ProtoReflect.Descriptor instead. -func (*AKSKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{272} +// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. +func (*ResourceLimits) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{289} } -func (x *AKSKarpenterSpec) GetNp() []*NodePool { +func (x *ResourceLimits) GetCpu() string { if x != nil { - return x.Np + return x.Cpu } - return nil + return "" } -func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { +func (x *ResourceLimits) GetMemory() string { if x != nil { - return x.Aksnc + return x.Memory } - return nil + return "" } -type NodePool struct { +// Provider-specific stubs +type AWSNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into sigs.k8s.io/karpenter/pkg/apis/v1.NodePool + SubnetSelectorTerms []*SubnetSelectorTerm `protobuf:"bytes,1,rep,name=subnet_selector_terms,json=subnetSelectorTerms,proto3" json:"subnet_selector_terms,omitempty"` + SecurityGroupSelectorTerms []*SecurityGroupSelectorTerm `protobuf:"bytes,2,rep,name=security_group_selector_terms,json=securityGroupSelectorTerms,proto3" json:"security_group_selector_terms,omitempty"` + CapacityReservationSelectorTerms []*CapacityReservationSelectorTerm `protobuf:"bytes,3,rep,name=capacity_reservation_selector_terms,json=capacityReservationSelectorTerms,proto3" json:"capacity_reservation_selector_terms,omitempty"` + AssociatePublicIpAddress *bool `protobuf:"varint,4,opt,name=associate_public_ip_address,json=associatePublicIpAddress,proto3,oneof" json:"associate_public_ip_address,omitempty"` + AmiSelectorTerms []*AMISelectorTerm `protobuf:"bytes,5,rep,name=ami_selector_terms,json=amiSelectorTerms,proto3" json:"ami_selector_terms,omitempty"` + AmiFamily *string `protobuf:"bytes,6,opt,name=ami_family,json=amiFamily,proto3,oneof" json:"ami_family,omitempty"` + UserData *string `protobuf:"bytes,7,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` + Role *string `protobuf:"bytes,8,opt,name=role,proto3,oneof" json:"role,omitempty"` + InstanceProfile *string `protobuf:"bytes,9,opt,name=instance_profile,json=instanceProfile,proto3,oneof" json:"instance_profile,omitempty"` + Tags map[string]string `protobuf:"bytes,10,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Kubelet *KubeletConfiguration `protobuf:"bytes,11,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` + BlockDeviceMappings []*BlockDeviceMapping `protobuf:"bytes,12,rep,name=block_device_mappings,json=blockDeviceMappings,proto3" json:"block_device_mappings,omitempty"` + InstanceStorePolicy *InstanceStorePolicy `protobuf:"varint,13,opt,name=instance_store_policy,json=instanceStorePolicy,proto3,enum=api.v1.InstanceStorePolicy,oneof" json:"instance_store_policy,omitempty"` + DetailedMonitoring *bool `protobuf:"varint,14,opt,name=detailed_monitoring,json=detailedMonitoring,proto3,oneof" json:"detailed_monitoring,omitempty"` + MetadataOptions *MetadataOptions `protobuf:"bytes,15,opt,name=metadata_options,json=metadataOptions,proto3,oneof" json:"metadata_options,omitempty"` + Context *string `protobuf:"bytes,16,opt,name=context,proto3,oneof" json:"context,omitempty"` } -func (x *NodePool) Reset() { - *x = NodePool{} +func (x *AWSNodeClassSpec) Reset() { + *x = AWSNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[273] + mi := &file_api_v1_recommendation_proto_msgTypes[290] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePool) String() string { +func (x *AWSNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePool) ProtoMessage() {} +func (*AWSNodeClassSpec) ProtoMessage() {} -func (x *NodePool) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[273] +func (x *AWSNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[290] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21731,43 +25292,148 @@ func (x *NodePool) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePool.ProtoReflect.Descriptor instead. -func (*NodePool) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{273} +// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} } -func (x *NodePool) GetContents() []byte { +func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { if x != nil { - return x.Contents + return x.SubnetSelectorTerms } return nil } -type EC2NodeClass struct { +func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { + if x != nil { + return x.SecurityGroupSelectorTerms + } + return nil +} + +func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { + if x != nil { + return x.CapacityReservationSelectorTerms + } + return nil +} + +func (x *AWSNodeClassSpec) GetAssociatePublicIpAddress() bool { + if x != nil && x.AssociatePublicIpAddress != nil { + return *x.AssociatePublicIpAddress + } + return false +} + +func (x *AWSNodeClassSpec) GetAmiSelectorTerms() []*AMISelectorTerm { + if x != nil { + return x.AmiSelectorTerms + } + return nil +} + +func (x *AWSNodeClassSpec) GetAmiFamily() string { + if x != nil && x.AmiFamily != nil { + return *x.AmiFamily + } + return "" +} + +func (x *AWSNodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData + } + return "" +} + +func (x *AWSNodeClassSpec) GetRole() string { + if x != nil && x.Role != nil { + return *x.Role + } + return "" +} + +func (x *AWSNodeClassSpec) GetInstanceProfile() string { + if x != nil && x.InstanceProfile != nil { + return *x.InstanceProfile + } + return "" +} + +func (x *AWSNodeClassSpec) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { + if x != nil { + return x.Kubelet + } + return nil +} + +func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { + if x != nil { + return x.BlockDeviceMappings + } + return nil +} + +func (x *AWSNodeClassSpec) GetInstanceStorePolicy() InstanceStorePolicy { + if x != nil && x.InstanceStorePolicy != nil { + return *x.InstanceStorePolicy + } + return InstanceStorePolicy_INSTANCE_STORE_POLICY_RAID0 +} + +func (x *AWSNodeClassSpec) GetDetailedMonitoring() bool { + if x != nil && x.DetailedMonitoring != nil { + return *x.DetailedMonitoring + } + return false +} + +func (x *AWSNodeClassSpec) GetMetadataOptions() *MetadataOptions { + if x != nil { + return x.MetadataOptions + } + return nil +} + +func (x *AWSNodeClassSpec) GetContext() string { + if x != nil && x.Context != nil { + return *x.Context + } + return "" +} + +type GetInstanceFamiliesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/aws/karpenter-provider-aws/pkg/apis/v1.EC2NodeClass + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *EC2NodeClass) Reset() { - *x = EC2NodeClass{} +func (x *GetInstanceFamiliesRequest) Reset() { + *x = GetInstanceFamiliesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[274] + mi := &file_api_v1_recommendation_proto_msgTypes[291] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EC2NodeClass) String() string { +func (x *GetInstanceFamiliesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EC2NodeClass) ProtoMessage() {} +func (*GetInstanceFamiliesRequest) ProtoMessage() {} -func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[274] +func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[291] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21778,43 +25444,43 @@ func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EC2NodeClass.ProtoReflect.Descriptor instead. -func (*EC2NodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{274} +// Deprecated: Use GetInstanceFamiliesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{291} } -func (x *EC2NodeClass) GetContents() []byte { +func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { if x != nil { - return x.Contents + return x.CloudProviders } return nil } -type AKSNodeClass struct { +type GetInstanceFamiliesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/Azure/karpenter-provider-azure/pkg/apis/v1beta1.AKSNodeClass + InstanceFamilies []*InstanceFamily `protobuf:"bytes,1,rep,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` } -func (x *AKSNodeClass) Reset() { - *x = AKSNodeClass{} +func (x *GetInstanceFamiliesResponse) Reset() { + *x = GetInstanceFamiliesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[275] + mi := &file_api_v1_recommendation_proto_msgTypes[292] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AKSNodeClass) String() string { +func (x *GetInstanceFamiliesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSNodeClass) ProtoMessage() {} +func (*GetInstanceFamiliesResponse) ProtoMessage() {} -func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[275] +func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[292] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21825,44 +25491,43 @@ func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AKSNodeClass.ProtoReflect.Descriptor instead. -func (*AKSNodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{275} +// Deprecated: Use GetInstanceFamiliesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{292} } -func (x *AKSNodeClass) GetContents() []byte { +func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { if x != nil { - return x.Contents + return x.InstanceFamilies } return nil } -type GCPKarpenterSpec struct { +type GetInstanceSizesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - NodeClasses []*GCENodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *GCPKarpenterSpec) Reset() { - *x = GCPKarpenterSpec{} +func (x *GetInstanceSizesRequest) Reset() { + *x = GetInstanceSizesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[276] + mi := &file_api_v1_recommendation_proto_msgTypes[293] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPKarpenterSpec) String() string { +func (x *GetInstanceSizesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPKarpenterSpec) ProtoMessage() {} +func (*GetInstanceSizesRequest) ProtoMessage() {} -func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[276] +func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[293] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21873,50 +25538,43 @@ func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPKarpenterSpec.ProtoReflect.Descriptor instead. -func (*GCPKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{276} -} - -func (x *GCPKarpenterSpec) GetNp() []*NodePool { - if x != nil { - return x.Np - } - return nil +// Deprecated: Use GetInstanceSizesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{293} } -func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { +func (x *GetInstanceSizesRequest) GetCloudProviders() []string { if x != nil { - return x.NodeClasses + return x.CloudProviders } return nil } -type GCENodeClass struct { +type GetInstanceSizesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/cloudpilot-ai/karpenter-provider-gcp/pkg/apis/v1alpha1.GCENodeClass + InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` } -func (x *GCENodeClass) Reset() { - *x = GCENodeClass{} +func (x *GetInstanceSizesResponse) Reset() { + *x = GetInstanceSizesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[277] + mi := &file_api_v1_recommendation_proto_msgTypes[294] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCENodeClass) String() string { +func (x *GetInstanceSizesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCENodeClass) ProtoMessage() {} +func (*GetInstanceSizesResponse) ProtoMessage() {} -func (x *GCENodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[277] +func (x *GetInstanceSizesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[294] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21927,44 +25585,43 @@ func (x *GCENodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCENodeClass.ProtoReflect.Descriptor instead. -func (*GCENodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{277} +// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} } -func (x *GCENodeClass) GetContents() []byte { +func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { if x != nil { - return x.Contents + return x.InstanceSizes } return nil } -type OCIKarpenterSpec struct { +type GetInstanceShapesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - NodeClasses []*OCINodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *OCIKarpenterSpec) Reset() { - *x = OCIKarpenterSpec{} +func (x *GetInstanceShapesRequest) Reset() { + *x = GetInstanceShapesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[278] + mi := &file_api_v1_recommendation_proto_msgTypes[295] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIKarpenterSpec) String() string { +func (x *GetInstanceShapesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIKarpenterSpec) ProtoMessage() {} +func (*GetInstanceShapesRequest) ProtoMessage() {} -func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[278] +func (x *GetInstanceShapesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[295] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21975,50 +25632,43 @@ func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIKarpenterSpec.ProtoReflect.Descriptor instead. -func (*OCIKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{278} -} - -func (x *OCIKarpenterSpec) GetNp() []*NodePool { - if x != nil { - return x.Np - } - return nil +// Deprecated: Use GetInstanceShapesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceShapesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{295} } -func (x *OCIKarpenterSpec) GetNodeClasses() []*OCINodeClass { +func (x *GetInstanceShapesRequest) GetCloudProviders() []string { if x != nil { - return x.NodeClasses + return x.CloudProviders } return nil } -type OCINodeClass struct { +type GetInstanceShapesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/zoom/karpenter-oci/pkg/apis/v1alpha1.OciNodeClass + InstanceShapes []*InstanceShape `protobuf:"bytes,1,rep,name=instance_shapes,json=instanceShapes,proto3" json:"instance_shapes,omitempty"` } -func (x *OCINodeClass) Reset() { - *x = OCINodeClass{} +func (x *GetInstanceShapesResponse) Reset() { + *x = GetInstanceShapesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[279] + mi := &file_api_v1_recommendation_proto_msgTypes[296] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCINodeClass) String() string { +func (x *GetInstanceShapesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClass) ProtoMessage() {} +func (*GetInstanceShapesResponse) ProtoMessage() {} -func (x *OCINodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[279] +func (x *GetInstanceShapesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[296] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22029,65 +25679,44 @@ func (x *OCINodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCINodeClass.ProtoReflect.Descriptor instead. -func (*OCINodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{279} +// Deprecated: Use GetInstanceShapesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceShapesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{296} } -func (x *OCINodeClass) GetContents() []byte { +func (x *GetInstanceShapesResponse) GetInstanceShapes() []*InstanceShape { if x != nil { - return x.Contents + return x.InstanceShapes } return nil } -// StorageRecommendationPolicy represents a policy for PVC/storage optimization -type StorageRecommendationPolicy struct { +type InstanceFamily struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - ActionTrigger ActionTrigger `protobuf:"varint,5,opt,name=action_trigger,json=actionTrigger,proto3,enum=api.v1.ActionTrigger" json:"action_trigger,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,7,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,8,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - // Storage-specific parameters - TargetUtilizationPercent *float32 `protobuf:"fixed32,10,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,11,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,12,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,13,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - // New storage policy fields - CriticalDaysToFull *int32 `protobuf:"varint,14,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,15,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,16,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,17,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,18,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` - IsDefaultPolicy bool `protobuf:"varint,50,opt,name=is_default_policy,json=isDefaultPolicy,proto3" json:"is_default_policy,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *StorageRecommendationPolicy) Reset() { - *x = StorageRecommendationPolicy{} +func (x *InstanceFamily) Reset() { + *x = InstanceFamily{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[280] + mi := &file_api_v1_recommendation_proto_msgTypes[297] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StorageRecommendationPolicy) String() string { +func (x *InstanceFamily) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StorageRecommendationPolicy) ProtoMessage() {} +func (*InstanceFamily) ProtoMessage() {} -func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[280] +func (x *InstanceFamily) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[297] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22098,190 +25727,224 @@ func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StorageRecommendationPolicy.ProtoReflect.Descriptor instead. -func (*StorageRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{280} +// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. +func (*InstanceFamily) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} } -func (x *StorageRecommendationPolicy) GetPolicyId() string { +func (x *InstanceFamily) GetName() string { if x != nil { - return x.PolicyId + return x.Name } return "" } -func (x *StorageRecommendationPolicy) GetTeamId() string { +func (x *InstanceFamily) GetProviderName() string { if x != nil { - return x.TeamId + return x.ProviderName } return "" } -func (x *StorageRecommendationPolicy) GetName() string { - if x != nil { - return x.Name - } - return "" +type InstanceShape struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *StorageRecommendationPolicy) GetDescription() string { - if x != nil { - return x.Description +func (x *InstanceShape) Reset() { + *x = InstanceShape{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[298] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { - if x != nil { - return x.ActionTrigger +func (x *InstanceShape) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstanceShape) ProtoMessage() {} + +func (x *InstanceShape) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[298] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { +// Deprecated: Use InstanceShape.ProtoReflect.Descriptor instead. +func (*InstanceShape) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{298} +} + +func (x *InstanceShape) GetName() string { if x != nil { - return x.ActionTriggers + return x.Name } - return nil + return "" } -func (x *StorageRecommendationPolicy) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *InstanceShape) GetProviderName() string { + if x != nil { + return x.ProviderName } return "" } -func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds - } - return 0 +type InstanceSize struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent +func (x *InstanceSize) Reset() { + *x = InstanceSize{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[299] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull - } - return 0 +func (x *InstanceSize) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction +func (*InstanceSize) ProtoMessage() {} + +func (x *InstanceSize) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[299] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 +// Deprecated: Use InstanceSize.ProtoReflect.Descriptor instead. +func (*InstanceSize) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{299} } -func (x *StorageRecommendationPolicy) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *InstanceSize) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -func (x *StorageRecommendationPolicy) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays +func (x *InstanceSize) GetProviderName() string { + if x != nil { + return x.ProviderName } - return 0 + return "" } -func (x *StorageRecommendationPolicy) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib - } - return 0 +type InstanceCategory struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // e.g., "c", "D", "n" + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` // e.g., "Compute Optimized" + ProviderName string `protobuf:"bytes,3,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure", "GCP" } -func (x *StorageRecommendationPolicy) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd +func (x *InstanceCategory) Reset() { + *x = InstanceCategory{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[300] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *StorageRecommendationPolicy) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *InstanceCategory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstanceCategory) ProtoMessage() {} + +func (x *InstanceCategory) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[300] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetIsDefaultPolicy() bool { +// Deprecated: Use InstanceCategory.ProtoReflect.Descriptor instead. +func (*InstanceCategory) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{300} +} + +func (x *InstanceCategory) GetKey() string { if x != nil { - return x.IsDefaultPolicy + return x.Key } - return false + return "" } -func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { +func (x *InstanceCategory) GetLabel() string { if x != nil { - return x.CreatedAt + return x.Label } - return nil + return "" } -func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { +func (x *InstanceCategory) GetProviderName() string { if x != nil { - return x.UpdatedAt + return x.ProviderName } - return nil + return "" } -type CreateStorageRecommendationPolicyRequest struct { +type InstanceCPU struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,4,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,5,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,6,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - TargetUtilizationPercent *float32 `protobuf:"fixed32,7,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,8,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,9,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,10,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - CriticalDaysToFull *int32 `protobuf:"varint,11,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,12,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,13,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,14,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,15,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + Vcpu int32 `protobuf:"varint,1,opt,name=vcpu,proto3" json:"vcpu,omitempty"` // e.g., 2, 4, 8, 16 + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" } -func (x *CreateStorageRecommendationPolicyRequest) Reset() { - *x = CreateStorageRecommendationPolicyRequest{} +func (x *InstanceCPU) Reset() { + *x = InstanceCPU{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[281] + mi := &file_api_v1_recommendation_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyRequest) String() string { +func (x *InstanceCPU) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*InstanceCPU) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[281] +func (x *InstanceCPU) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[301] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22292,141 +25955,152 @@ func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use CreateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*CreateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{281} +// Deprecated: Use InstanceCPU.ProtoReflect.Descriptor instead. +func (*InstanceCPU) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{301} } -func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *InstanceCPU) GetVcpu() int32 { if x != nil { - return x.TeamId + return x.Vcpu } - return "" + return 0 } -func (x *CreateStorageRecommendationPolicyRequest) GetName() string { +func (x *InstanceCPU) GetProviderName() string { if x != nil { - return x.Name + return x.ProviderName } return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +type InstanceTypeName struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // e.g., "m5.large", "Standard_D4s_v3" + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" } -func (x *CreateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *InstanceTypeName) Reset() { + *x = InstanceTypeName{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[302] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *CreateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" +func (x *InstanceTypeName) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds +func (*InstanceTypeName) ProtoMessage() {} + +func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[302] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 +// Deprecated: Use InstanceTypeName.ProtoReflect.Descriptor instead. +func (*InstanceTypeName) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} } -func (x *CreateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull +func (x *InstanceTypeName) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction +func (x *InstanceTypeName) GetProviderName() string { + if x != nil { + return x.ProviderName } - return 0 + return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 +type GetInstanceCategoriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *CreateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *GetInstanceCategoriesRequest) Reset() { + *x = GetInstanceCategoriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[303] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *CreateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 +func (x *GetInstanceCategoriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib +func (*GetInstanceCategoriesRequest) ProtoMessage() {} + +func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[303] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd - } - return 0 +// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{303} } -func (x *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { + if x != nil { + return x.CloudProviders } - return 0 + return nil } -type CreateStorageRecommendationPolicyResponse struct { +type GetInstanceCategoriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` } -func (x *CreateStorageRecommendationPolicyResponse) Reset() { - *x = CreateStorageRecommendationPolicyResponse{} +func (x *GetInstanceCategoriesResponse) Reset() { + *x = GetInstanceCategoriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[282] + mi := &file_api_v1_recommendation_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyResponse) String() string { +func (x *GetInstanceCategoriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*GetInstanceCategoriesResponse) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[282] +func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[304] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22437,43 +26111,43 @@ func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use CreateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*CreateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{282} +// Deprecated: Use GetInstanceCategoriesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{304} } -func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { if x != nil { - return x.Policy + return x.InstanceCategories } return nil } -type GetStorageRecommendationPolicyRequest struct { +type GetInstanceCPUsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *GetStorageRecommendationPolicyRequest) Reset() { - *x = GetStorageRecommendationPolicyRequest{} +func (x *GetInstanceCPUsRequest) Reset() { + *x = GetInstanceCPUsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[283] + mi := &file_api_v1_recommendation_proto_msgTypes[305] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyRequest) String() string { +func (x *GetInstanceCPUsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*GetInstanceCPUsRequest) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[283] +func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[305] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22484,43 +26158,43 @@ func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{283} +// Deprecated: Use GetInstanceCPUsRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{305} } -func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { if x != nil { - return x.PolicyId + return x.CloudProviders } - return "" + return nil } -type GetStorageRecommendationPolicyResponse struct { +type GetInstanceCPUsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` } -func (x *GetStorageRecommendationPolicyResponse) Reset() { - *x = GetStorageRecommendationPolicyResponse{} +func (x *GetInstanceCPUsResponse) Reset() { + *x = GetInstanceCPUsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[284] + mi := &file_api_v1_recommendation_proto_msgTypes[306] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyResponse) String() string { +func (x *GetInstanceCPUsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*GetInstanceCPUsResponse) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[284] +func (x *GetInstanceCPUsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[306] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22531,43 +26205,43 @@ func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{284} +// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{306} } -func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { if x != nil { - return x.Policy + return x.InstanceCpus } return nil } -type ListStorageRecommendationPoliciesRequest struct { +type GetInstanceTypeNamesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *ListStorageRecommendationPoliciesRequest) Reset() { - *x = ListStorageRecommendationPoliciesRequest{} +func (x *GetInstanceTypeNamesRequest) Reset() { + *x = GetInstanceTypeNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[285] + mi := &file_api_v1_recommendation_proto_msgTypes[307] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesRequest) String() string { +func (x *GetInstanceTypeNamesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} +func (*GetInstanceTypeNamesRequest) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[285] +func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[307] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22578,43 +26252,43 @@ func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListStorageRecommendationPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListStorageRecommendationPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{285} +// Deprecated: Use GetInstanceTypeNamesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{307} } -func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { +func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { if x != nil { - return x.TeamId + return x.CloudProviders } - return "" + return nil } -type ListStorageRecommendationPoliciesResponse struct { +type GetInstanceTypeNamesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` } -func (x *ListStorageRecommendationPoliciesResponse) Reset() { - *x = ListStorageRecommendationPoliciesResponse{} +func (x *GetInstanceTypeNamesResponse) Reset() { + *x = GetInstanceTypeNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[286] + mi := &file_api_v1_recommendation_proto_msgTypes[308] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesResponse) String() string { +func (x *GetInstanceTypeNamesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} +func (*GetInstanceTypeNamesResponse) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[286] +func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[308] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22625,58 +26299,44 @@ func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use ListStorageRecommendationPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListStorageRecommendationPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{286} +// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{308} } -func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { +func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { if x != nil { - return x.Policies + return x.InstanceTypes } return nil } -type UpdateStorageRecommendationPolicyRequest struct { +type SubnetSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,5,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,6,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,7,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - TargetUtilizationPercent *float32 `protobuf:"fixed32,8,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,9,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,10,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,11,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - CriticalDaysToFull *int32 `protobuf:"varint,12,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,13,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,14,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,15,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,16,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (x *UpdateStorageRecommendationPolicyRequest) Reset() { - *x = UpdateStorageRecommendationPolicyRequest{} +func (x *SubnetSelectorTerm) Reset() { + *x = SubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[287] + mi := &file_api_v1_recommendation_proto_msgTypes[309] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyRequest) String() string { +func (x *SubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*SubnetSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[287] +func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[309] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22687,148 +26347,115 @@ func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use UpdateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{287} +// Deprecated: Use SubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*SubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{309} } -func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *SubnetSelectorTerm) GetTags() map[string]string { if x != nil { - return x.PolicyId + return x.Tags } - return "" + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *SubnetSelectorTerm) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *UpdateStorageRecommendationPolicyRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} +type SecurityGroupSelectorTerm struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } -func (x *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *SecurityGroupSelectorTerm) Reset() { + *x = SecurityGroupSelectorTerm{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[310] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" +func (x *SecurityGroupSelectorTerm) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 -} +func (*SecurityGroupSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[310] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 +// Deprecated: Use SecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*SecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{310} } -func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib +func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { + if x != nil { + return x.Tags } - return 0 + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd +func (x *SecurityGroupSelectorTerm) GetId() string { + if x != nil { + return x.Id } - return 0 + return "" } -func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *SecurityGroupSelectorTerm) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -type UpdateStorageRecommendationPolicyResponse struct { +type CapacityReservationSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` } -func (x *UpdateStorageRecommendationPolicyResponse) Reset() { - *x = UpdateStorageRecommendationPolicyResponse{} +func (x *CapacityReservationSelectorTerm) Reset() { + *x = CapacityReservationSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[288] + mi := &file_api_v1_recommendation_proto_msgTypes[311] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyResponse) String() string { +func (x *CapacityReservationSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*CapacityReservationSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[288] +func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[311] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22839,44 +26466,62 @@ func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use UpdateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{288} +// Deprecated: Use CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. +func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{311} } -func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { if x != nil { - return x.Policy + return x.Tags } return nil } -type DeleteStorageRecommendationPolicyRequest struct { +func (x *CapacityReservationSelectorTerm) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *CapacityReservationSelectorTerm) GetOwnerId() string { + if x != nil { + return x.OwnerId + } + return "" +} + +type AMISelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + SsmParameter string `protobuf:"bytes,6,opt,name=ssm_parameter,json=ssmParameter,proto3" json:"ssm_parameter,omitempty"` } -func (x *DeleteStorageRecommendationPolicyRequest) Reset() { - *x = DeleteStorageRecommendationPolicyRequest{} +func (x *AMISelectorTerm) Reset() { + *x = AMISelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[289] + mi := &file_api_v1_recommendation_proto_msgTypes[312] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStorageRecommendationPolicyRequest) String() string { +func (x *AMISelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*AMISelectorTerm) ProtoMessage() {} -func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[289] +func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[312] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22887,109 +26532,89 @@ func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use DeleteStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{289} +// Deprecated: Use AMISelectorTerm.ProtoReflect.Descriptor instead. +func (*AMISelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{312} } -func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *AMISelectorTerm) GetAlias() string { if x != nil { - return x.PolicyId + return x.Alias } return "" } -func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *AMISelectorTerm) GetTags() map[string]string { if x != nil { - return x.TeamId + return x.Tags } - return "" -} - -type DeleteStorageRecommendationPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + return nil } -func (x *DeleteStorageRecommendationPolicyResponse) Reset() { - *x = DeleteStorageRecommendationPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[290] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *AMISelectorTerm) GetId() string { + if x != nil { + return x.Id } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} - -func (x *DeleteStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[290] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *AMISelectorTerm) GetName() string { + if x != nil { + return x.Name } - return mi.MessageOf(x) + return "" } -// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} +func (x *AMISelectorTerm) GetOwner() string { + if x != nil { + return x.Owner + } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { +func (x *AMISelectorTerm) GetSsmParameter() string { if x != nil { - return x.Success + return x.SsmParameter } - return false + return "" } -// StoragePolicyTarget maps a storage policy to clusters with targeting filters -type StoragePolicyTarget struct { +type KubeletConfiguration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` - // Targeting filters - NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` // Target specific storage classes - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + ClusterDns []string `protobuf:"bytes,1,rep,name=cluster_dns,json=clusterDns,proto3" json:"cluster_dns,omitempty"` + MaxPods *int32 `protobuf:"varint,2,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + PodsPerCore *int32 `protobuf:"varint,3,opt,name=pods_per_core,json=podsPerCore,proto3,oneof" json:"pods_per_core,omitempty"` + SystemReserved map[string]string `protobuf:"bytes,4,rep,name=system_reserved,json=systemReserved,proto3" json:"system_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + KubeReserved map[string]string `protobuf:"bytes,5,rep,name=kube_reserved,json=kubeReserved,proto3" json:"kube_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionHard map[string]string `protobuf:"bytes,6,rep,name=eviction_hard,json=evictionHard,proto3" json:"eviction_hard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionSoft map[string]string `protobuf:"bytes,7,rep,name=eviction_soft,json=evictionSoft,proto3" json:"eviction_soft,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionSoftGracePeriod map[string]string `protobuf:"bytes,8,rep,name=eviction_soft_grace_period,json=evictionSoftGracePeriod,proto3" json:"eviction_soft_grace_period,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionMaxPodGracePeriod *int32 `protobuf:"varint,9,opt,name=eviction_max_pod_grace_period,json=evictionMaxPodGracePeriod,proto3,oneof" json:"eviction_max_pod_grace_period,omitempty"` + ImageGcHighThresholdPercent *int32 `protobuf:"varint,10,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` + ImageGcLowThresholdPercent *int32 `protobuf:"varint,11,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` + CpuCfsQuota *bool `protobuf:"varint,12,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` } -func (x *StoragePolicyTarget) Reset() { - *x = StoragePolicyTarget{} +func (x *KubeletConfiguration) Reset() { + *x = KubeletConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[291] + mi := &file_api_v1_recommendation_proto_msgTypes[313] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StoragePolicyTarget) String() string { +func (x *KubeletConfiguration) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StoragePolicyTarget) ProtoMessage() {} +func (*KubeletConfiguration) ProtoMessage() {} -func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[291] +func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[313] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23000,120 +26625,122 @@ func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StoragePolicyTarget.ProtoReflect.Descriptor instead. -func (*StoragePolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{291} +// Deprecated: Use KubeletConfiguration.ProtoReflect.Descriptor instead. +func (*KubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} } -func (x *StoragePolicyTarget) GetTargetId() string { +func (x *KubeletConfiguration) GetClusterDns() []string { if x != nil { - return x.TargetId + return x.ClusterDns } - return "" + return nil } -func (x *StoragePolicyTarget) GetName() string { - if x != nil { - return x.Name +func (x *KubeletConfiguration) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods } - return "" + return 0 } -func (x *StoragePolicyTarget) GetDescription() string { - if x != nil { - return x.Description +func (x *KubeletConfiguration) GetPodsPerCore() int32 { + if x != nil && x.PodsPerCore != nil { + return *x.PodsPerCore } - return "" + return 0 } -func (x *StoragePolicyTarget) GetTeamId() string { +func (x *KubeletConfiguration) GetSystemReserved() map[string]string { if x != nil { - return x.TeamId + return x.SystemReserved } - return "" + return nil } -func (x *StoragePolicyTarget) GetClusterIds() []string { +func (x *KubeletConfiguration) GetKubeReserved() map[string]string { if x != nil { - return x.ClusterIds + return x.KubeReserved } return nil } -func (x *StoragePolicyTarget) GetPolicyId() string { +func (x *KubeletConfiguration) GetEvictionHard() map[string]string { if x != nil { - return x.PolicyId + return x.EvictionHard } - return "" + return nil } -func (x *StoragePolicyTarget) GetEnabled() bool { +func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { if x != nil { - return x.Enabled + return x.EvictionSoft } - return false + return nil } -func (x *StoragePolicyTarget) GetNamespaceSelector() *LabelSelector { +func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { if x != nil { - return x.NamespaceSelector + return x.EvictionSoftGracePeriod } return nil } -func (x *StoragePolicyTarget) GetStorageClasses() []string { - if x != nil { - return x.StorageClasses +func (x *KubeletConfiguration) GetEvictionMaxPodGracePeriod() int32 { + if x != nil && x.EvictionMaxPodGracePeriod != nil { + return *x.EvictionMaxPodGracePeriod } - return nil + return 0 } -func (x *StoragePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *KubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent } - return nil + return 0 } -func (x *StoragePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt +func (x *KubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent } - return nil + return 0 } -type CreateStoragePolicyTargetRequest struct { +func (x *KubeletConfiguration) GetCpuCfsQuota() bool { + if x != nil && x.CpuCfsQuota != nil { + return *x.CpuCfsQuota + } + return false +} + +type BlockDeviceMapping struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,4,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,6,opt,name=enabled,proto3" json:"enabled,omitempty"` - NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` - StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` + DeviceName *string `protobuf:"bytes,1,opt,name=device_name,json=deviceName,proto3,oneof" json:"device_name,omitempty"` + Ebs *BlockDevice `protobuf:"bytes,2,opt,name=ebs,proto3,oneof" json:"ebs,omitempty"` + RootVolume *bool `protobuf:"varint,3,opt,name=root_volume,json=rootVolume,proto3,oneof" json:"root_volume,omitempty"` } -func (x *CreateStoragePolicyTargetRequest) Reset() { - *x = CreateStoragePolicyTargetRequest{} +func (x *BlockDeviceMapping) Reset() { + *x = BlockDeviceMapping{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[292] + mi := &file_api_v1_recommendation_proto_msgTypes[314] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetRequest) String() string { +func (x *BlockDeviceMapping) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} +func (*BlockDeviceMapping) ProtoMessage() {} -func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[292] +func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[314] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23124,92 +26751,65 @@ func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*CreateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{292} -} - -func (x *CreateStoragePolicyTargetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CreateStoragePolicyTargetRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use BlockDeviceMapping.ProtoReflect.Descriptor instead. +func (*BlockDeviceMapping) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{314} } -func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *BlockDeviceMapping) GetDeviceName() string { + if x != nil && x.DeviceName != nil { + return *x.DeviceName } return "" } -func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { +func (x *BlockDeviceMapping) GetEbs() *BlockDevice { if x != nil { - return x.ClusterIds + return x.Ebs } return nil } -func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId - } - return "" -} - -func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { - if x != nil { - return x.Enabled +func (x *BlockDeviceMapping) GetRootVolume() bool { + if x != nil && x.RootVolume != nil { + return *x.RootVolume } return false } -func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { - if x != nil { - return x.NamespaceSelector - } - return nil -} - -func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { - if x != nil { - return x.StorageClasses - } - return nil -} - -type CreateStoragePolicyTargetResponse struct { +type BlockDevice struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + DeleteOnTermination *bool `protobuf:"varint,1,opt,name=delete_on_termination,json=deleteOnTermination,proto3,oneof" json:"delete_on_termination,omitempty"` + Encrypted *bool `protobuf:"varint,2,opt,name=encrypted,proto3,oneof" json:"encrypted,omitempty"` + Iops *int64 `protobuf:"varint,3,opt,name=iops,proto3,oneof" json:"iops,omitempty"` + KmsKeyId *string `protobuf:"bytes,4,opt,name=kms_key_id,json=kmsKeyId,proto3,oneof" json:"kms_key_id,omitempty"` + SnapshotId *string `protobuf:"bytes,5,opt,name=snapshot_id,json=snapshotId,proto3,oneof" json:"snapshot_id,omitempty"` + Throughput *int64 `protobuf:"varint,6,opt,name=throughput,proto3,oneof" json:"throughput,omitempty"` + VolumeInitializationRate *int32 `protobuf:"varint,7,opt,name=volume_initialization_rate,json=volumeInitializationRate,proto3,oneof" json:"volume_initialization_rate,omitempty"` + VolumeSize *string `protobuf:"bytes,8,opt,name=volume_size,json=volumeSize,proto3,oneof" json:"volume_size,omitempty"` + VolumeType *string `protobuf:"bytes,9,opt,name=volume_type,json=volumeType,proto3,oneof" json:"volume_type,omitempty"` } -func (x *CreateStoragePolicyTargetResponse) Reset() { - *x = CreateStoragePolicyTargetResponse{} +func (x *BlockDevice) Reset() { + *x = BlockDevice{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[293] + mi := &file_api_v1_recommendation_proto_msgTypes[315] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetResponse) String() string { +func (x *BlockDevice) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} +func (*BlockDevice) ProtoMessage() {} -func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[293] +func (x *BlockDevice) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[315] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23220,98 +26820,102 @@ func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use CreateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*CreateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{293} +// Deprecated: Use BlockDevice.ProtoReflect.Descriptor instead. +func (*BlockDevice) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{315} } -func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { - if x != nil { - return x.Target +func (x *BlockDevice) GetDeleteOnTermination() bool { + if x != nil && x.DeleteOnTermination != nil { + return *x.DeleteOnTermination } - return nil -} - -type ListStoragePolicyTargetsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + return false } -func (x *ListStoragePolicyTargetsRequest) Reset() { - *x = ListStoragePolicyTargetsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[294] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *BlockDevice) GetEncrypted() bool { + if x != nil && x.Encrypted != nil { + return *x.Encrypted } + return false } -func (x *ListStoragePolicyTargetsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} - -func (x *ListStoragePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[294] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *BlockDevice) GetIops() int64 { + if x != nil && x.Iops != nil { + return *x.Iops } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} +func (x *BlockDevice) GetKmsKeyId() string { + if x != nil && x.KmsKeyId != nil { + return *x.KmsKeyId + } + return "" } -func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *BlockDevice) GetSnapshotId() string { + if x != nil && x.SnapshotId != nil { + return *x.SnapshotId } return "" } -func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *BlockDevice) GetThroughput() int64 { + if x != nil && x.Throughput != nil { + return *x.Throughput + } + return 0 +} + +func (x *BlockDevice) GetVolumeInitializationRate() int32 { + if x != nil && x.VolumeInitializationRate != nil { + return *x.VolumeInitializationRate + } + return 0 +} + +func (x *BlockDevice) GetVolumeSize() string { + if x != nil && x.VolumeSize != nil { + return *x.VolumeSize } return "" } -type ListStoragePolicyTargetsResponse struct { +func (x *BlockDevice) GetVolumeType() string { + if x != nil && x.VolumeType != nil { + return *x.VolumeType + } + return "" +} + +type MetadataOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + HttpEndpoint *string `protobuf:"bytes,1,opt,name=http_endpoint,json=httpEndpoint,proto3,oneof" json:"http_endpoint,omitempty"` + HttpProtocolIpv6 *string `protobuf:"bytes,2,opt,name=http_protocol_ipv6,json=httpProtocolIpv6,proto3,oneof" json:"http_protocol_ipv6,omitempty"` + HttpPutResponseHopLimit *int64 `protobuf:"varint,3,opt,name=http_put_response_hop_limit,json=httpPutResponseHopLimit,proto3,oneof" json:"http_put_response_hop_limit,omitempty"` + HttpTokens *string `protobuf:"bytes,4,opt,name=http_tokens,json=httpTokens,proto3,oneof" json:"http_tokens,omitempty"` } -func (x *ListStoragePolicyTargetsResponse) Reset() { - *x = ListStoragePolicyTargetsResponse{} +func (x *MetadataOptions) Reset() { + *x = MetadataOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[295] + mi := &file_api_v1_recommendation_proto_msgTypes[316] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStoragePolicyTargetsResponse) String() string { +func (x *MetadataOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} +func (*MetadataOptions) ProtoMessage() {} -func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[295] +func (x *MetadataOptions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[316] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23322,43 +26926,71 @@ func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{295} +// Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. +func (*MetadataOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{316} } -func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { - if x != nil { - return x.Targets +func (x *MetadataOptions) GetHttpEndpoint() string { + if x != nil && x.HttpEndpoint != nil { + return *x.HttpEndpoint } - return nil + return "" } -type UpdateStoragePolicyTargetRequest struct { +func (x *MetadataOptions) GetHttpProtocolIpv6() string { + if x != nil && x.HttpProtocolIpv6 != nil { + return *x.HttpProtocolIpv6 + } + return "" +} + +func (x *MetadataOptions) GetHttpPutResponseHopLimit() int64 { + if x != nil && x.HttpPutResponseHopLimit != nil { + return *x.HttpPutResponseHopLimit + } + return 0 +} + +func (x *MetadataOptions) GetHttpTokens() string { + if x != nil && x.HttpTokens != nil { + return *x.HttpTokens + } + return "" +} + +type GCPNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + ServiceAccount string `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + ImageSelectorTerms []*GCPImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector_terms,json=imageSelectorTerms,proto3" json:"image_selector_terms,omitempty"` + ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` + KubeletConfiguration *KubeletConfiguration `protobuf:"bytes,4,opt,name=kubelet_configuration,json=kubeletConfiguration,proto3,oneof" json:"kubelet_configuration,omitempty"` + Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NetworkTags []string `protobuf:"bytes,7,rep,name=network_tags,json=networkTags,proto3" json:"network_tags,omitempty"` + Disks []*GCPDisk `protobuf:"bytes,8,rep,name=disks,proto3" json:"disks,omitempty"` } -func (x *UpdateStoragePolicyTargetRequest) Reset() { - *x = UpdateStoragePolicyTargetRequest{} +func (x *GCPNodeClassSpec) Reset() { + *x = GCPNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[296] + mi := &file_api_v1_recommendation_proto_msgTypes[317] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStoragePolicyTargetRequest) String() string { +func (x *GCPNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} +func (*GCPNodeClassSpec) ProtoMessage() {} -func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[296] +func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[317] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23369,91 +27001,93 @@ func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*UpdateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{296} +// Deprecated: Use GCPNodeClassSpec.ProtoReflect.Descriptor instead. +func (*GCPNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{317} } -func (x *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { +func (x *GCPNodeClassSpec) GetServiceAccount() string { if x != nil { - return x.Target + return x.ServiceAccount } - return nil + return "" } -type UpdateStoragePolicyTargetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { + if x != nil { + return x.ImageSelectorTerms + } + return nil } -func (x *UpdateStoragePolicyTargetResponse) Reset() { - *x = UpdateStoragePolicyTargetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[297] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GCPNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily } + return "" } -func (x *UpdateStoragePolicyTargetResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { + if x != nil { + return x.KubeletConfiguration + } + return nil } -func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} +func (x *GCPNodeClassSpec) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} -func (x *UpdateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[297] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GCPNodeClassSpec) GetMetadata() map[string]string { + if x != nil { + return x.Metadata } - return mi.MessageOf(x) + return nil } -// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} +func (x *GCPNodeClassSpec) GetNetworkTags() []string { + if x != nil { + return x.NetworkTags + } + return nil } -func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { +func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { if x != nil { - return x.Target + return x.Disks } return nil } -type DeleteStoragePolicyTargetRequest struct { +type GCPImageSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (x *DeleteStoragePolicyTargetRequest) Reset() { - *x = DeleteStoragePolicyTargetRequest{} +func (x *GCPImageSelectorTerm) Reset() { + *x = GCPImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[298] + mi := &file_api_v1_recommendation_proto_msgTypes[318] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetRequest) String() string { +func (x *GCPImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} +func (*GCPImageSelectorTerm) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[298] +func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[318] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23464,50 +27098,54 @@ func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*DeleteStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{298} +// Deprecated: Use GCPImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*GCPImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{318} } -func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { +func (x *GCPImageSelectorTerm) GetAlias() string { if x != nil { - return x.TargetId + return x.Alias } return "" } -func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { +func (x *GCPImageSelectorTerm) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -type DeleteStoragePolicyTargetResponse struct { +type GCPDisk struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + SizeGib int32 `protobuf:"varint,1,opt,name=size_gib,json=sizeGib,proto3" json:"size_gib,omitempty"` + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + Boot bool `protobuf:"varint,3,opt,name=boot,proto3" json:"boot,omitempty"` + SecondaryBootImage string `protobuf:"bytes,4,opt,name=secondary_boot_image,json=secondaryBootImage,proto3" json:"secondary_boot_image,omitempty"` + SecondaryBootMode string `protobuf:"bytes,5,opt,name=secondary_boot_mode,json=secondaryBootMode,proto3" json:"secondary_boot_mode,omitempty"` } -func (x *DeleteStoragePolicyTargetResponse) Reset() { - *x = DeleteStoragePolicyTargetResponse{} +func (x *GCPDisk) Reset() { + *x = GCPDisk{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[299] + mi := &file_api_v1_recommendation_proto_msgTypes[319] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetResponse) String() string { +func (x *GCPDisk) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} +func (*GCPDisk) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[299] +func (x *GCPDisk) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[319] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23518,72 +27156,78 @@ func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use DeleteStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*DeleteStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{299} +// Deprecated: Use GCPDisk.ProtoReflect.Descriptor instead. +func (*GCPDisk) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{319} } -func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { +func (x *GCPDisk) GetSizeGib() int32 { if x != nil { - return x.Success + return x.SizeGib + } + return 0 +} + +func (x *GCPDisk) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +func (x *GCPDisk) GetBoot() bool { + if x != nil { + return x.Boot } return false } -// PvcStorageRecommendation represents a specific recommendation for a PVC -type PvcStorageRecommendation struct { +func (x *GCPDisk) GetSecondaryBootImage() string { + if x != nil { + return x.SecondaryBootImage + } + return "" +} + +func (x *GCPDisk) GetSecondaryBootMode() string { + if x != nil { + return x.SecondaryBootMode + } + return "" +} + +type AzureNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - PvcUid string `protobuf:"bytes,2,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PvcName string `protobuf:"bytes,3,opt,name=pvc_name,json=pvcName,proto3" json:"pvc_name,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - CurrentCapacityBytes int64 `protobuf:"varint,10,opt,name=current_capacity_bytes,json=currentCapacityBytes,proto3" json:"current_capacity_bytes,omitempty"` - RecommendedCapacityBytes int64 `protobuf:"varint,11,opt,name=recommended_capacity_bytes,json=recommendedCapacityBytes,proto3" json:"recommended_capacity_bytes,omitempty"` - UsedBytesAtTime int64 `protobuf:"varint,12,opt,name=used_bytes_at_time,json=usedBytesAtTime,proto3" json:"used_bytes_at_time,omitempty"` - UtilizationPct float64 `protobuf:"fixed64,13,opt,name=utilization_pct,json=utilizationPct,proto3" json:"utilization_pct,omitempty"` - GrowthRateBytesPerDay float64 `protobuf:"fixed64,14,opt,name=growth_rate_bytes_per_day,json=growthRateBytesPerDay,proto3" json:"growth_rate_bytes_per_day,omitempty"` - DaysToFull float64 `protobuf:"fixed64,15,opt,name=days_to_full,json=daysToFull,proto3" json:"days_to_full,omitempty"` - ConfidenceScore float64 `protobuf:"fixed64,16,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` - PolicyId string `protobuf:"bytes,20,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - PolicyTargetId *string `protobuf:"bytes,21,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` - CostCurrentMonthlyUsd float64 `protobuf:"fixed64,25,opt,name=cost_current_monthly_usd,json=costCurrentMonthlyUsd,proto3" json:"cost_current_monthly_usd,omitempty"` - CostRecommendedMonthlyUsd float64 `protobuf:"fixed64,26,opt,name=cost_recommended_monthly_usd,json=costRecommendedMonthlyUsd,proto3" json:"cost_recommended_monthly_usd,omitempty"` - CostDeltaMonthlyUsd float64 `protobuf:"fixed64,27,opt,name=cost_delta_monthly_usd,json=costDeltaMonthlyUsd,proto3" json:"cost_delta_monthly_usd,omitempty"` - Status RecommendationStatus `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` - Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` - Error *string `protobuf:"bytes,32,opt,name=error,proto3,oneof" json:"error,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,40,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - AppliedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - OperationType PvcOperationType `protobuf:"varint,60,opt,name=operation_type,json=operationType,proto3,enum=api.v1.PvcOperationType" json:"operation_type,omitempty"` - WorkloadKind *string `protobuf:"bytes,61,opt,name=workload_kind,json=workloadKind,proto3,oneof" json:"workload_kind,omitempty"` - WorkloadName *string `protobuf:"bytes,62,opt,name=workload_name,json=workloadName,proto3,oneof" json:"workload_name,omitempty"` - WorkloadUid *string `protobuf:"bytes,63,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` + VnetSubnetId *string `protobuf:"bytes,1,opt,name=vnet_subnet_id,json=vnetSubnetId,proto3,oneof" json:"vnet_subnet_id,omitempty"` + OsDiskSizeGb *int32 `protobuf:"varint,2,opt,name=os_disk_size_gb,json=osDiskSizeGb,proto3,oneof" json:"os_disk_size_gb,omitempty"` + ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` // Ubuntu, Ubuntu2204, Ubuntu2404, AzureLinux + FipsMode *string `protobuf:"bytes,4,opt,name=fips_mode,json=fipsMode,proto3,oneof" json:"fips_mode,omitempty"` // FIPS or Disabled + Tags map[string]string `protobuf:"bytes,5,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Kubelet *AzureKubeletConfiguration `protobuf:"bytes,6,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` + MaxPods *int32 `protobuf:"varint,7,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + ImageVersion *string `protobuf:"bytes,8,opt,name=image_version,json=imageVersion,proto3,oneof" json:"image_version,omitempty"` } -func (x *PvcStorageRecommendation) Reset() { - *x = PvcStorageRecommendation{} +func (x *AzureNodeClassSpec) Reset() { + *x = AzureNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[300] + mi := &file_api_v1_recommendation_proto_msgTypes[320] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PvcStorageRecommendation) String() string { +func (x *AzureNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PvcStorageRecommendation) ProtoMessage() {} +func (*AzureNodeClassSpec) ProtoMessage() {} -func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[300] +func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[320] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23594,239 +27238,213 @@ func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PvcStorageRecommendation.ProtoReflect.Descriptor instead. -func (*PvcStorageRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{300} +// Deprecated: Use AzureNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AzureNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{320} } -func (x *PvcStorageRecommendation) GetRecommendationId() string { - if x != nil { - return x.RecommendationId +func (x *AzureNodeClassSpec) GetVnetSubnetId() string { + if x != nil && x.VnetSubnetId != nil { + return *x.VnetSubnetId } return "" } -func (x *PvcStorageRecommendation) GetPvcUid() string { - if x != nil { - return x.PvcUid +func (x *AzureNodeClassSpec) GetOsDiskSizeGb() int32 { + if x != nil && x.OsDiskSizeGb != nil { + return *x.OsDiskSizeGb } - return "" + return 0 } -func (x *PvcStorageRecommendation) GetPvcName() string { - if x != nil { - return x.PvcName +func (x *AzureNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily } return "" } -func (x *PvcStorageRecommendation) GetNamespace() string { - if x != nil { - return x.Namespace +func (x *AzureNodeClassSpec) GetFipsMode() string { + if x != nil && x.FipsMode != nil { + return *x.FipsMode } return "" } -func (x *PvcStorageRecommendation) GetClusterId() string { +func (x *AzureNodeClassSpec) GetTags() map[string]string { if x != nil { - return x.ClusterId + return x.Tags } - return "" + return nil } -func (x *PvcStorageRecommendation) GetTeamId() string { +func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { if x != nil { - return x.TeamId + return x.Kubelet } - return "" + return nil } -func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { - if x != nil { - return x.CurrentCapacityBytes +func (x *AzureNodeClassSpec) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods } return 0 } -func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { - if x != nil { - return x.RecommendedCapacityBytes +func (x *AzureNodeClassSpec) GetImageVersion() string { + if x != nil && x.ImageVersion != nil { + return *x.ImageVersion } - return 0 + return "" } -func (x *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { - if x != nil { - return x.UsedBytesAtTime - } - return 0 +type AzureKubeletConfiguration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuManagerPolicy *string `protobuf:"bytes,1,opt,name=cpu_manager_policy,json=cpuManagerPolicy,proto3,oneof" json:"cpu_manager_policy,omitempty"` // none, static + CpuCfsQuota *bool `protobuf:"varint,2,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` + CpuCfsQuotaPeriod *string `protobuf:"bytes,3,opt,name=cpu_cfs_quota_period,json=cpuCfsQuotaPeriod,proto3,oneof" json:"cpu_cfs_quota_period,omitempty"` // e.g., "100ms" + ImageGcHighThresholdPercent *int32 `protobuf:"varint,4,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` + ImageGcLowThresholdPercent *int32 `protobuf:"varint,5,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` + TopologyManagerPolicy *string `protobuf:"bytes,6,opt,name=topology_manager_policy,json=topologyManagerPolicy,proto3,oneof" json:"topology_manager_policy,omitempty"` // restricted, best-effort, none, single-numa-node + AllowedUnsafeSysctls []string `protobuf:"bytes,7,rep,name=allowed_unsafe_sysctls,json=allowedUnsafeSysctls,proto3" json:"allowed_unsafe_sysctls,omitempty"` + ContainerLogMaxSize *string `protobuf:"bytes,8,opt,name=container_log_max_size,json=containerLogMaxSize,proto3,oneof" json:"container_log_max_size,omitempty"` // e.g., "50Mi" + ContainerLogMaxFiles *int32 `protobuf:"varint,9,opt,name=container_log_max_files,json=containerLogMaxFiles,proto3,oneof" json:"container_log_max_files,omitempty"` + PodPidsLimit *int64 `protobuf:"varint,10,opt,name=pod_pids_limit,json=podPidsLimit,proto3,oneof" json:"pod_pids_limit,omitempty"` } -func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { - if x != nil { - return x.UtilizationPct +func (x *AzureKubeletConfiguration) Reset() { + *x = AzureKubeletConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[321] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { - if x != nil { - return x.GrowthRateBytesPerDay - } - return 0 +func (x *AzureKubeletConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *PvcStorageRecommendation) GetDaysToFull() float64 { - if x != nil { - return x.DaysToFull +func (*AzureKubeletConfiguration) ProtoMessage() {} + +func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[321] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { - if x != nil { - return x.ConfidenceScore - } - return 0 +// Deprecated: Use AzureKubeletConfiguration.ProtoReflect.Descriptor instead. +func (*AzureKubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{321} } -func (x *PvcStorageRecommendation) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *AzureKubeletConfiguration) GetCpuManagerPolicy() string { + if x != nil && x.CpuManagerPolicy != nil { + return *x.CpuManagerPolicy } return "" } -func (x *PvcStorageRecommendation) GetPolicyTargetId() string { - if x != nil && x.PolicyTargetId != nil { - return *x.PolicyTargetId +func (x *AzureKubeletConfiguration) GetCpuCfsQuota() bool { + if x != nil && x.CpuCfsQuota != nil { + return *x.CpuCfsQuota + } + return false +} + +func (x *AzureKubeletConfiguration) GetCpuCfsQuotaPeriod() string { + if x != nil && x.CpuCfsQuotaPeriod != nil { + return *x.CpuCfsQuotaPeriod } return "" } -func (x *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { - if x != nil { - return x.CostCurrentMonthlyUsd +func (x *AzureKubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent } return 0 } -func (x *PvcStorageRecommendation) GetCostRecommendedMonthlyUsd() float64 { - if x != nil { - return x.CostRecommendedMonthlyUsd +func (x *AzureKubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent } return 0 } -func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { - if x != nil { - return x.CostDeltaMonthlyUsd +func (x *AzureKubeletConfiguration) GetTopologyManagerPolicy() string { + if x != nil && x.TopologyManagerPolicy != nil { + return *x.TopologyManagerPolicy } - return 0 + return "" } -func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { +func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { if x != nil { - return x.Status + return x.AllowedUnsafeSysctls } - return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED + return nil } -func (x *PvcStorageRecommendation) GetReasoning() string { - if x != nil && x.Reasoning != nil { - return *x.Reasoning +func (x *AzureKubeletConfiguration) GetContainerLogMaxSize() string { + if x != nil && x.ContainerLogMaxSize != nil { + return *x.ContainerLogMaxSize } return "" } -func (x *PvcStorageRecommendation) GetError() string { - if x != nil && x.Error != nil { - return *x.Error +func (x *AzureKubeletConfiguration) GetContainerLogMaxFiles() int32 { + if x != nil && x.ContainerLogMaxFiles != nil { + return *x.ContainerLogMaxFiles } - return "" + return 0 } -func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp +func (x *AzureKubeletConfiguration) GetPodPidsLimit() int64 { + if x != nil && x.PodPidsLimit != nil { + return *x.PodPidsLimit } - return nil + return 0 } -func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { - if x != nil { - return x.AppliedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { - if x != nil { - return x.OperationType - } - return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED -} - -func (x *PvcStorageRecommendation) GetWorkloadKind() string { - if x != nil && x.WorkloadKind != nil { - return *x.WorkloadKind - } - return "" -} - -func (x *PvcStorageRecommendation) GetWorkloadName() string { - if x != nil && x.WorkloadName != nil { - return *x.WorkloadName - } - return "" -} - -func (x *PvcStorageRecommendation) GetWorkloadUid() string { - if x != nil && x.WorkloadUid != nil { - return *x.WorkloadUid - } - return "" -} - -type GetPvcStorageRecommendationRequest struct { +type OCIImageSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + CompartmentId string `protobuf:"bytes,3,opt,name=compartment_id,json=compartmentId,proto3" json:"compartment_id,omitempty"` } -func (x *GetPvcStorageRecommendationRequest) Reset() { - *x = GetPvcStorageRecommendationRequest{} +func (x *OCIImageSelectorTerm) Reset() { + *x = OCIImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[301] + mi := &file_api_v1_recommendation_proto_msgTypes[322] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPvcStorageRecommendationRequest) String() string { +func (x *OCIImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCIImageSelectorTerm) ProtoMessage() {} -func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[301] +func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[322] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23837,43 +27455,58 @@ func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*GetPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{301} +// Deprecated: Use OCIImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCIImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{322} } -func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { +func (x *OCIImageSelectorTerm) GetId() string { if x != nil { - return x.RecommendationId + return x.Id } return "" } -type GetPvcStorageRecommendationResponse struct { +func (x *OCIImageSelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OCIImageSelectorTerm) GetCompartmentId() string { + if x != nil { + return x.CompartmentId + } + return "" +} + +type OCISubnetSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *GetPvcStorageRecommendationResponse) Reset() { - *x = GetPvcStorageRecommendationResponse{} +func (x *OCISubnetSelectorTerm) Reset() { + *x = OCISubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[302] + mi := &file_api_v1_recommendation_proto_msgTypes[323] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPvcStorageRecommendationResponse) String() string { +func (x *OCISubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} +func (*OCISubnetSelectorTerm) ProtoMessage() {} -func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[302] +func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[323] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23884,45 +27517,51 @@ func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} +// Deprecated: Use OCISubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{323} } -func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *OCISubnetSelectorTerm) GetId() string { if x != nil { - return x.Recommendation + return x.Id } - return nil + return "" } -type ListPvcStorageRecommendationsRequest struct { +func (x *OCISubnetSelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type OCISecurityGroupSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` - Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *ListPvcStorageRecommendationsRequest) Reset() { - *x = ListPvcStorageRecommendationsRequest{} +func (x *OCISecurityGroupSelectorTerm) Reset() { + *x = OCISecurityGroupSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[303] + mi := &file_api_v1_recommendation_proto_msgTypes[324] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsRequest) String() string { +func (x *OCISecurityGroupSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} +func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[303] +func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[324] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23933,58 +27572,51 @@ func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListPvcStorageRecommendationsRequest.ProtoReflect.Descriptor instead. -func (*ListPvcStorageRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{303} +// Deprecated: Use OCISecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{324} } -func (x *ListPvcStorageRecommendationsRequest) GetTeamId() string { +func (x *OCISecurityGroupSelectorTerm) GetId() string { if x != nil { - return x.TeamId - } - return "" -} - -func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId + return x.Id } return "" } -func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { +func (x *OCISecurityGroupSelectorTerm) GetName() string { if x != nil { - return x.Pagination + return x.Name } - return nil + return "" } -type ListPvcStorageRecommendationsResponse struct { +type OCIBootConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendations []*PvcStorageRecommendation `protobuf:"bytes,1,rep,name=recommendations,proto3" json:"recommendations,omitempty"` - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + BootVolumeSizeInGbs int64 `protobuf:"varint,1,opt,name=boot_volume_size_in_gbs,json=bootVolumeSizeInGbs,proto3" json:"boot_volume_size_in_gbs,omitempty"` + BootVolumeVpusPerGb int64 `protobuf:"varint,2,opt,name=boot_volume_vpus_per_gb,json=bootVolumeVpusPerGb,proto3" json:"boot_volume_vpus_per_gb,omitempty"` } -func (x *ListPvcStorageRecommendationsResponse) Reset() { - *x = ListPvcStorageRecommendationsResponse{} +func (x *OCIBootConfig) Reset() { + *x = OCIBootConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[304] + mi := &file_api_v1_recommendation_proto_msgTypes[325] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsResponse) String() string { +func (x *OCIBootConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} +func (*OCIBootConfig) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[304] +func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[325] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23995,53 +27627,54 @@ func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListPvcStorageRecommendationsResponse.ProtoReflect.Descriptor instead. -func (*ListPvcStorageRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{304} +// Deprecated: Use OCIBootConfig.ProtoReflect.Descriptor instead. +func (*OCIBootConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} } -func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { +func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { if x != nil { - return x.Recommendations + return x.BootVolumeSizeInGbs } - return nil + return 0 } -func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { +func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { if x != nil { - return x.Pagination + return x.BootVolumeVpusPerGb } - return nil + return 0 } -type GeneratePvcStorageRecommendationRequest struct { +type OCILaunchOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + BootVolumeType *string `protobuf:"bytes,1,opt,name=boot_volume_type,json=bootVolumeType,proto3,oneof" json:"boot_volume_type,omitempty"` + Firmware *string `protobuf:"bytes,2,opt,name=firmware,proto3,oneof" json:"firmware,omitempty"` + NetworkType *string `protobuf:"bytes,3,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"` + RemoteDataVolumeType *string `protobuf:"bytes,4,opt,name=remote_data_volume_type,json=remoteDataVolumeType,proto3,oneof" json:"remote_data_volume_type,omitempty"` + IsConsistentVolumeNamingEnabled *bool `protobuf:"varint,5,opt,name=is_consistent_volume_naming_enabled,json=isConsistentVolumeNamingEnabled,proto3,oneof" json:"is_consistent_volume_naming_enabled,omitempty"` } -func (x *GeneratePvcStorageRecommendationRequest) Reset() { - *x = GeneratePvcStorageRecommendationRequest{} +func (x *OCILaunchOptions) Reset() { + *x = OCILaunchOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[305] + mi := &file_api_v1_recommendation_proto_msgTypes[326] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationRequest) String() string { +func (x *OCILaunchOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCILaunchOptions) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[305] +func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[326] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24052,67 +27685,72 @@ func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GeneratePvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*GeneratePvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{305} +// Deprecated: Use OCILaunchOptions.ProtoReflect.Descriptor instead. +func (*OCILaunchOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{326} } -func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *OCILaunchOptions) GetBootVolumeType() string { + if x != nil && x.BootVolumeType != nil { + return *x.BootVolumeType } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *OCILaunchOptions) GetFirmware() string { + if x != nil && x.Firmware != nil { + return *x.Firmware } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { - if x != nil { - return x.PvcUid +func (x *OCILaunchOptions) GetNetworkType() string { + if x != nil && x.NetworkType != nil { + return *x.NetworkType } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { + if x != nil && x.RemoteDataVolumeType != nil { + return *x.RemoteDataVolumeType } return "" } -type GeneratePvcStorageRecommendationResponse struct { +func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { + if x != nil && x.IsConsistentVolumeNamingEnabled != nil { + return *x.IsConsistentVolumeNamingEnabled + } + return false +} + +type OCIVolumeAttributes struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` - // When no recommendation is generated (e.g., low confidence, no resize needed), - // this field explains why - SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` + SizeInGbs int64 `protobuf:"varint,1,opt,name=size_in_gbs,json=sizeInGbs,proto3" json:"size_in_gbs,omitempty"` + VpusPerGb int64 `protobuf:"varint,2,opt,name=vpus_per_gb,json=vpusPerGb,proto3" json:"vpus_per_gb,omitempty"` } -func (x *GeneratePvcStorageRecommendationResponse) Reset() { - *x = GeneratePvcStorageRecommendationResponse{} +func (x *OCIVolumeAttributes) Reset() { + *x = OCIVolumeAttributes{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[306] + mi := &file_api_v1_recommendation_proto_msgTypes[327] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationResponse) String() string { +func (x *OCIVolumeAttributes) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} +func (*OCIVolumeAttributes) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[306] +func (x *OCIVolumeAttributes) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[327] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24123,53 +27761,63 @@ func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use GeneratePvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*GeneratePvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{306} +// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. +func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{327} } -func (x *GeneratePvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { if x != nil { - return x.Recommendation + return x.SizeInGbs } - return nil + return 0 } -func (x *GeneratePvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { + if x != nil { + return x.VpusPerGb } - return "" + return 0 } -type PreviewPvcStorageRecommendationRequest struct { +type OCINodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + VcnId string `protobuf:"bytes,1,opt,name=vcn_id,json=vcnId,proto3" json:"vcn_id,omitempty"` + ImageSelector []*OCIImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector,json=imageSelector,proto3" json:"image_selector,omitempty"` + SubnetSelector []*OCISubnetSelectorTerm `protobuf:"bytes,3,rep,name=subnet_selector,json=subnetSelector,proto3" json:"subnet_selector,omitempty"` + SecurityGroupSelector []*OCISecurityGroupSelectorTerm `protobuf:"bytes,4,rep,name=security_group_selector,json=securityGroupSelector,proto3" json:"security_group_selector,omitempty"` + UserData *string `protobuf:"bytes,5,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` + PreInstallScript *string `protobuf:"bytes,6,opt,name=pre_install_script,json=preInstallScript,proto3,oneof" json:"pre_install_script,omitempty"` + MetaData map[string]string `protobuf:"bytes,7,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ImageFamily string `protobuf:"bytes,8,opt,name=image_family,json=imageFamily,proto3" json:"image_family,omitempty"` + Tags map[string]string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + FreeFormTags map[string]string `protobuf:"bytes,10,rep,name=free_form_tags,json=freeFormTags,proto3" json:"free_form_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + BootConfig *OCIBootConfig `protobuf:"bytes,11,opt,name=boot_config,json=bootConfig,proto3" json:"boot_config,omitempty"` + LaunchOptions *OCILaunchOptions `protobuf:"bytes,12,opt,name=launch_options,json=launchOptions,proto3" json:"launch_options,omitempty"` + BlockDevices []*OCIVolumeAttributes `protobuf:"bytes,13,rep,name=block_devices,json=blockDevices,proto3" json:"block_devices,omitempty"` + AgentList []string `protobuf:"bytes,14,rep,name=agent_list,json=agentList,proto3" json:"agent_list,omitempty"` } -func (x *PreviewPvcStorageRecommendationRequest) Reset() { - *x = PreviewPvcStorageRecommendationRequest{} +func (x *OCINodeClassSpec) Reset() { + *x = OCINodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[307] + mi := &file_api_v1_recommendation_proto_msgTypes[328] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewPvcStorageRecommendationRequest) String() string { +func (x *OCINodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCINodeClassSpec) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[307] +func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[328] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24180,65 +27828,136 @@ func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use PreviewPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*PreviewPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{307} +// Deprecated: Use OCINodeClassSpec.ProtoReflect.Descriptor instead. +func (*OCINodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{328} } -func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { +func (x *OCINodeClassSpec) GetVcnId() string { if x != nil { - return x.TeamId + return x.VcnId } return "" } -func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { +func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { if x != nil { - return x.ClusterId + return x.ImageSelector } - return "" + return nil } -func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { +func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { if x != nil { - return x.PvcUid + return x.SubnetSelector + } + return nil +} + +func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { + if x != nil { + return x.SecurityGroupSelector + } + return nil +} + +func (x *OCINodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData } return "" } -func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { +func (x *OCINodeClassSpec) GetPreInstallScript() string { + if x != nil && x.PreInstallScript != nil { + return *x.PreInstallScript + } + return "" +} + +func (x *OCINodeClassSpec) GetMetaData() map[string]string { if x != nil { - return x.PolicyId + return x.MetaData + } + return nil +} + +func (x *OCINodeClassSpec) GetImageFamily() string { + if x != nil { + return x.ImageFamily } return "" } -type PreviewPvcStorageRecommendationResponse struct { +func (x *OCINodeClassSpec) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *OCINodeClassSpec) GetFreeFormTags() map[string]string { + if x != nil { + return x.FreeFormTags + } + return nil +} + +func (x *OCINodeClassSpec) GetBootConfig() *OCIBootConfig { + if x != nil { + return x.BootConfig + } + return nil +} + +func (x *OCINodeClassSpec) GetLaunchOptions() *OCILaunchOptions { + if x != nil { + return x.LaunchOptions + } + return nil +} + +func (x *OCINodeClassSpec) GetBlockDevices() []*OCIVolumeAttributes { + if x != nil { + return x.BlockDevices + } + return nil +} + +func (x *OCINodeClassSpec) GetAgentList() []string { + if x != nil { + return x.AgentList + } + return nil +} + +type KarpenterSettingsRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` - SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` + // contents is the full KarpenterSettings YAML (devzero.karpenter.sh/v1alpha1, name "default"). + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` + RecommendationId string `protobuf:"bytes,2,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` } -func (x *PreviewPvcStorageRecommendationResponse) Reset() { - *x = PreviewPvcStorageRecommendationResponse{} +func (x *KarpenterSettingsRecommendation) Reset() { + *x = KarpenterSettingsRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[308] + mi := &file_api_v1_recommendation_proto_msgTypes[329] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewPvcStorageRecommendationResponse) String() string { +func (x *KarpenterSettingsRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} +func (*KarpenterSettingsRecommendation) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[308] +func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[329] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24249,64 +27968,51 @@ func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use PreviewPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*PreviewPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{308} +// Deprecated: Use KarpenterSettingsRecommendation.ProtoReflect.Descriptor instead. +func (*KarpenterSettingsRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{329} } -func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *KarpenterSettingsRecommendation) GetContents() []byte { if x != nil { - return x.Recommendation + return x.Contents } return nil } -func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { + if x != nil { + return x.RecommendationId } return "" } -type WorkloadRuleOOMEvent struct { +type RawKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` - MemoryRequestAt int64 `protobuf:"varint,9,opt,name=memory_request_at,json=memoryRequestAt,proto3" json:"memory_request_at,omitempty"` - MemoryLimitAt int64 `protobuf:"varint,10,opt,name=memory_limit_at,json=memoryLimitAt,proto3" json:"memory_limit_at,omitempty"` - MemoryUsageAt int64 `protobuf:"varint,11,opt,name=memory_usage_at,json=memoryUsageAt,proto3" json:"memory_usage_at,omitempty"` - EmergencyReaction bool `protobuf:"varint,12,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` - NewMemoryAfter *int64 `protobuf:"varint,13,opt,name=new_memory_after,json=newMemoryAfter,proto3,oneof" json:"new_memory_after,omitempty"` - RestartCount *int32 `protobuf:"varint,14,opt,name=restart_count,json=restartCount,proto3,oneof" json:"restart_count,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + NodepoolYaml string `protobuf:"bytes,1,opt,name=nodepool_yaml,json=nodepoolYaml,proto3" json:"nodepool_yaml,omitempty"` + NodeclassYaml string `protobuf:"bytes,2,opt,name=nodeclass_yaml,json=nodeclassYaml,proto3" json:"nodeclass_yaml,omitempty"` } -func (x *WorkloadRuleOOMEvent) Reset() { - *x = WorkloadRuleOOMEvent{} +func (x *RawKarpenterSpec) Reset() { + *x = RawKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[309] + mi := &file_api_v1_recommendation_proto_msgTypes[330] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleOOMEvent) String() string { +func (x *RawKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleOOMEvent) ProtoMessage() {} +func (*RawKarpenterSpec) ProtoMessage() {} -func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[309] +func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[330] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24317,144 +28023,125 @@ func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadRuleOOMEvent.ProtoReflect.Descriptor instead. -func (*WorkloadRuleOOMEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{309} -} - -func (x *WorkloadRuleOOMEvent) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use RawKarpenterSpec.ProtoReflect.Descriptor instead. +func (*RawKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{330} } -func (x *WorkloadRuleOOMEvent) GetRuleId() string { +func (x *RawKarpenterSpec) GetNodepoolYaml() string { if x != nil { - return x.RuleId + return x.NodepoolYaml } return "" } -func (x *WorkloadRuleOOMEvent) GetClusterId() string { +func (x *RawKarpenterSpec) GetNodeclassYaml() string { if x != nil { - return x.ClusterId + return x.NodeclassYaml } return "" } -func (x *WorkloadRuleOOMEvent) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} +// SnapshotRecommendation delivers one rendered resilience-family config +// (spec §7): the multi-doc criu.org/v1 apply bundle compiled by the render +// worker — anchor ConfigMap first, then CheckpointSchedule / +// CheckpointRestoreOperator CRs sorted by name. tunr applies it verbatim +// under the dz-snapshot-crds prune stream; the config ID is echoed back in +// the apply ACK. +type SnapshotRecommendation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadRuleOOMEvent) GetWorkloadName() string { - if x != nil { - return x.WorkloadName - } - return "" + CompiledResourcesYaml []byte `protobuf:"bytes,1,opt,name=compiled_resources_yaml,json=compiledResourcesYaml,proto3" json:"compiled_resources_yaml,omitempty"` + SnapshotCfgId string `protobuf:"bytes,2,opt,name=snapshot_cfg_id,json=snapshotCfgId,proto3" json:"snapshot_cfg_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` } -func (x *WorkloadRuleOOMEvent) GetContainerName() string { - if x != nil { - return x.ContainerName +func (x *SnapshotRecommendation) Reset() { + *x = SnapshotRecommendation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[331] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil +func (x *SnapshotRecommendation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { - if x != nil { - return x.RuleGeneration - } - return 0 -} +func (*SnapshotRecommendation) ProtoMessage() {} -func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { - if x != nil { - return x.MemoryRequestAt +func (x *SnapshotRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[331] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { - if x != nil { - return x.MemoryLimitAt - } - return 0 +// Deprecated: Use SnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*SnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} } -func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { +func (x *SnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.MemoryUsageAt + return x.CompiledResourcesYaml } - return 0 + return nil } -func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { +func (x *SnapshotRecommendation) GetSnapshotCfgId() string { if x != nil { - return x.EmergencyReaction - } - return false -} - -func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { - if x != nil && x.NewMemoryAfter != nil { - return *x.NewMemoryAfter - } - return 0 -} - -func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { - if x != nil && x.RestartCount != nil { - return *x.RestartCount + return x.SnapshotCfgId } - return 0 + return "" } -func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *SnapshotRecommendation) GetContentHash() string { if x != nil { - return x.CreatedAt + return x.ContentHash } - return nil + return "" } -type ListWorkloadRuleOOMEventsRequest struct { +// ForensicSnapshotRecommendation is the forensic-family twin +// (ForensicSnapshotChain CRs, dz-forensic-crds prune stream). Kept separate +// from SnapshotRecommendation so neither family's apply can ever prune the +// other's resources (spec §7). +type ForensicSnapshotRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` - Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + CompiledResourcesYaml []byte `protobuf:"bytes,1,opt,name=compiled_resources_yaml,json=compiledResourcesYaml,proto3" json:"compiled_resources_yaml,omitempty"` + ForensicCfgId string `protobuf:"bytes,2,opt,name=forensic_cfg_id,json=forensicCfgId,proto3" json:"forensic_cfg_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` } -func (x *ListWorkloadRuleOOMEventsRequest) Reset() { - *x = ListWorkloadRuleOOMEventsRequest{} +func (x *ForensicSnapshotRecommendation) Reset() { + *x = ForensicSnapshotRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[310] + mi := &file_api_v1_recommendation_proto_msgTypes[332] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsRequest) String() string { +func (x *ForensicSnapshotRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} +func (*ForensicSnapshotRecommendation) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[310] +func (x *ForensicSnapshotRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[332] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24465,65 +28152,59 @@ func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleOOMEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleOOMEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{310} +// Deprecated: Use ForensicSnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{332} } -func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { +func (x *ForensicSnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.RuleId - } - return "" -} - -func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { - if x != nil && x.Generation != nil { - return *x.Generation + return x.CompiledResourcesYaml } - return 0 + return nil } -func (x *ListWorkloadRuleOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit +func (x *ForensicSnapshotRecommendation) GetForensicCfgId() string { + if x != nil { + return x.ForensicCfgId } - return 0 + return "" } -func (x *ListWorkloadRuleOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset +func (x *ForensicSnapshotRecommendation) GetContentHash() string { + if x != nil { + return x.ContentHash } - return 0 + return "" } -type ListWorkloadRuleOOMEventsResponse struct { +// SnapshotCRStatusReport carries the current statuses of every dakr-managed +// criu.org CR on the cluster (tunr-side reporter, spec §8). +type SnapshotCRStatusReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Resources []*SnapshotCRStatus `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *ListWorkloadRuleOOMEventsResponse) Reset() { - *x = ListWorkloadRuleOOMEventsResponse{} +func (x *SnapshotCRStatusReport) Reset() { + *x = SnapshotCRStatusReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[311] + mi := &file_api_v1_recommendation_proto_msgTypes[333] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsResponse) String() string { +func (x *SnapshotCRStatusReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} +func (*SnapshotCRStatusReport) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[311] +func (x *SnapshotCRStatusReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[333] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24534,54 +28215,51 @@ func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleOOMEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleOOMEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{311} +// Deprecated: Use SnapshotCRStatusReport.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatusReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} } -func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *SnapshotCRStatusReport) GetResources() []*SnapshotCRStatus { if x != nil { - return x.Events + return x.Resources } return nil } -func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { - if x != nil { - return x.Total - } - return 0 -} - -type ListWorkloadOOMEventsRequest struct { +// SnapshotCRStatus is one CR's identity + raw status subtree. Annotations +// carry the dakr.devzero.io policy/target ID keys the compiler stamped; +// status_json is the CR's .status marshaled verbatim (dakr parses). +type SnapshotCRStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + Annotations map[string]string `protobuf:"bytes,5,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StatusJson []byte `protobuf:"bytes,6,opt,name=status_json,json=statusJson,proto3" json:"status_json,omitempty"` } -func (x *ListWorkloadOOMEventsRequest) Reset() { - *x = ListWorkloadOOMEventsRequest{} +func (x *SnapshotCRStatus) Reset() { + *x = SnapshotCRStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[312] + mi := &file_api_v1_recommendation_proto_msgTypes[334] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOOMEventsRequest) String() string { +func (x *SnapshotCRStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} +func (*SnapshotCRStatus) ProtoMessage() {} -func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[312] +func (x *SnapshotCRStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[334] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24592,140 +28270,99 @@ func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOOMEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadOOMEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{312} +// Deprecated: Use SnapshotCRStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} } -func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { +func (x *SnapshotCRStatus) GetKind() string { if x != nil { - return x.ClusterId + return x.Kind } return "" } -func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { +func (x *SnapshotCRStatus) GetName() string { if x != nil { - return x.Namespace + return x.Name } return "" } -func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { +func (x *SnapshotCRStatus) GetNamespace() string { if x != nil { - return x.WorkloadName + return x.Namespace } return "" } -func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit - } - return 0 -} - -func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset - } - return 0 -} - -type ListWorkloadOOMEventsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` -} - -func (x *ListWorkloadOOMEventsResponse) Reset() { - *x = ListWorkloadOOMEventsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[313] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListWorkloadOOMEventsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} - -func (x *ListWorkloadOOMEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[313] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SnapshotCRStatus) GetUid() string { + if x != nil { + return x.Uid } - return mi.MessageOf(x) -} - -// Deprecated: Use ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} + return "" } -func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *SnapshotCRStatus) GetAnnotations() map[string]string { if x != nil { - return x.Events + return x.Annotations } return nil } -func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { +func (x *SnapshotCRStatus) GetStatusJson() []byte { if x != nil { - return x.Total + return x.StatusJson } - return 0 + return nil } -type WorkloadRuleCPUThrottleEvent struct { +// SnapshotCRRuntimeStatus is one CR's ingested runtime state, projected for +// reads. One shape serves both families; family-irrelevant fields are unset. +type SnapshotCRRuntimeStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` - CpuRequestAt int64 `protobuf:"varint,9,opt,name=cpu_request_at,json=cpuRequestAt,proto3" json:"cpu_request_at,omitempty"` - CpuLimitAt int64 `protobuf:"varint,10,opt,name=cpu_limit_at,json=cpuLimitAt,proto3" json:"cpu_limit_at,omitempty"` - CpuUsageAt int64 `protobuf:"varint,11,opt,name=cpu_usage_at,json=cpuUsageAt,proto3" json:"cpu_usage_at,omitempty"` - ThrottledFraction float64 `protobuf:"fixed64,12,opt,name=throttled_fraction,json=throttledFraction,proto3" json:"throttled_fraction,omitempty"` - EmergencyReaction bool `protobuf:"varint,13,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` - NewCpuAfter *int64 `protobuf:"varint,14,opt,name=new_cpu_after,json=newCpuAfter,proto3,oneof" json:"new_cpu_after,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` -} - -func (x *WorkloadRuleCPUThrottleEvent) Reset() { - *x = WorkloadRuleCPUThrottleEvent{} + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + // ForensicSnapshotChain only: Pending/Running/Completed/Failed. + Phase string `protobuf:"bytes,11,opt,name=phase,proto3" json:"phase,omitempty"` + SnapshotCount int32 `protobuf:"varint,12,opt,name=snapshot_count,json=snapshotCount,proto3" json:"snapshot_count,omitempty"` + AttemptCount int32 `protobuf:"varint,13,opt,name=attempt_count,json=attemptCount,proto3" json:"attempt_count,omitempty"` + FailureCount int32 `protobuf:"varint,14,opt,name=failure_count,json=failureCount,proto3" json:"failure_count,omitempty"` + // CheckpointSchedule only. INTERVAL-TRIGGER-ONLY counter: checkpoints + // fired by annotation/threshold/event triggers never bump it — label + // this "interval activity", or trigger-only schedules read as dead. + CheckpointsCreated int32 `protobuf:"varint,21,opt,name=checkpoints_created,json=checkpointsCreated,proto3" json:"checkpoints_created,omitempty"` + ErrorMessage string `protobuf:"bytes,31,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + // lastCheckpointTime (schedules) / lastSnapshotTime (chains). + LastActivityTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=last_activity_time,json=lastActivityTime,proto3" json:"last_activity_time,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + CompletionTime *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=completion_time,json=completionTime,proto3" json:"completion_time,omitempty"` + // When dakr last ingested this CR's status. + ObservedAt *timestamppb.Timestamp `protobuf:"bytes,44,opt,name=observed_at,json=observedAt,proto3" json:"observed_at,omitempty"` +} + +func (x *SnapshotCRRuntimeStatus) Reset() { + *x = SnapshotCRRuntimeStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[314] + mi := &file_api_v1_recommendation_proto_msgTypes[335] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleCPUThrottleEvent) String() string { +func (x *SnapshotCRRuntimeStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} +func (*SnapshotCRRuntimeStatus) ProtoMessage() {} -func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[314] +func (x *SnapshotCRRuntimeStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[335] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24736,144 +28373,136 @@ func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadRuleCPUThrottleEvent.ProtoReflect.Descriptor instead. -func (*WorkloadRuleCPUThrottleEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{314} +// Deprecated: Use SnapshotCRRuntimeStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRRuntimeStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{335} } -func (x *WorkloadRuleCPUThrottleEvent) GetId() string { +func (x *SnapshotCRRuntimeStatus) GetClusterId() string { if x != nil { - return x.Id + return x.ClusterId } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleId() string { +func (x *SnapshotCRRuntimeStatus) GetKind() string { if x != nil { - return x.RuleId + return x.Kind } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetClusterId() string { +func (x *SnapshotCRRuntimeStatus) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { +func (x *SnapshotCRRuntimeStatus) GetNamespace() string { if x != nil { return x.Namespace } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetWorkloadName() string { - if x != nil { - return x.WorkloadName - } - return "" -} - -func (x *WorkloadRuleCPUThrottleEvent) GetContainerName() string { +func (x *SnapshotCRRuntimeStatus) GetPhase() string { if x != nil { - return x.ContainerName + return x.Phase } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetTimestamp() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetSnapshotCount() int32 { if x != nil { - return x.Timestamp + return x.SnapshotCount } - return nil + return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { +func (x *SnapshotCRRuntimeStatus) GetAttemptCount() int32 { if x != nil { - return x.RuleGeneration + return x.AttemptCount } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuRequestAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetFailureCount() int32 { if x != nil { - return x.CpuRequestAt + return x.FailureCount } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuLimitAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetCheckpointsCreated() int32 { if x != nil { - return x.CpuLimitAt + return x.CheckpointsCreated } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuUsageAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetErrorMessage() string { if x != nil { - return x.CpuUsageAt + return x.ErrorMessage } - return 0 + return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetThrottledFraction() float64 { +func (x *SnapshotCRRuntimeStatus) GetLastActivityTime() *timestamppb.Timestamp { if x != nil { - return x.ThrottledFraction + return x.LastActivityTime } - return 0 + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetEmergencyReaction() bool { +func (x *SnapshotCRRuntimeStatus) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.EmergencyReaction + return x.StartTime } - return false + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetNewCpuAfter() int64 { - if x != nil && x.NewCpuAfter != nil { - return *x.NewCpuAfter +func (x *SnapshotCRRuntimeStatus) GetCompletionTime() *timestamppb.Timestamp { + if x != nil { + return x.CompletionTime } - return 0 + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetObservedAt() *timestamppb.Timestamp { if x != nil { - return x.CreatedAt + return x.ObservedAt } return nil } -type ListWorkloadRuleCPUThrottleEventsRequest struct { +// SnapshotPolicyTargetStatus aggregates a target's ingested CR statuses +// (capped; ordered namespace, name). +type SnapshotPolicyTargetStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` - Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Resources []*SnapshotCRRuntimeStatus `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsRequest{} +func (x *SnapshotPolicyTargetStatus) Reset() { + *x = SnapshotPolicyTargetStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[315] + mi := &file_api_v1_recommendation_proto_msgTypes[336] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { +func (x *SnapshotPolicyTargetStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} +func (*SnapshotPolicyTargetStatus) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[315] +func (x *SnapshotPolicyTargetStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[336] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24884,65 +28513,51 @@ func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{315} +// Deprecated: Use SnapshotPolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*SnapshotPolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{336} } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { +func (x *SnapshotPolicyTargetStatus) GetResources() []*SnapshotCRRuntimeStatus { if x != nil { - return x.RuleId - } - return "" -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetGeneration() int64 { - if x != nil && x.Generation != nil { - return *x.Generation - } - return 0 -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit - } - return 0 -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset + return x.Resources } - return 0 + return nil } -type ListWorkloadRuleCPUThrottleEventsResponse struct { +// SnapshotPrereqs surfaces cluster prerequisites derivable from already- +// ingested state (spec §7). CRIU-on-nodes and container-runtime checkpoint +// support need node-level probing no collector performs yet — deferred; a +// cluster can pass these checks and still fail applies for those reasons +// (surfaced through apply events). +type SnapshotPrereqs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + KubernetesVersion string `protobuf:"bytes,1,opt,name=kubernetes_version,json=kubernetesVersion,proto3" json:"kubernetes_version,omitempty"` + // Kubernetes >= 1.30 (ContainerCheckpoint enabled by default). + KubernetesVersionSupported bool `protobuf:"varint,2,opt,name=kubernetes_version_supported,json=kubernetesVersionSupported,proto3" json:"kubernetes_version_supported,omitempty"` + MetricsServerPresent bool `protobuf:"varint,3,opt,name=metrics_server_present,json=metricsServerPresent,proto3" json:"metrics_server_present,omitempty"` } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsResponse{} +func (x *SnapshotPrereqs) Reset() { + *x = SnapshotPrereqs{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[316] + mi := &file_api_v1_recommendation_proto_msgTypes[337] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) String() string { +func (x *SnapshotPrereqs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsResponse) ProtoMessage() {} +func (*SnapshotPrereqs) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[316] +func (x *SnapshotPrereqs) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[337] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24953,54 +28568,61 @@ func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{316} +// Deprecated: Use SnapshotPrereqs.ProtoReflect.Descriptor instead. +func (*SnapshotPrereqs) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{337} } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *SnapshotPrereqs) GetKubernetesVersion() string { if x != nil { - return x.Events + return x.KubernetesVersion } - return nil + return "" } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { +func (x *SnapshotPrereqs) GetKubernetesVersionSupported() bool { if x != nil { - return x.Total + return x.KubernetesVersionSupported } - return 0 + return false } -type ListWorkloadCPUThrottleEventsRequest struct { +func (x *SnapshotPrereqs) GetMetricsServerPresent() bool { + if x != nil { + return x.MetricsServerPresent + } + return false +} + +type NodeRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Aws *AWSKarpenterSpec `protobuf:"bytes,1,opt,name=aws,proto3" json:"aws,omitempty"` + Aks *AKSKarpenterSpec `protobuf:"bytes,2,opt,name=aks,proto3" json:"aks,omitempty"` + Gcp *GCPKarpenterSpec `protobuf:"bytes,3,opt,name=gcp,proto3" json:"gcp,omitempty"` + Oci *OCIKarpenterSpec `protobuf:"bytes,4,opt,name=oci,proto3" json:"oci,omitempty"` + NodeRecCfgId string `protobuf:"bytes,41,opt,name=node_rec_cfg_id,json=nodeRecCfgId,proto3" json:"node_rec_cfg_id,omitempty"` } -func (x *ListWorkloadCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadCPUThrottleEventsRequest{} +func (x *NodeRecommendation) Reset() { + *x = NodeRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[317] + mi := &file_api_v1_recommendation_proto_msgTypes[338] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsRequest) String() string { +func (x *NodeRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} +func (*NodeRecommendation) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[317] +func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[338] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25011,72 +28633,72 @@ func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{317} +// Deprecated: Use NodeRecommendation.ProtoReflect.Descriptor instead. +func (*NodeRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{338} } -func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { +func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { if x != nil { - return x.ClusterId + return x.Aws } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { +func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { if x != nil { - return x.Namespace + return x.Aks } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetWorkloadName() string { +func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { if x != nil { - return x.WorkloadName + return x.Gcp } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit +func (x *NodeRecommendation) GetOci() *OCIKarpenterSpec { + if x != nil { + return x.Oci } - return 0 + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset +func (x *NodeRecommendation) GetNodeRecCfgId() string { + if x != nil { + return x.NodeRecCfgId } - return 0 + return "" } -type ListWorkloadCPUThrottleEventsResponse struct { +type AWSKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + Ec2Nc []*EC2NodeClass `protobuf:"bytes,6,rep,name=ec2nc,proto3" json:"ec2nc,omitempty"` } -func (x *ListWorkloadCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadCPUThrottleEventsResponse{} +func (x *AWSKarpenterSpec) Reset() { + *x = AWSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[318] + mi := &file_api_v1_recommendation_proto_msgTypes[339] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsResponse) String() string { +func (x *AWSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsResponse) ProtoMessage() {} +func (*AWSKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[318] +func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[339] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25087,72 +28709,51 @@ func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{318} +// Deprecated: Use AWSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AWSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{339} } -func (x *ListWorkloadCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *AWSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.Events + return x.Np } return nil } -func (x *ListWorkloadCPUThrottleEventsResponse) GetTotal() int64 { +func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { if x != nil { - return x.Total + return x.Ec2Nc } - return 0 + return nil } -type WorkloadOptimizationPolicyProto struct { +type AKSKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,7,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,10,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,11,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,12,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,13,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,14,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,15,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,16,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,17,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,18,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - // HPA: when true, WorkloadRules generated from this policy have HPA - // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. - HpaEnabled bool `protobuf:"varint,19,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + Aksnc []*AKSNodeClass `protobuf:"bytes,6,rep,name=aksnc,proto3" json:"aksnc,omitempty"` } -func (x *WorkloadOptimizationPolicyProto) Reset() { - *x = WorkloadOptimizationPolicyProto{} +func (x *AKSKarpenterSpec) Reset() { + *x = AKSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[319] + mi := &file_api_v1_recommendation_proto_msgTypes[340] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadOptimizationPolicyProto) String() string { +func (x *AKSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} +func (*AKSKarpenterSpec) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[319] +func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[340] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25163,185 +28764,144 @@ func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadOptimizationPolicyProto.ProtoReflect.Descriptor instead. -func (*WorkloadOptimizationPolicyProto) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{319} -} - -func (x *WorkloadOptimizationPolicyProto) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use AKSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AKSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{340} } -func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { +func (x *AKSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.TeamId + return x.Np } - return "" + return nil } -func (x *WorkloadOptimizationPolicyProto) GetName() string { +func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { if x != nil { - return x.Name + return x.Aksnc } - return "" + return nil } -func (x *WorkloadOptimizationPolicyProto) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description - } - return "" -} +type NodePool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadOptimizationPolicyProto) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into sigs.k8s.io/karpenter/pkg/apis/v1.NodePool } -func (x *WorkloadOptimizationPolicyProto) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *NodePool) Reset() { + *x = NodePool{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[341] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *WorkloadOptimizationPolicyProto) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector - } - return nil +func (x *NodePool) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} +func (*NodePool) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt +func (x *NodePool) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[341] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetClusterNames() map[string]string { - if x != nil { - return x.ClusterNames - } - return nil +// Deprecated: Use NodePool.ProtoReflect.Descriptor instead. +func (*NodePool) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{341} } -func (x *WorkloadOptimizationPolicyProto) GetActionTriggers() []ActionTrigger { +func (x *NodePool) GetContents() []byte { if x != nil { - return x.ActionTriggers + return x.Contents } return nil } -func (x *WorkloadOptimizationPolicyProto) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" -} +type EC2NodeClass struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadOptimizationPolicyProto) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes - } - return 0 + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/aws/karpenter-provider-aws/pkg/apis/v1.EC2NodeClass } -func (x *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +func (x *EC2NodeClass) Reset() { + *x = EC2NodeClass{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[342] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *WorkloadOptimizationPolicyProto) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins - } - return nil +func (x *EC2NodeClass) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule - } - return "" -} +func (*EC2NodeClass) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled +func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[342] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling - } - return false +// Deprecated: Use EC2NodeClass.ProtoReflect.Descriptor instead. +func (*EC2NodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{342} } -func (x *WorkloadOptimizationPolicyProto) GetHpaEnabled() bool { +func (x *EC2NodeClass) GetContents() []byte { if x != nil { - return x.HpaEnabled + return x.Contents } - return false + return nil } -type CreateWorkloadOptimizationPolicyRequest struct { +type AKSNodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,6,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,7,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - HpaEnabled bool `protobuf:"varint,15,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/Azure/karpenter-provider-azure/pkg/apis/v1beta1.AKSNodeClass } -func (x *CreateWorkloadOptimizationPolicyRequest) Reset() { - *x = CreateWorkloadOptimizationPolicyRequest{} +func (x *AKSNodeClass) Reset() { + *x = AKSNodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[320] + mi := &file_api_v1_recommendation_proto_msgTypes[343] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyRequest) String() string { +func (x *AKSNodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*AKSNodeClass) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[320] +func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[343] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25352,141 +28912,98 @@ func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use CreateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*CreateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{320} -} - -func (x *CreateWorkloadOptimizationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use AKSNodeClass.ProtoReflect.Descriptor instead. +func (*AKSNodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} } -func (x *CreateWorkloadOptimizationPolicyRequest) GetName() string { +func (x *AKSNodeClass) GetContents() []byte { if x != nil { - return x.Name + return x.Contents } - return "" + return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description - } - return "" -} +type GCPKarpenterSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *CreateWorkloadOptimizationPolicyRequest) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + NodeClasses []*GCENodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` } -func (x *CreateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *GCPKarpenterSpec) Reset() { + *x = GCPKarpenterSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[344] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector - } - return nil +func (x *GCPKarpenterSpec) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers - } - return nil -} +func (*GCPKarpenterSpec) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[344] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *CreateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes - } - return 0 +// Deprecated: Use GCPKarpenterSpec.ProtoReflect.Descriptor instead. +func (*GCPKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { +func (x *GCPKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.DetectionTriggers + return x.Np } return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { +func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { if x != nil { - return x.SchedulerPlugins + return x.NodeClasses } return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule - } - return "" -} - -func (x *CreateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled - } - return false -} - -func (x *CreateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling - } - return false -} - -func (x *CreateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { - if x != nil { - return x.HpaEnabled - } - return false -} - -type CreateWorkloadOptimizationPolicyResponse struct { +type GCENodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/cloudpilot-ai/karpenter-provider-gcp/pkg/apis/v1alpha1.GCENodeClass } -func (x *CreateWorkloadOptimizationPolicyResponse) Reset() { - *x = CreateWorkloadOptimizationPolicyResponse{} +func (x *GCENodeClass) Reset() { + *x = GCENodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[321] + mi := &file_api_v1_recommendation_proto_msgTypes[345] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyResponse) String() string { +func (x *GCENodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*GCENodeClass) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[321] +func (x *GCENodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[345] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25497,43 +29014,44 @@ func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use CreateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*CreateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{321} +// Deprecated: Use GCENodeClass.ProtoReflect.Descriptor instead. +func (*GCENodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} } -func (x *CreateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *GCENodeClass) GetContents() []byte { if x != nil { - return x.Policy + return x.Contents } return nil } -type ListWorkloadOptimizationPoliciesRequest struct { +type OCIKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + NodeClasses []*OCINodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` } -func (x *ListWorkloadOptimizationPoliciesRequest) Reset() { - *x = ListWorkloadOptimizationPoliciesRequest{} +func (x *OCIKarpenterSpec) Reset() { + *x = OCIKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[322] + mi := &file_api_v1_recommendation_proto_msgTypes[346] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesRequest) String() string { +func (x *OCIKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesRequest) ProtoMessage() {} +func (*OCIKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[322] +func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[346] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25544,43 +29062,50 @@ func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOptimizationPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadOptimizationPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{322} +// Deprecated: Use OCIKarpenterSpec.ProtoReflect.Descriptor instead. +func (*OCIKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{346} } -func (x *ListWorkloadOptimizationPoliciesRequest) GetTeamId() string { +func (x *OCIKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.TeamId + return x.Np } - return "" + return nil } -type ListWorkloadOptimizationPoliciesResponse struct { +func (x *OCIKarpenterSpec) GetNodeClasses() []*OCINodeClass { + if x != nil { + return x.NodeClasses + } + return nil +} + +type OCINodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*WorkloadOptimizationPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/zoom/karpenter-oci/pkg/apis/v1alpha1.OciNodeClass } -func (x *ListWorkloadOptimizationPoliciesResponse) Reset() { - *x = ListWorkloadOptimizationPoliciesResponse{} +func (x *OCINodeClass) Reset() { + *x = OCINodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[323] + mi := &file_api_v1_recommendation_proto_msgTypes[347] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesResponse) String() string { +func (x *OCINodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesResponse) ProtoMessage() {} +func (*OCINodeClass) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[323] +func (x *OCINodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[347] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25591,44 +29116,65 @@ func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOptimizationPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadOptimizationPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{323} +// Deprecated: Use OCINodeClass.ProtoReflect.Descriptor instead. +func (*OCINodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{347} } -func (x *ListWorkloadOptimizationPoliciesResponse) GetPolicies() []*WorkloadOptimizationPolicyProto { +func (x *OCINodeClass) GetContents() []byte { if x != nil { - return x.Policies + return x.Contents } return nil } -type GetWorkloadOptimizationPolicyRequest struct { +// StorageRecommendationPolicy represents a policy for PVC/storage optimization +type StorageRecommendationPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + ActionTrigger ActionTrigger `protobuf:"varint,5,opt,name=action_trigger,json=actionTrigger,proto3,enum=api.v1.ActionTrigger" json:"action_trigger,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,7,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,8,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Storage-specific parameters + TargetUtilizationPercent *float32 `protobuf:"fixed32,10,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,11,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,12,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,13,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + // New storage policy fields + CriticalDaysToFull *int32 `protobuf:"varint,14,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,15,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,16,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,17,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,18,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + IsDefaultPolicy bool `protobuf:"varint,50,opt,name=is_default_policy,json=isDefaultPolicy,proto3" json:"is_default_policy,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *GetWorkloadOptimizationPolicyRequest) Reset() { - *x = GetWorkloadOptimizationPolicyRequest{} +func (x *StorageRecommendationPolicy) Reset() { + *x = StorageRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[324] + mi := &file_api_v1_recommendation_proto_msgTypes[348] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadOptimizationPolicyRequest) String() string { +func (x *StorageRecommendationPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*StorageRecommendationPolicy) ProtoMessage() {} -func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[324] +func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[348] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25639,114 +29185,190 @@ func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{324} +// Deprecated: Use StorageRecommendationPolicy.ProtoReflect.Descriptor instead. +func (*StorageRecommendationPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{348} } -func (x *GetWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *StorageRecommendationPolicy) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *GetWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *StorageRecommendationPolicy) GetTeamId() string { if x != nil { - return x.PolicyId + return x.TeamId } return "" } -type GetWorkloadOptimizationPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StorageRecommendationPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +func (x *StorageRecommendationPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" } -func (x *GetWorkloadOptimizationPolicyResponse) Reset() { - *x = GetWorkloadOptimizationPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[325] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { + if x != nil { + return x.ActionTrigger } + return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED } -func (x *GetWorkloadOptimizationPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil } -func (*GetWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (x *StorageRecommendationPolicy) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} -func (x *GetWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[325] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use GetWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} +func (x *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent + } + return 0 } -func (x *GetWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetIsDefaultPolicy() bool { if x != nil { - return x.Policy + return x.IsDefaultPolicy + } + return false +} + +func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } return nil } -type UpdateWorkloadOptimizationPolicyRequest struct { +func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type CreateStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` - Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled *bool `protobuf:"varint,5,opt,name=enabled,proto3,oneof" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,7,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,8,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,9,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,10,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,11,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,12,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,13,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled *bool `protobuf:"varint,14,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3,oneof" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling *bool `protobuf:"varint,15,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3,oneof" json:"use_in_place_vertical_scaling,omitempty"` - HpaEnabled *bool `protobuf:"varint,16,opt,name=hpa_enabled,json=hpaEnabled,proto3,oneof" json:"hpa_enabled,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,4,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,5,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,6,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + TargetUtilizationPercent *float32 `protobuf:"fixed32,7,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,8,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,9,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,10,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + CriticalDaysToFull *int32 `protobuf:"varint,11,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,12,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,13,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,14,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,15,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` } -func (x *UpdateWorkloadOptimizationPolicyRequest) Reset() { - *x = UpdateWorkloadOptimizationPolicyRequest{} +func (x *CreateStorageRecommendationPolicyRequest) Reset() { + *x = CreateStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[326] + mi := &file_api_v1_recommendation_proto_msgTypes[349] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateWorkloadOptimizationPolicyRequest) String() string { +func (x *CreateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[326] +func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[349] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25757,148 +29379,141 @@ func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use UpdateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{326} +// Deprecated: Use CreateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{349} } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *CreateStorageRecommendationPolicyRequest) GetName() string { if x != nil { - return x.PolicyId - } - return "" -} - -func (x *UpdateWorkloadOptimizationPolicyRequest) GetName() string { - if x != nil && x.Name != nil { - return *x.Name + return x.Name } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description +func (x *CreateStorageRecommendationPolicyRequest) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetEnabled() bool { - if x != nil && x.Enabled != nil { - return *x.Enabled +func (x *CreateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers } - return false + return nil } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *CreateStorageRecommendationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule } - return nil + return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector +func (x *CreateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *CreateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *CreateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull } - return "" + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *CreateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction } return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +func (x *CreateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *CreateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule +func (x *CreateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays } - return "" + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { - if x != nil && x.LiveMigrationEnabled != nil { - return *x.LiveMigrationEnabled +func (x *CreateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib } - return false + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { - if x != nil && x.UseInPlaceVerticalScaling != nil { - return *x.UseInPlaceVerticalScaling +func (x *CreateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd } - return false + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { - if x != nil && x.HpaEnabled != nil { - return *x.HpaEnabled +func (x *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds } - return false + return 0 } -type UpdateWorkloadOptimizationPolicyResponse struct { +type CreateStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *UpdateWorkloadOptimizationPolicyResponse) Reset() { - *x = UpdateWorkloadOptimizationPolicyResponse{} +func (x *CreateStorageRecommendationPolicyResponse) Reset() { + *x = CreateStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[327] + mi := &file_api_v1_recommendation_proto_msgTypes[350] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateWorkloadOptimizationPolicyResponse) String() string { +func (x *CreateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[327] +func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[350] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25909,45 +29524,43 @@ func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use UpdateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{327} +// Deprecated: Use CreateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{350} } -func (x *UpdateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { return x.Policy } return nil } -type DeleteWorkloadOptimizationPolicyRequest struct { +type GetStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - DeleteRules bool `protobuf:"varint,3,opt,name=delete_rules,json=deleteRules,proto3" json:"delete_rules,omitempty"` // if true, delete associated rules; if false, detach (set policy_id=null) + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *DeleteWorkloadOptimizationPolicyRequest) Reset() { - *x = DeleteWorkloadOptimizationPolicyRequest{} +func (x *GetStorageRecommendationPolicyRequest) Reset() { + *x = GetStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[328] + mi := &file_api_v1_recommendation_proto_msgTypes[351] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadOptimizationPolicyRequest) String() string { +func (x *GetStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[328] +func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[351] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25958,55 +29571,43 @@ func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{328} -} - -func (x *DeleteWorkloadOptimizationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use GetStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{351} } -func (x *DeleteWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { return x.PolicyId } return "" } -func (x *DeleteWorkloadOptimizationPolicyRequest) GetDeleteRules() bool { - if x != nil { - return x.DeleteRules - } - return false -} - -type DeleteWorkloadOptimizationPolicyResponse struct { +type GetStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *DeleteWorkloadOptimizationPolicyResponse) Reset() { - *x = DeleteWorkloadOptimizationPolicyResponse{} +func (x *GetStorageRecommendationPolicyResponse) Reset() { + *x = GetStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[329] + mi := &file_api_v1_recommendation_proto_msgTypes[352] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadOptimizationPolicyResponse) String() string { +func (x *GetStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[329] +func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[352] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26017,37 +29618,43 @@ func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{329} +// Deprecated: Use GetStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} } -type GetWorkloadRulesByPolicyRequest struct { +func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type ListStorageRecommendationPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetWorkloadRulesByPolicyRequest) Reset() { - *x = GetWorkloadRulesByPolicyRequest{} +func (x *ListStorageRecommendationPoliciesRequest) Reset() { + *x = ListStorageRecommendationPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[330] + mi := &file_api_v1_recommendation_proto_msgTypes[353] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRulesByPolicyRequest) String() string { +func (x *ListStorageRecommendationPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRulesByPolicyRequest) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} -func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[330] +func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[353] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26058,52 +29665,43 @@ func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRulesByPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRulesByPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{330} +// Deprecated: Use ListStorageRecommendationPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{353} } -func (x *GetWorkloadRulesByPolicyRequest) GetTeamId() string { +func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadRulesByPolicyRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId - } - return "" -} - -type GetWorkloadRulesByPolicyResponse struct { +type ListStorageRecommendationPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ManagedRules []*WorkloadRule `protobuf:"bytes,1,rep,name=managed_rules,json=managedRules,proto3" json:"managed_rules,omitempty"` - ExcludedRules []*WorkloadRule `protobuf:"bytes,2,rep,name=excluded_rules,json=excludedRules,proto3" json:"excluded_rules,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,3,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetWorkloadRulesByPolicyResponse) Reset() { - *x = GetWorkloadRulesByPolicyResponse{} +func (x *ListStorageRecommendationPoliciesResponse) Reset() { + *x = ListStorageRecommendationPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[331] + mi := &file_api_v1_recommendation_proto_msgTypes[354] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRulesByPolicyResponse) String() string { +func (x *ListStorageRecommendationPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRulesByPolicyResponse) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} -func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[331] +func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[354] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26114,58 +29712,58 @@ func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRulesByPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRulesByPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} -} - -func (x *GetWorkloadRulesByPolicyResponse) GetManagedRules() []*WorkloadRule { - if x != nil { - return x.ManagedRules - } - return nil -} - -func (x *GetWorkloadRulesByPolicyResponse) GetExcludedRules() []*WorkloadRule { - if x != nil { - return x.ExcludedRules - } - return nil +// Deprecated: Use ListStorageRecommendationPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} } -func (x *GetWorkloadRulesByPolicyResponse) GetClusterNames() map[string]string { +func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { if x != nil { - return x.ClusterNames + return x.Policies } return nil } -type ListWorkloadRulesRequest struct { +type UpdateStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,5,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,6,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,7,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + TargetUtilizationPercent *float32 `protobuf:"fixed32,8,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,9,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,10,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,11,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + CriticalDaysToFull *int32 `protobuf:"varint,12,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,13,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,14,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,15,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,16,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` } -func (x *ListWorkloadRulesRequest) Reset() { - *x = ListWorkloadRulesRequest{} +func (x *UpdateStorageRecommendationPolicyRequest) Reset() { + *x = UpdateStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[332] + mi := &file_api_v1_recommendation_proto_msgTypes[355] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRulesRequest) String() string { +func (x *UpdateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRulesRequest) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[332] +func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[355] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26176,52 +29774,148 @@ func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRulesRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRulesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{332} +// Deprecated: Use UpdateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{355} } -func (x *ListWorkloadRulesRequest) GetTeamId() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *ListWorkloadRulesRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId } return "" } -type ListWorkloadRulesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name - PolicyNames map[string]string `protobuf:"bytes,3,rep,name=policy_names,json=policyNames,proto3" json:"policy_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // policy_id → policy name +func (x *UpdateStorageRecommendationPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" } -func (x *ListWorkloadRulesResponse) Reset() { - *x = ListWorkloadRulesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[333] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { + if x != nil { + return x.Description } + return "" } -func (x *ListWorkloadRulesResponse) String() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds + } + return 0 +} + +type UpdateStorageRecommendationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateStorageRecommendationPolicyResponse) Reset() { + *x = UpdateStorageRecommendationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[356] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRulesResponse) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[333] +func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[356] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26232,58 +29926,44 @@ func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRulesResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRulesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} -} - -func (x *ListWorkloadRulesResponse) GetRules() []*WorkloadRule { - if x != nil { - return x.Rules - } - return nil -} - -func (x *ListWorkloadRulesResponse) GetClusterNames() map[string]string { - if x != nil { - return x.ClusterNames - } - return nil +// Deprecated: Use UpdateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{356} } -func (x *ListWorkloadRulesResponse) GetPolicyNames() map[string]string { +func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { - return x.PolicyNames + return x.Policy } return nil } -type GetWorkloadRuleByIDRequest struct { +type DeleteStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetWorkloadRuleByIDRequest) Reset() { - *x = GetWorkloadRuleByIDRequest{} +func (x *DeleteStorageRecommendationPolicyRequest) Reset() { + *x = DeleteStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[334] + mi := &file_api_v1_recommendation_proto_msgTypes[357] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByIDRequest) String() string { +func (x *DeleteStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByIDRequest) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[334] +func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[357] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26294,52 +29974,50 @@ func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByIDRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByIDRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} +// Deprecated: Use DeleteStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{357} } -func (x *GetWorkloadRuleByIDRequest) GetTeamId() string { +func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *GetWorkloadRuleByIDRequest) GetRuleId() string { +func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { - return x.RuleId + return x.TeamId } return "" } -type GetWorkloadRuleByIDResponse struct { +type DeleteStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id - PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *GetWorkloadRuleByIDResponse) Reset() { - *x = GetWorkloadRuleByIDResponse{} +func (x *DeleteStorageRecommendationPolicyResponse) Reset() { + *x = DeleteStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[335] + mi := &file_api_v1_recommendation_proto_msgTypes[358] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByIDResponse) String() string { +func (x *DeleteStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByIDResponse) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[335] +func (x *DeleteStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[358] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26350,62 +30028,55 @@ func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByIDResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByIDResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{335} -} - -func (x *GetWorkloadRuleByIDResponse) GetRule() *WorkloadRule { - if x != nil { - return x.Rule - } - return nil -} - -func (x *GetWorkloadRuleByIDResponse) GetClusterName() string { - if x != nil { - return x.ClusterName - } - return "" +// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{358} } -func (x *GetWorkloadRuleByIDResponse) GetPolicyName() string { +func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { if x != nil { - return x.PolicyName + return x.Success } - return "" + return false } -// GetWorkloadRuleByWorkloadRequest looks up a single rule by workload coordinates. -type GetWorkloadRuleByWorkloadRequest struct { +// StoragePolicyTarget maps a storage policy to clusters with targeting filters +type StoragePolicyTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Targeting filters + NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` // Target specific storage classes + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *GetWorkloadRuleByWorkloadRequest) Reset() { - *x = GetWorkloadRuleByWorkloadRequest{} +func (x *StoragePolicyTarget) Reset() { + *x = StoragePolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[336] + mi := &file_api_v1_recommendation_proto_msgTypes[359] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByWorkloadRequest) String() string { +func (x *StoragePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadRequest) ProtoMessage() {} +func (*StoragePolicyTarget) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[336] +func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[359] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26416,77 +30087,120 @@ func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByWorkloadRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{336} +// Deprecated: Use StoragePolicyTarget.ProtoReflect.Descriptor instead. +func (*StoragePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{359} } -func (x *GetWorkloadRuleByWorkloadRequest) GetTeamId() string { +func (x *StoragePolicyTarget) GetTargetId() string { if x != nil { - return x.TeamId + return x.TargetId } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetClusterId() string { +func (x *StoragePolicyTarget) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetNamespace() string { +func (x *StoragePolicyTarget) GetDescription() string { if x != nil { - return x.Namespace + return x.Description } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetKind() string { +func (x *StoragePolicyTarget) GetTeamId() string { if x != nil { - return x.Kind + return x.TeamId } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetWorkloadName() string { +func (x *StoragePolicyTarget) GetClusterIds() []string { if x != nil { - return x.WorkloadName + return x.ClusterIds + } + return nil +} + +func (x *StoragePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId } return "" } -// GetWorkloadRuleByWorkloadResponse returns the rule for a workload (if any) plus display metadata. -// Returns found = false (with rule unset) when no rule exists for the given coordinates; -// internal errors continue to surface as gRPC error statuses. -type GetWorkloadRuleByWorkloadResponse struct { +func (x *StoragePolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *StoragePolicyTarget) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *StoragePolicyTarget) GetStorageClasses() []string { + if x != nil { + return x.StorageClasses + } + return nil +} + +func (x *StoragePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *StoragePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type CreateStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id (when found) - PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) - Found bool `protobuf:"varint,4,opt,name=found,proto3" json:"found,omitempty"` // true when a matching rule exists + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,4,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,6,opt,name=enabled,proto3" json:"enabled,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` } -func (x *GetWorkloadRuleByWorkloadResponse) Reset() { - *x = GetWorkloadRuleByWorkloadResponse{} +func (x *CreateStoragePolicyTargetRequest) Reset() { + *x = CreateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[337] + mi := &file_api_v1_recommendation_proto_msgTypes[360] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByWorkloadResponse) String() string { +func (x *CreateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadResponse) ProtoMessage() {} +func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[337] +func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[360] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26497,68 +30211,92 @@ func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByWorkloadResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{337} +// Deprecated: Use CreateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{360} } -func (x *GetWorkloadRuleByWorkloadResponse) GetRule() *WorkloadRule { +func (x *CreateStoragePolicyTargetRequest) GetName() string { if x != nil { - return x.Rule + return x.Name } - return nil + return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetClusterName() string { +func (x *CreateStoragePolicyTargetRequest) GetDescription() string { if x != nil { - return x.ClusterName + return x.Description } return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetPolicyName() string { +func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { if x != nil { - return x.PolicyName + return x.TeamId } return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetFound() bool { +func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { if x != nil { - return x.Found + return x.ClusterIds + } + return nil +} + +func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { + if x != nil { + return x.Enabled } return false } -// GetWorkloadByWorkloadRuleRequest resolves the live workload UID for a rule. -// Lightweight lookup — does not return full workload data, just the uid that -// downstream RPCs (e.g. GetWorkloadProfiles, GetWorkload) require. -type GetWorkloadByWorkloadRuleRequest struct { +func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { + if x != nil { + return x.StorageClasses + } + return nil +} + +type CreateStoragePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *GetWorkloadByWorkloadRuleRequest) Reset() { - *x = GetWorkloadByWorkloadRuleRequest{} +func (x *CreateStoragePolicyTargetResponse) Reset() { + *x = CreateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[338] + mi := &file_api_v1_recommendation_proto_msgTypes[361] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleRequest) String() string { +func (x *CreateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleRequest) ProtoMessage() {} +func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[338] +func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[361] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26569,50 +30307,44 @@ func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadByWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadByWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{338} -} - -func (x *GetWorkloadByWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use CreateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{361} } -func (x *GetWorkloadByWorkloadRuleRequest) GetRuleId() string { +func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.RuleId + return x.Target } - return "" + return nil } -type GetWorkloadByWorkloadRuleResponse struct { +type ListStoragePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadUid string `protobuf:"bytes,1,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // empty when no live workload matches the rule's coordinates + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` } -func (x *GetWorkloadByWorkloadRuleResponse) Reset() { - *x = GetWorkloadByWorkloadRuleResponse{} +func (x *ListStoragePolicyTargetsRequest) Reset() { + *x = ListStoragePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[339] + mi := &file_api_v1_recommendation_proto_msgTypes[362] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleResponse) String() string { +func (x *ListStoragePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleResponse) ProtoMessage() {} +func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[339] +func (x *ListStoragePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[362] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26623,44 +30355,50 @@ func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadByWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadByWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{339} +// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{362} } -func (x *GetWorkloadByWorkloadRuleResponse) GetWorkloadUid() string { +func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { if x != nil { - return x.WorkloadUid + return x.TeamId } return "" } -type DeleteWorkloadRuleRequest struct { +func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListStoragePolicyTargetsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *DeleteWorkloadRuleRequest) Reset() { - *x = DeleteWorkloadRuleRequest{} +func (x *ListStoragePolicyTargetsResponse) Reset() { + *x = ListStoragePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[340] + mi := &file_api_v1_recommendation_proto_msgTypes[363] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleRequest) String() string { +func (x *ListStoragePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleRequest) ProtoMessage() {} +func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} -func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[340] +func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[363] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26671,48 +30409,43 @@ func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{340} -} - -func (x *DeleteWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{363} } -func (x *DeleteWorkloadRuleRequest) GetRuleId() string { +func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { if x != nil { - return x.RuleId + return x.Targets } - return "" + return nil } -type DeleteWorkloadRuleResponse struct { +type UpdateStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *DeleteWorkloadRuleResponse) Reset() { - *x = DeleteWorkloadRuleResponse{} +func (x *UpdateStoragePolicyTargetRequest) Reset() { + *x = UpdateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[341] + mi := &file_api_v1_recommendation_proto_msgTypes[364] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleResponse) String() string { +func (x *UpdateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleResponse) ProtoMessage() {} +func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[341] +func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[364] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26723,55 +30456,43 @@ func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{341} +// Deprecated: Use UpdateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{364} } -// ManualRuleFields carries the user-configurable rule fields shared by the -// Upsert and Preview RPCs. Extracted as its own message so the two request -// messages stay shape-aligned and the Go conversion logic has a single entry -// point. -type ManualRuleFields struct { +func (x *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateStoragePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` - MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` - GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` - HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` - EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,5,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - StartupPeriodSeconds *int64 `protobuf:"varint,7,opt,name=startup_period_seconds,json=startupPeriodSeconds,proto3,oneof" json:"startup_period_seconds,omitempty"` - CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. - Containers []*ContainerResourceRuleConfig `protobuf:"bytes,15,rep,name=containers,proto3" json:"containers,omitempty"` + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *ManualRuleFields) Reset() { - *x = ManualRuleFields{} +func (x *UpdateStoragePolicyTargetResponse) Reset() { + *x = UpdateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[342] + mi := &file_api_v1_recommendation_proto_msgTypes[365] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ManualRuleFields) String() string { +func (x *UpdateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ManualRuleFields) ProtoMessage() {} +func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[342] +func (x *UpdateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[365] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26782,153 +30503,174 @@ func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ManualRuleFields.ProtoReflect.Descriptor instead. -func (*ManualRuleFields) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{342} +// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{365} } -func (x *ManualRuleFields) GetCpuRule() *ResourceRuleConfig { +func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.CpuRule + return x.Target } return nil } -func (x *ManualRuleFields) GetMemoryRule() *ResourceRuleConfig { - if x != nil { - return x.MemoryRule - } - return nil -} +type DeleteStoragePolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ManualRuleFields) GetGpuRule() *ResourceRuleConfig { - if x != nil { - return x.GpuRule - } - return nil + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *ManualRuleFields) GetHpaRule() *HPARuleConfig { - if x != nil { - return x.HpaRule +func (x *DeleteStoragePolicyTargetRequest) Reset() { + *x = DeleteStoragePolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[366] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ManualRuleFields) GetEmergencyResponse() *EmergencyResponseConfig { - if x != nil { - return x.EmergencyResponse - } - return nil +func (x *DeleteStoragePolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ManualRuleFields) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} + +func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[366] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ManualRuleFields) GetStartupPeriodSeconds() int64 { - if x != nil && x.StartupPeriodSeconds != nil { - return *x.StartupPeriodSeconds - } - return 0 +// Deprecated: Use DeleteStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{366} } -func (x *ManualRuleFields) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { + if x != nil { + return x.TargetId } return "" } -func (x *ManualRuleFields) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId } - return 0 + return "" } -func (x *ManualRuleFields) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers - } - return nil +type DeleteStoragePolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *ManualRuleFields) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *DeleteStoragePolicyTargetResponse) Reset() { + *x = DeleteStoragePolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[367] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ManualRuleFields) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule - } - return "" +func (x *DeleteStoragePolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ManualRuleFields) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled +func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} + +func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[367] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *ManualRuleFields) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling - } - return false +// Deprecated: Use DeleteStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{367} } -func (x *ManualRuleFields) GetContainers() []*ContainerResourceRuleConfig { +func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { if x != nil { - return x.Containers + return x.Success } - return nil + return false } -type UpsertManualWorkloadRuleRequest struct { +// PvcStorageRecommendation represents a specific recommendation for a PVC +type PvcStorageRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - AutoGenerate bool `protobuf:"varint,6,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` - // Manual fields (only used when auto_generate = false). - Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` - // Optional: identifies which caller is upserting this rule. When unset, - // the server defaults to WORKLOAD_RULE_SOURCE_MANUAL (legacy UI behavior). - // External IaC providers (pulumi, terraform) MUST set this so the rule - // can be attributed in audit and UI surfaces. - Source WorkloadRuleSource `protobuf:"varint,11,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` + RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + PvcUid string `protobuf:"bytes,2,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PvcName string `protobuf:"bytes,3,opt,name=pvc_name,json=pvcName,proto3" json:"pvc_name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + CurrentCapacityBytes int64 `protobuf:"varint,10,opt,name=current_capacity_bytes,json=currentCapacityBytes,proto3" json:"current_capacity_bytes,omitempty"` + RecommendedCapacityBytes int64 `protobuf:"varint,11,opt,name=recommended_capacity_bytes,json=recommendedCapacityBytes,proto3" json:"recommended_capacity_bytes,omitempty"` + UsedBytesAtTime int64 `protobuf:"varint,12,opt,name=used_bytes_at_time,json=usedBytesAtTime,proto3" json:"used_bytes_at_time,omitempty"` + UtilizationPct float64 `protobuf:"fixed64,13,opt,name=utilization_pct,json=utilizationPct,proto3" json:"utilization_pct,omitempty"` + GrowthRateBytesPerDay float64 `protobuf:"fixed64,14,opt,name=growth_rate_bytes_per_day,json=growthRateBytesPerDay,proto3" json:"growth_rate_bytes_per_day,omitempty"` + DaysToFull float64 `protobuf:"fixed64,15,opt,name=days_to_full,json=daysToFull,proto3" json:"days_to_full,omitempty"` + ConfidenceScore float64 `protobuf:"fixed64,16,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` + PolicyId string `protobuf:"bytes,20,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyTargetId *string `protobuf:"bytes,21,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` + CostCurrentMonthlyUsd float64 `protobuf:"fixed64,25,opt,name=cost_current_monthly_usd,json=costCurrentMonthlyUsd,proto3" json:"cost_current_monthly_usd,omitempty"` + CostRecommendedMonthlyUsd float64 `protobuf:"fixed64,26,opt,name=cost_recommended_monthly_usd,json=costRecommendedMonthlyUsd,proto3" json:"cost_recommended_monthly_usd,omitempty"` + CostDeltaMonthlyUsd float64 `protobuf:"fixed64,27,opt,name=cost_delta_monthly_usd,json=costDeltaMonthlyUsd,proto3" json:"cost_delta_monthly_usd,omitempty"` + Status RecommendationStatus `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` + Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` + Error *string `protobuf:"bytes,32,opt,name=error,proto3,oneof" json:"error,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,40,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + OperationType PvcOperationType `protobuf:"varint,60,opt,name=operation_type,json=operationType,proto3,enum=api.v1.PvcOperationType" json:"operation_type,omitempty"` + WorkloadKind *string `protobuf:"bytes,61,opt,name=workload_kind,json=workloadKind,proto3,oneof" json:"workload_kind,omitempty"` + WorkloadName *string `protobuf:"bytes,62,opt,name=workload_name,json=workloadName,proto3,oneof" json:"workload_name,omitempty"` + WorkloadUid *string `protobuf:"bytes,63,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` } -func (x *UpsertManualWorkloadRuleRequest) Reset() { - *x = UpsertManualWorkloadRuleRequest{} +func (x *PvcStorageRecommendation) Reset() { + *x = PvcStorageRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[343] + mi := &file_api_v1_recommendation_proto_msgTypes[368] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpsertManualWorkloadRuleRequest) String() string { +func (x *PvcStorageRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertManualWorkloadRuleRequest) ProtoMessage() {} +func (*PvcStorageRecommendation) ProtoMessage() {} -func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[343] +func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[368] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26939,254 +30681,239 @@ func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertManualWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} +// Deprecated: Use PvcStorageRecommendation.ProtoReflect.Descriptor instead. +func (*PvcStorageRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{368} } -func (x *UpsertManualWorkloadRuleRequest) GetTeamId() string { +func (x *PvcStorageRecommendation) GetRecommendationId() string { if x != nil { - return x.TeamId + return x.RecommendationId } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetClusterId() string { +func (x *PvcStorageRecommendation) GetPvcUid() string { if x != nil { - return x.ClusterId + return x.PvcUid } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetNamespace() string { +func (x *PvcStorageRecommendation) GetPvcName() string { if x != nil { - return x.Namespace + return x.PvcName } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetKind() string { +func (x *PvcStorageRecommendation) GetNamespace() string { if x != nil { - return x.Kind + return x.Namespace } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetName() string { +func (x *PvcStorageRecommendation) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetAutoGenerate() bool { +func (x *PvcStorageRecommendation) GetTeamId() string { if x != nil { - return x.AutoGenerate + return x.TeamId } - return false + return "" } -func (x *UpsertManualWorkloadRuleRequest) GetFields() *ManualRuleFields { +func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { if x != nil { - return x.Fields + return x.CurrentCapacityBytes } - return nil + return 0 } -func (x *UpsertManualWorkloadRuleRequest) GetSource() WorkloadRuleSource { +func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { if x != nil { - return x.Source + return x.RecommendedCapacityBytes } - return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED + return 0 } -type UpsertManualWorkloadRuleResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` +func (x *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { + if x != nil { + return x.UsedBytesAtTime + } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) Reset() { - *x = UpsertManualWorkloadRuleResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[344] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { + if x != nil { + return x.UtilizationPct } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { + if x != nil { + return x.GrowthRateBytesPerDay + } + return 0 } -func (*UpsertManualWorkloadRuleResponse) ProtoMessage() {} - -func (x *UpsertManualWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[344] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *PvcStorageRecommendation) GetDaysToFull() float64 { + if x != nil { + return x.DaysToFull } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use UpsertManualWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} +func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { + if x != nil { + return x.ConfidenceScore + } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) GetRule() *WorkloadRule { +func (x *PvcStorageRecommendation) GetPolicyId() string { if x != nil { - return x.Rule + return x.PolicyId } - return nil + return "" } -// PreviewWorkloadRuleRequest mirrors the upsert request but does not -// persist anything; returns a side-by-side preview instead. -type PreviewWorkloadRuleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *PvcStorageRecommendation) GetPolicyTargetId() string { + if x != nil && x.PolicyTargetId != nil { + return *x.PolicyTargetId + } + return "" +} - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // Required so the server can fetch the workload's profile (percentiles, - // behavior). The form already has uid for any existing workload. - WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` - Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` +func (x *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { + if x != nil { + return x.CostCurrentMonthlyUsd + } + return 0 } -func (x *PreviewWorkloadRuleRequest) Reset() { - *x = PreviewWorkloadRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[345] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *PvcStorageRecommendation) GetCostRecommendedMonthlyUsd() float64 { + if x != nil { + return x.CostRecommendedMonthlyUsd } + return 0 } -func (x *PreviewWorkloadRuleRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { + if x != nil { + return x.CostDeltaMonthlyUsd + } + return 0 } -func (*PreviewWorkloadRuleRequest) ProtoMessage() {} +func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { + if x != nil { + return x.Status + } + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED +} -func (x *PreviewWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[345] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *PvcStorageRecommendation) GetReasoning() string { + if x != nil && x.Reasoning != nil { + return *x.Reasoning } - return mi.MessageOf(x) + return "" } -// Deprecated: Use PreviewWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*PreviewWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} +func (x *PvcStorageRecommendation) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" } -func (x *PreviewWorkloadRuleRequest) GetTeamId() string { +func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.TeamId + return x.Timestamp } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetClusterId() string { +func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { if x != nil { - return x.ClusterId + return x.AppliedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetNamespace() string { +func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Namespace + return x.CreatedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetKind() string { +func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kind + return x.UpdatedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetName() string { +func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { if x != nil { - return x.Name + return x.OperationType + } + return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED +} + +func (x *PvcStorageRecommendation) GetWorkloadKind() string { + if x != nil && x.WorkloadKind != nil { + return *x.WorkloadKind } return "" } -func (x *PreviewWorkloadRuleRequest) GetWorkloadUid() string { - if x != nil { - return x.WorkloadUid +func (x *PvcStorageRecommendation) GetWorkloadName() string { + if x != nil && x.WorkloadName != nil { + return *x.WorkloadName } return "" } -func (x *PreviewWorkloadRuleRequest) GetFields() *ManualRuleFields { - if x != nil { - return x.Fields +func (x *PvcStorageRecommendation) GetWorkloadUid() string { + if x != nil && x.WorkloadUid != nil { + return *x.WorkloadUid } - return nil + return "" } -type PreviewWorkloadRuleResponse struct { +type GetPvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Materialized rule — engine output overlaid with the user's draft as - // constraints (engine's BaseRequest clamped to user's min/max, multipliers - // overridden, etc.). When `fields` is empty/missing, equals engine_projection. - // Same shape as a saved rule. - MaterializedRule *WorkloadRule `protobuf:"bytes,1,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` - // Engine projection — pure-engine recommendation (classification-driven, - // no user constraints). Stable benchmark; same maths Apply uses for auto. - // Empty when profile data is insufficient; see engine_projection_unavailable_reason. - EngineProjection *WorkloadRule `protobuf:"bytes,2,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` - // Observed profile (per-container percentiles, behavior, classification, - // currently configured resources). Same shape as GetWorkloadProfiles - // single-workload result. - Profile *WorkloadProfileResult `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` - // Set when the engine couldn't produce a projection (insufficient data, - // workload not yet emitting metrics, etc.). FE renders the materialized - // draft + observed view without an engine column. - EngineProjectionUnavailableReason string `protobuf:"bytes,4,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` + RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` } -func (x *PreviewWorkloadRuleResponse) Reset() { - *x = PreviewWorkloadRuleResponse{} +func (x *GetPvcStorageRecommendationRequest) Reset() { + *x = GetPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[346] + mi := &file_api_v1_recommendation_proto_msgTypes[369] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewWorkloadRuleResponse) String() string { +func (x *GetPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewWorkloadRuleResponse) ProtoMessage() {} +func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[346] +func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[369] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27197,68 +30924,92 @@ func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PreviewWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*PreviewWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{346} +// Deprecated: Use GetPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{369} } -func (x *PreviewWorkloadRuleResponse) GetMaterializedRule() *WorkloadRule { +func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { if x != nil { - return x.MaterializedRule + return x.RecommendationId } - return nil + return "" } -func (x *PreviewWorkloadRuleResponse) GetEngineProjection() *WorkloadRule { - if x != nil { - return x.EngineProjection - } - return nil +type GetPvcStorageRecommendationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` } -func (x *PreviewWorkloadRuleResponse) GetProfile() *WorkloadProfileResult { - if x != nil { - return x.Profile - } - return nil +func (x *GetPvcStorageRecommendationResponse) Reset() { + *x = GetPvcStorageRecommendationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[370] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (x *PreviewWorkloadRuleResponse) GetEngineProjectionUnavailableReason() string { +func (x *GetPvcStorageRecommendationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} + +func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[370] + 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 GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{370} +} + +func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.EngineProjectionUnavailableReason + return x.Recommendation } - return "" + return nil } -type GetWorkloadContainerNamesRequest struct { +type ListPvcStorageRecommendationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` } -func (x *GetWorkloadContainerNamesRequest) Reset() { - *x = GetWorkloadContainerNamesRequest{} +func (x *ListPvcStorageRecommendationsRequest) Reset() { + *x = ListPvcStorageRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[347] + mi := &file_api_v1_recommendation_proto_msgTypes[371] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesRequest) String() string { +func (x *ListPvcStorageRecommendationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesRequest) ProtoMessage() {} +func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} -func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[347] +func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[371] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27269,71 +31020,58 @@ func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerNamesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{347} +// Deprecated: Use ListPvcStorageRecommendationsRequest.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{371} } -func (x *GetWorkloadContainerNamesRequest) GetTeamId() string { +func (x *ListPvcStorageRecommendationsRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadContainerNamesRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *GetWorkloadContainerNamesRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *GetWorkloadContainerNamesRequest) GetKind() string { - if x != nil { - return x.Kind +func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -func (x *GetWorkloadContainerNamesRequest) GetName() string { +func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { if x != nil { - return x.Name + return x.Pagination } - return "" + return nil } -type GetWorkloadContainerNamesResponse struct { +type ListPvcStorageRecommendationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerNames []string `protobuf:"bytes,1,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` + Recommendations []*PvcStorageRecommendation `protobuf:"bytes,1,rep,name=recommendations,proto3" json:"recommendations,omitempty"` + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` } -func (x *GetWorkloadContainerNamesResponse) Reset() { - *x = GetWorkloadContainerNamesResponse{} +func (x *ListPvcStorageRecommendationsResponse) Reset() { + *x = ListPvcStorageRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[348] + mi := &file_api_v1_recommendation_proto_msgTypes[372] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesResponse) String() string { +func (x *ListPvcStorageRecommendationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesResponse) ProtoMessage() {} +func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} -func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[348] +func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[372] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27344,45 +31082,53 @@ func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerNamesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{348} +// Deprecated: Use ListPvcStorageRecommendationsResponse.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{372} } -func (x *GetWorkloadContainerNamesResponse) GetContainerNames() []string { +func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { if x != nil { - return x.ContainerNames + return x.Recommendations } return nil } -type BatchAutoOptimizeWorkload struct { +func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +type GeneratePvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *BatchAutoOptimizeWorkload) Reset() { - *x = BatchAutoOptimizeWorkload{} +func (x *GeneratePvcStorageRecommendationRequest) Reset() { + *x = GeneratePvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[349] + mi := &file_api_v1_recommendation_proto_msgTypes[373] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkload) String() string { +func (x *GeneratePvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkload) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[349] +func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[373] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27393,59 +31139,67 @@ func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkload.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkload) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{349} +// Deprecated: Use GeneratePvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{373} } -func (x *BatchAutoOptimizeWorkload) GetNamespace() string { +func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { if x != nil { - return x.Namespace + return x.TeamId } return "" } -func (x *BatchAutoOptimizeWorkload) GetKind() string { +func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { if x != nil { - return x.Kind + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkload) GetName() string { +func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Name + return x.PvcUid } return "" } -type BatchAutoOptimizeWorkloadsRequest struct { +func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GeneratePvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Workloads []*BatchAutoOptimizeWorkload `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` + // When no recommendation is generated (e.g., low confidence, no resize needed), + // this field explains why + SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` } -func (x *BatchAutoOptimizeWorkloadsRequest) Reset() { - *x = BatchAutoOptimizeWorkloadsRequest{} +func (x *GeneratePvcStorageRecommendationResponse) Reset() { + *x = GeneratePvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[350] + mi := &file_api_v1_recommendation_proto_msgTypes[374] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadsRequest) String() string { +func (x *GeneratePvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadsRequest) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[350] +func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[374] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27456,62 +31210,53 @@ func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadsRequest.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{350} +// Deprecated: Use GeneratePvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{374} } -func (x *BatchAutoOptimizeWorkloadsRequest) GetTeamId() string { +func (x *GeneratePvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.TeamId + return x.Recommendation } - return "" + return nil } -func (x *BatchAutoOptimizeWorkloadsRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *GeneratePvcStorageRecommendationResponse) GetSkipReason() string { + if x != nil && x.SkipReason != nil { + return *x.SkipReason } return "" } -func (x *BatchAutoOptimizeWorkloadsRequest) GetWorkloads() []*BatchAutoOptimizeWorkload { - if x != nil { - return x.Workloads - } - return nil -} - -type BatchAutoOptimizeWorkloadResult struct { +type PreviewPvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` - Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *BatchAutoOptimizeWorkloadResult) Reset() { - *x = BatchAutoOptimizeWorkloadResult{} +func (x *PreviewPvcStorageRecommendationRequest) Reset() { + *x = PreviewPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[351] + mi := &file_api_v1_recommendation_proto_msgTypes[375] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadResult) String() string { +func (x *PreviewPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadResult) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[351] +func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[375] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27522,78 +31267,65 @@ func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadResult.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{351} +// Deprecated: Use PreviewPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{375} } -func (x *BatchAutoOptimizeWorkloadResult) GetNamespace() string { +func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { if x != nil { - return x.Namespace + return x.TeamId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetKind() string { +func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { if x != nil { - return x.Kind + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetName() string { +func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Name + return x.PvcUid } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetSuccess() bool { - if x != nil { - return x.Success - } - return false -} - -func (x *BatchAutoOptimizeWorkloadResult) GetError() string { +func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { if x != nil { - return x.Error + return x.PolicyId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetRule() *WorkloadRule { - if x != nil { - return x.Rule - } - return nil -} - -type BatchAutoOptimizeWorkloadsResponse struct { +type PreviewPvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*BatchAutoOptimizeWorkloadResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` + SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` } -func (x *BatchAutoOptimizeWorkloadsResponse) Reset() { - *x = BatchAutoOptimizeWorkloadsResponse{} +func (x *PreviewPvcStorageRecommendationResponse) Reset() { + *x = PreviewPvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[352] + mi := &file_api_v1_recommendation_proto_msgTypes[376] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadsResponse) String() string { +func (x *PreviewPvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadsResponse) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[352] +func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[376] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27604,55 +31336,64 @@ func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadsResponse.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} +// Deprecated: Use PreviewPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{376} } -func (x *BatchAutoOptimizeWorkloadsResponse) GetResults() []*BatchAutoOptimizeWorkloadResult { +func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.Results + return x.Recommendation } return nil } -// WorkloadProfileManifest is the authoritative key set for a single emit cycle -// of profile snapshots for a (cluster, window) pair. The server sends exactly -// one manifest followed by zero or more BatchWorkloadProfiles, all tagged with -// the same emit_id. The operator uses the manifest's keys to GC local -// WorkloadProfile CRs whose workload_uid is absent from `keys` once the emit -// cycle finalizes. -type WorkloadProfileManifest struct { +func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { + if x != nil && x.SkipReason != nil { + return *x.SkipReason + } + return "" +} + +type WorkloadRuleOOMEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` - Keys []*ProfileKey `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` - IssuedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=issued_at,json=issuedAt,proto3" json:"issued_at,omitempty"` - // emit_id is a UUID that identifies this emit cycle. Required. The operator - // buffers batches with a matching emit_id and finalizes the prior cycle - // when a manifest with a new emit_id arrives. - EmitId string `protobuf:"bytes,4,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` + MemoryRequestAt int64 `protobuf:"varint,9,opt,name=memory_request_at,json=memoryRequestAt,proto3" json:"memory_request_at,omitempty"` + MemoryLimitAt int64 `protobuf:"varint,10,opt,name=memory_limit_at,json=memoryLimitAt,proto3" json:"memory_limit_at,omitempty"` + MemoryUsageAt int64 `protobuf:"varint,11,opt,name=memory_usage_at,json=memoryUsageAt,proto3" json:"memory_usage_at,omitempty"` + EmergencyReaction bool `protobuf:"varint,12,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` + NewMemoryAfter *int64 `protobuf:"varint,13,opt,name=new_memory_after,json=newMemoryAfter,proto3,oneof" json:"new_memory_after,omitempty"` + RestartCount *int32 `protobuf:"varint,14,opt,name=restart_count,json=restartCount,proto3,oneof" json:"restart_count,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } -func (x *WorkloadProfileManifest) Reset() { - *x = WorkloadProfileManifest{} +func (x *WorkloadRuleOOMEvent) Reset() { + *x = WorkloadRuleOOMEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[353] + mi := &file_api_v1_recommendation_proto_msgTypes[377] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadProfileManifest) String() string { +func (x *WorkloadRuleOOMEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadProfileManifest) ProtoMessage() {} +func (*WorkloadRuleOOMEvent) ProtoMessage() {} -func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[353] +func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[377] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27663,136 +31404,144 @@ func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadProfileManifest.ProtoReflect.Descriptor instead. -func (*WorkloadProfileManifest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{353} +// Deprecated: Use WorkloadRuleOOMEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleOOMEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{377} } -func (x *WorkloadProfileManifest) GetWindow() ProfileWindow { +func (x *WorkloadRuleOOMEvent) GetId() string { if x != nil { - return x.Window + return x.Id } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED + return "" } -func (x *WorkloadProfileManifest) GetKeys() []*ProfileKey { +func (x *WorkloadRuleOOMEvent) GetRuleId() string { if x != nil { - return x.Keys + return x.RuleId } - return nil + return "" } -func (x *WorkloadProfileManifest) GetIssuedAt() *timestamppb.Timestamp { +func (x *WorkloadRuleOOMEvent) GetClusterId() string { if x != nil { - return x.IssuedAt + return x.ClusterId } - return nil + return "" } -func (x *WorkloadProfileManifest) GetEmitId() string { +func (x *WorkloadRuleOOMEvent) GetNamespace() string { if x != nil { - return x.EmitId + return x.Namespace } return "" } -// BatchWorkloadProfiles is a chunk of WorkloadProfileSnapshot values for a -// single emit cycle. Up to 128 profiles per batch. The emit_id MUST match the -// manifest's emit_id for the same cycle; operators discard batches whose -// emit_id does not match the currently-buffered cycle. -type BatchWorkloadProfiles struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` - Profiles []*WorkloadProfileSnapshot `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` - // emit_id matches the manifest emit_id for this cycle. Required. - EmitId string `protobuf:"bytes,3,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` +func (x *WorkloadRuleOOMEvent) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" } -func (x *BatchWorkloadProfiles) Reset() { - *x = BatchWorkloadProfiles{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[354] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *WorkloadRuleOOMEvent) GetContainerName() string { + if x != nil { + return x.ContainerName } + return "" } -func (x *BatchWorkloadProfiles) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil } -func (*BatchWorkloadProfiles) ProtoMessage() {} +func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { + if x != nil { + return x.RuleGeneration + } + return 0 +} -func (x *BatchWorkloadProfiles) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[354] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { + if x != nil { + return x.MemoryRequestAt } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use BatchWorkloadProfiles.ProtoReflect.Descriptor instead. -func (*BatchWorkloadProfiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} +func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { + if x != nil { + return x.MemoryLimitAt + } + return 0 } -func (x *BatchWorkloadProfiles) GetWindow() ProfileWindow { +func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { if x != nil { - return x.Window + return x.MemoryUsageAt } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED + return 0 } -func (x *BatchWorkloadProfiles) GetProfiles() []*WorkloadProfileSnapshot { +func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { if x != nil { - return x.Profiles + return x.EmergencyReaction } - return nil + return false } -func (x *BatchWorkloadProfiles) GetEmitId() string { +func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { + if x != nil && x.NewMemoryAfter != nil { + return *x.NewMemoryAfter + } + return 0 +} + +func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { + if x != nil && x.RestartCount != nil { + return *x.RestartCount + } + return 0 +} + +func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.EmitId + return x.CreatedAt } - return "" + return nil } -type NodeConfigApplyEvent struct { +type ListWorkloadRuleOOMEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - AppliedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` + Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *NodeConfigApplyEvent) Reset() { - *x = NodeConfigApplyEvent{} +func (x *ListWorkloadRuleOOMEventsRequest) Reset() { + *x = ListWorkloadRuleOOMEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[355] + mi := &file_api_v1_recommendation_proto_msgTypes[378] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeConfigApplyEvent) String() string { +func (x *ListWorkloadRuleOOMEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeConfigApplyEvent) ProtoMessage() {} +func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} -func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[355] +func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[378] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27803,73 +31552,267 @@ func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeConfigApplyEvent.ProtoReflect.Descriptor instead. -func (*NodeConfigApplyEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{355} +// Deprecated: Use ListWorkloadRuleOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{378} } -func (x *NodeConfigApplyEvent) GetConfigId() string { +func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { if x != nil { - return x.ConfigId + return x.RuleId } return "" } -func (x *NodeConfigApplyEvent) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { + if x != nil && x.Generation != nil { + return *x.Generation } - return "" + return 0 } -func (x *NodeConfigApplyEvent) GetStatus() string { - if x != nil { - return x.Status - } +func (x *ListWorkloadRuleOOMEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadRuleOOMEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadRuleOOMEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadRuleOOMEventsResponse) Reset() { + *x = ListWorkloadRuleOOMEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[379] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRuleOOMEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[379] + 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 ListWorkloadRuleOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{379} +} + +func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type ListWorkloadOOMEventsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` +} + +func (x *ListWorkloadOOMEventsRequest) Reset() { + *x = ListWorkloadOOMEventsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[380] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOOMEventsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} + +func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[380] + 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 ListWorkloadOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{380} +} + +func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } return "" } -func (x *NodeConfigApplyEvent) GetError() string { +func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { if x != nil { - return x.Error + return x.Namespace } return "" } -func (x *NodeConfigApplyEvent) GetAppliedAt() *timestamppb.Timestamp { +func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { if x != nil { - return x.AppliedAt + return x.WorkloadName + } + return "" +} + +func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadOOMEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadOOMEventsResponse) Reset() { + *x = ListWorkloadOOMEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[381] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOOMEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadOOMEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[381] + 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 ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{381} +} + +func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { + if x != nil { + return x.Events } return nil } -type GetNodeRecommendationStatusRequest struct { +func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type WorkloadRuleCPUThrottleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - HistoryLimit int32 `protobuf:"varint,3,opt,name=history_limit,json=historyLimit,proto3" json:"history_limit,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` + CpuRequestAt int64 `protobuf:"varint,9,opt,name=cpu_request_at,json=cpuRequestAt,proto3" json:"cpu_request_at,omitempty"` + CpuLimitAt int64 `protobuf:"varint,10,opt,name=cpu_limit_at,json=cpuLimitAt,proto3" json:"cpu_limit_at,omitempty"` + CpuUsageAt int64 `protobuf:"varint,11,opt,name=cpu_usage_at,json=cpuUsageAt,proto3" json:"cpu_usage_at,omitempty"` + ThrottledFraction float64 `protobuf:"fixed64,12,opt,name=throttled_fraction,json=throttledFraction,proto3" json:"throttled_fraction,omitempty"` + EmergencyReaction bool `protobuf:"varint,13,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` + NewCpuAfter *int64 `protobuf:"varint,14,opt,name=new_cpu_after,json=newCpuAfter,proto3,oneof" json:"new_cpu_after,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } -func (x *GetNodeRecommendationStatusRequest) Reset() { - *x = GetNodeRecommendationStatusRequest{} +func (x *WorkloadRuleCPUThrottleEvent) Reset() { + *x = WorkloadRuleCPUThrottleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[356] + mi := &file_api_v1_recommendation_proto_msgTypes[382] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusRequest) String() string { +func (x *WorkloadRuleCPUThrottleEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusRequest) ProtoMessage() {} +func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} -func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[356] +func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[382] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27880,58 +31823,144 @@ func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeRecommendationStatusRequest.ProtoReflect.Descriptor instead. -func (*GetNodeRecommendationStatusRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{356} +// Deprecated: Use WorkloadRuleCPUThrottleEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleCPUThrottleEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{382} } -func (x *GetNodeRecommendationStatusRequest) GetTeamId() string { +func (x *WorkloadRuleCPUThrottleEvent) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *GetNodeRecommendationStatusRequest) GetClusterId() string { +func (x *WorkloadRuleCPUThrottleEvent) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetNodeRecommendationStatusRequest) GetHistoryLimit() int32 { +func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { if x != nil { - return x.HistoryLimit + return x.Namespace + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +func (x *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { + if x != nil { + return x.RuleGeneration } return 0 } -type GetNodeRecommendationStatusResponse struct { +func (x *WorkloadRuleCPUThrottleEvent) GetCpuRequestAt() int64 { + if x != nil { + return x.CpuRequestAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCpuLimitAt() int64 { + if x != nil { + return x.CpuLimitAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCpuUsageAt() int64 { + if x != nil { + return x.CpuUsageAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetThrottledFraction() float64 { + if x != nil { + return x.ThrottledFraction + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetEmergencyReaction() bool { + if x != nil { + return x.EmergencyReaction + } + return false +} + +func (x *WorkloadRuleCPUThrottleEvent) GetNewCpuAfter() int64 { + if x != nil && x.NewCpuAfter != nil { + return *x.NewCpuAfter + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +type ListWorkloadRuleCPUThrottleEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CurrentConfig *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3" json:"current_config,omitempty"` - History []*NodeConfigApplyEvent `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"` + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` + Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *GetNodeRecommendationStatusResponse) Reset() { - *x = GetNodeRecommendationStatusResponse{} +func (x *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadRuleCPUThrottleEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[357] + mi := &file_api_v1_recommendation_proto_msgTypes[383] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusResponse) String() string { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusResponse) ProtoMessage() {} +func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} -func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[357] +func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[383] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27942,353 +31971,13378 @@ func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetNodeRecommendationStatusResponse.ProtoReflect.Descriptor instead. -func (*GetNodeRecommendationStatusResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{357} +// Deprecated: Use ListWorkloadRuleCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{383} } -func (x *GetNodeRecommendationStatusResponse) GetCurrentConfig() *NodeRecommendationConfig { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { if x != nil { - return x.CurrentConfig + return x.RuleId } - return nil + return "" } -func (x *GetNodeRecommendationStatusResponse) GetHistory() []*NodeConfigApplyEvent { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetGeneration() int64 { + if x != nil && x.Generation != nil { + return *x.Generation + } + return 0 +} + +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadRuleCPUThrottleEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) Reset() { + *x = ListWorkloadRuleCPUThrottleEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[384] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRuleCPUThrottleEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[384] + 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 ListWorkloadRuleCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{384} +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { if x != nil { - return x.History + return x.Events } return nil } -var File_api_v1_recommendation_proto protoreflect.FileDescriptor +func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} -var file_api_v1_recommendation_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x38, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfc, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, - 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x02, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x22, 0x71, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, - 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x89, 0x03, 0x0a, 0x29, 0x47, 0x65, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x97, 0x03, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x2f, 0x0a, - 0x14, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x35, 0x12, 0x41, - 0x0a, 0x1f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, - 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, - 0x48, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, - 0x35, 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, - 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x39, 0x12, 0x41, 0x0a, 0x1f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, - 0x66, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x21, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, - 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, - 0x89, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x28, - 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x27, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xdd, 0x03, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x3c, 0x0a, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x76, 0x70, 0x61, 0x4c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x3c, - 0x0a, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0b, 0x68, 0x70, 0x61, 0x4c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x30, 0x0a, 0x03, 0x72, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, - 0x72, 0x65, 0x63, 0x22, 0x98, 0x03, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3c, 0x0a, 0x0c, 0x76, 0x70, 0x61, - 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x76, 0x70, 0x61, 0x4c, - 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, - 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x68, 0x70, 0x61, 0x4c, 0x6f, 0x6f, - 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x94, - 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xca, 0x03, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, +type ListWorkloadCPUThrottleEventsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` +} + +func (x *ListWorkloadCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadCPUThrottleEventsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[385] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadCPUThrottleEventsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} + +func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[385] + 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 ListWorkloadCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{385} +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadCPUThrottleEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadCPUThrottleEventsResponse) Reset() { + *x = ListWorkloadCPUThrottleEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[386] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadCPUThrottleEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadCPUThrottleEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[386] + 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 ListWorkloadCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{386} +} + +func (x *ListWorkloadCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *ListWorkloadCPUThrottleEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +// StringSetSelector is an include/exclude selector for a set of string values. +// If In is non-empty, the value must match one entry. NotIn entries are always +// excluded. Both empty = match all. +type StringSetSelector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + In []string `protobuf:"bytes,1,rep,name=in,proto3" json:"in,omitempty"` + NotIn []string `protobuf:"bytes,2,rep,name=not_in,json=notIn,proto3" json:"not_in,omitempty"` +} + +func (x *StringSetSelector) Reset() { + *x = StringSetSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[387] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringSetSelector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringSetSelector) ProtoMessage() {} + +func (x *StringSetSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[387] + 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 StringSetSelector.ProtoReflect.Descriptor instead. +func (*StringSetSelector) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{387} +} + +func (x *StringSetSelector) GetIn() []string { + if x != nil { + return x.In + } + return nil +} + +func (x *StringSetSelector) GetNotIn() []string { + if x != nil { + return x.NotIn + } + return nil +} + +type WorkloadOptimizationPolicyProto struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"` + ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,7,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,10,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,11,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,12,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,13,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,14,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,15,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,16,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,17,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,18,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,32,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + // HPA: when true, WorkloadRules generated from this policy have HPA + // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. + HpaEnabled bool `protobuf:"varint,19,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,20,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,21,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,22,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,23,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // How far back to analyze CPU/memory/GPU usage when generating rules from + // this policy. Unset = 7 days. Clamped to the team's tier cap on write. + LookbackPeriodSeconds *int32 `protobuf:"varint,24,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Generic (workload-level, no-per-container) optimization settings this + // policy applies to every rule it generates — the same shape a manual + // rule's ManualRuleFields carries. Unset sub-fields mean "not configured + // for this axis"; the engine computes it as if this policy had no + // constraint at all. + CpuRule *ResourceRuleConfig `protobuf:"bytes,25,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,26,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,27,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,28,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,29,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,30,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,31,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` +} + +func (x *WorkloadOptimizationPolicyProto) Reset() { + *x = WorkloadOptimizationPolicyProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[388] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadOptimizationPolicyProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} + +func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[388] + 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 WorkloadOptimizationPolicyProto.ProtoReflect.Descriptor instead. +func (*WorkloadOptimizationPolicyProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{388} +} + +func (x *WorkloadOptimizationPolicyProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetHpaEnabled() bool { + if x != nil { + return x.HpaEnabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *WorkloadOptimizationPolicyProto) GetCpuRule() *ResourceRuleConfig { + if x != nil { + return x.CpuRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *WorkloadOptimizationPolicyProto) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +// GenericOptimizationSettings bundles the optional, workload-level (no +// per-container) resource/HPA/JVM/emergency settings a +// WorkloadOptimizationPolicy can apply to every rule it generates. Mirrors +// ManualRuleFields but omits fields that only make sense for a single +// concrete rule (containers, disabled, startup_period_seconds). Sent as a +// single optional block on create/update: omitted entirely means "leave +// every one of these columns unset/unchanged"; present means apply whichever +// sub-fields are themselves set, exactly like ManualRuleFields already does +// for a manual rule. +type GenericOptimizationSettings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,5,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,6,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,7,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` +} + +func (x *GenericOptimizationSettings) Reset() { + *x = GenericOptimizationSettings{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[389] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericOptimizationSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericOptimizationSettings) ProtoMessage() {} + +func (x *GenericOptimizationSettings) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[389] + 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 GenericOptimizationSettings.ProtoReflect.Descriptor instead. +func (*GenericOptimizationSettings) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{389} +} + +func (x *GenericOptimizationSettings) GetCpuRule() *ResourceRuleConfig { + if x != nil { + return x.CpuRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *GenericOptimizationSettings) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +type CreateWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"` + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,6,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,7,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,31,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + HpaEnabled bool `protobuf:"varint,15,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,16,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,17,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,18,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,19,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // Metrics lookback window in seconds. Unset = 7 days. + LookbackPeriodSeconds *int32 `protobuf:"varint,20,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Optional. Omitted entirely (the field's zero-value nil pointer) means + // every new resource/HPA/JVM/emergency column is left at NULL — the + // policy relies purely on engine auto-computation. When present, only + // the sub-fields actually populated within it are written. + Settings *GenericOptimizationSettings `protobuf:"bytes,30,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *CreateWorkloadOptimizationPolicyRequest) Reset() { + *x = CreateWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[390] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[390] + 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 CreateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{390} +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { + if x != nil { + return x.HpaEnabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetSettings() *GenericOptimizationSettings { + if x != nil { + return x.Settings + } + return nil +} + +type CreateWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *CreateWorkloadOptimizationPolicyResponse) Reset() { + *x = CreateWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[391] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[391] + 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 CreateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{391} +} + +func (x *CreateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ListWorkloadOptimizationPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Optional. When set, restricts the listing to policies that target this + // cluster — either explicitly via cluster_ids, or implicitly via an empty + // cluster_ids array (which means "all clusters" and therefore applies + // to this cluster too). + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *ListWorkloadOptimizationPoliciesRequest) Reset() { + *x = ListWorkloadOptimizationPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[392] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOptimizationPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOptimizationPoliciesRequest) ProtoMessage() {} + +func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[392] + 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 ListWorkloadOptimizationPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadOptimizationPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{392} +} + +func (x *ListWorkloadOptimizationPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListWorkloadOptimizationPoliciesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type ListWorkloadOptimizationPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*WorkloadOptimizationPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *ListWorkloadOptimizationPoliciesResponse) Reset() { + *x = ListWorkloadOptimizationPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[393] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOptimizationPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOptimizationPoliciesResponse) ProtoMessage() {} + +func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[393] + 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 ListWorkloadOptimizationPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadOptimizationPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{393} +} + +func (x *ListWorkloadOptimizationPoliciesResponse) GetPolicies() []*WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +type GetWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyRequest) Reset() { + *x = GetWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[394] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[394] + 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 GetWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{394} +} + +func (x *GetWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyResponse) Reset() { + *x = GetWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[395] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[395] + 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 GetWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{395} +} + +func (x *GetWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +// GetWorkloadOptimizationPolicyByWorkload looks up the optimization policy +// attached to a workload's rule in a single hop. Returns found = false when +// no rule exists for those coordinates or the rule has no policy attached. +type GetWorkloadOptimizationPolicyByWorkloadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) Reset() { + *x = GetWorkloadOptimizationPolicyByWorkloadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[396] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyByWorkloadRequest) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[396] + 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 GetWorkloadOptimizationPolicyByWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyByWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{396} +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +type GetWorkloadOptimizationPolicyByWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) Reset() { + *x = GetWorkloadOptimizationPolicyByWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[397] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyByWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[397] + 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 GetWorkloadOptimizationPolicyByWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyByWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{397} +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,7,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,8,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,9,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,10,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,11,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,12,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,13,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled *bool `protobuf:"varint,14,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3,oneof" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling *bool `protobuf:"varint,15,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3,oneof" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease *bool `protobuf:"varint,31,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3,oneof" json:"allow_in_place_memory_limit_decrease,omitempty"` + HpaEnabled *bool `protobuf:"varint,16,opt,name=hpa_enabled,json=hpaEnabled,proto3,oneof" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,17,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,18,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,19,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,20,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // Metrics lookback window in seconds. Omitting it leaves the stored window + // alone rather than resetting it. A change reaches the policy's rules on + // their next generation pass. + LookbackPeriodSeconds *int32 `protobuf:"varint,22,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Optional. Omitted entirely means leave every existing + // resource/HPA/JVM/emergency setting on this policy untouched — the same + // "only update when the client explicitly sends a value" convention + // already used above for cron_schedule/cooldown_minutes/etc. When + // present, each sub-field within it (cpu_rule, hpa_rule, ...) is applied + // independently: a sub-field left unset inside a present `settings` + // block leaves that axis's current value untouched too, exactly + // mirroring how ManualRuleFields already behaves for a manual rule edit. + Settings *GenericOptimizationSettings `protobuf:"bytes,30,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) Reset() { + *x = UpdateWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[398] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[398] + 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 UpdateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{398} +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { + if x != nil && x.LiveMigrationEnabled != nil { + return *x.LiveMigrationEnabled + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { + if x != nil && x.UseInPlaceVerticalScaling != nil { + return *x.UseInPlaceVerticalScaling + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil && x.AllowInPlaceMemoryLimitDecrease != nil { + return *x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { + if x != nil && x.HpaEnabled != nil { + return *x.HpaEnabled + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetSettings() *GenericOptimizationSettings { + if x != nil { + return x.Settings + } + return nil +} + +// ToggleWorkloadOptimizationPolicyDisabled is the sole way to change an +// existing policy's disabled state (creation sets the initial value directly +// via CreateWorkloadOptimizationPolicyRequest.disabled). Splitting this out +// from the general update keeps the branchy "what happens to a policy's +// existing rules when it goes disabled" logic in one place, not entangled +// with unrelated field updates. +type ToggleWorkloadOptimizationPolicyDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` + // Only consulted when transitioning enabled -> disabled. Unspecified + // defaults to KEEP (detach) — never a silent hard delete. Ignored when + // enabling, or when the policy is already in the requested state. + RuleAction *WorkloadRuleAction `protobuf:"varint,4,opt,name=rule_action,json=ruleAction,proto3,enum=api.v1.WorkloadRuleAction,oneof" json:"rule_action,omitempty"` +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) Reset() { + *x = ToggleWorkloadOptimizationPolicyDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[399] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadOptimizationPolicyDisabledRequest) ProtoMessage() {} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[399] + 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 ToggleWorkloadOptimizationPolicyDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadOptimizationPolicyDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{399} +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetRuleAction() WorkloadRuleAction { + if x != nil && x.RuleAction != nil { + return *x.RuleAction + } + return WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED +} + +type ToggleWorkloadOptimizationPolicyDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) Reset() { + *x = ToggleWorkloadOptimizationPolicyDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[400] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadOptimizationPolicyDisabledResponse) ProtoMessage() {} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[400] + 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 ToggleWorkloadOptimizationPolicyDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadOptimizationPolicyDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{400} +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) Reset() { + *x = UpdateWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[401] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[401] + 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 UpdateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{401} +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // Controls what happens to the policy's already-generated rules. + // Unspecified/omitted defaults to KEEP (detach) — never a silent hard + // delete. + RuleAction *WorkloadRuleAction `protobuf:"varint,4,opt,name=rule_action,json=ruleAction,proto3,enum=api.v1.WorkloadRuleAction,oneof" json:"rule_action,omitempty"` +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) Reset() { + *x = DeleteWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[402] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[402] + 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 DeleteWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{402} +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetRuleAction() WorkloadRuleAction { + if x != nil && x.RuleAction != nil { + return *x.RuleAction + } + return WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED +} + +type DeleteWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteWorkloadOptimizationPolicyResponse) Reset() { + *x = DeleteWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[403] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[403] + 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 DeleteWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{403} +} + +// PreviewWorkloadOptimizationPolicyMatches: dry-run targeting preview. Mirrors +// CreateWorkloadOptimizationPolicyRequest's targeting fields exactly (plus +// optional policy_id) — deliberately excludes operational fields (triggers, +// scheduling, HPA/scaling flags) since those don't affect which workloads +// match, only what happens once a rule is generated for them. +type PreviewWorkloadOptimizationPolicyMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Optional. Set in edit mode so matches already owned by this policy can + // be distinguished from matches owned by a different policy. Omit in + // create mode, where there is no "this policy" yet. + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + ClusterIds []string `protobuf:"bytes,3,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,4,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + KindSelector *StringSetSelector `protobuf:"bytes,5,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,6,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,7,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,8,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) Reset() { + *x = PreviewWorkloadOptimizationPolicyMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[404] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadOptimizationPolicyMatchesRequest) ProtoMessage() {} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[404] + 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 PreviewWorkloadOptimizationPolicyMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadOptimizationPolicyMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{404} +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +type WorkloadOptimizationPolicyMatch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` + Status WorkloadOptimizationPolicyMatchStatus `protobuf:"varint,6,opt,name=status,proto3,enum=api.v1.WorkloadOptimizationPolicyMatchStatus" json:"status,omitempty"` + // Populated only when status = SKIPPED_OWNED_BY_OTHER_POLICY. + OwningPolicyId *string `protobuf:"bytes,7,opt,name=owning_policy_id,json=owningPolicyId,proto3,oneof" json:"owning_policy_id,omitempty"` + OwningPolicyName *string `protobuf:"bytes,8,opt,name=owning_policy_name,json=owningPolicyName,proto3,oneof" json:"owning_policy_name,omitempty"` +} + +func (x *WorkloadOptimizationPolicyMatch) Reset() { + *x = WorkloadOptimizationPolicyMatch{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[405] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadOptimizationPolicyMatch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadOptimizationPolicyMatch) ProtoMessage() {} + +func (x *WorkloadOptimizationPolicyMatch) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[405] + 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 WorkloadOptimizationPolicyMatch.ProtoReflect.Descriptor instead. +func (*WorkloadOptimizationPolicyMatch) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{405} +} + +func (x *WorkloadOptimizationPolicyMatch) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetStatus() WorkloadOptimizationPolicyMatchStatus { + if x != nil { + return x.Status + } + return WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED +} + +func (x *WorkloadOptimizationPolicyMatch) GetOwningPolicyId() string { + if x != nil && x.OwningPolicyId != nil { + return *x.OwningPolicyId + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetOwningPolicyName() string { + if x != nil && x.OwningPolicyName != nil { + return *x.OwningPolicyName + } + return "" +} + +type PreviewWorkloadOptimizationPolicyMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Capped (see total_matched vs. total_returned below) — ordered by + // cluster, namespace, kind, name. + MatchedWorkloads []*WorkloadOptimizationPolicyMatch `protobuf:"bytes,1,rep,name=matched_workloads,json=matchedWorkloads,proto3" json:"matched_workloads,omitempty"` + // Total workloads that matched the selector across all requested + // clusters, before the cap was applied. + TotalMatched int32 `protobuf:"varint,2,opt,name=total_matched,json=totalMatched,proto3" json:"total_matched,omitempty"` + // How many of total_matched are actually included in matched_workloads. + // total_returned < total_matched means the result was capped — narrow the + // targeting to see the rest. + TotalReturned int32 `protobuf:"varint,3,opt,name=total_returned,json=totalReturned,proto3" json:"total_returned,omitempty"` +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) Reset() { + *x = PreviewWorkloadOptimizationPolicyMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[406] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadOptimizationPolicyMatchesResponse) ProtoMessage() {} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[406] + 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 PreviewWorkloadOptimizationPolicyMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadOptimizationPolicyMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{406} +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetMatchedWorkloads() []*WorkloadOptimizationPolicyMatch { + if x != nil { + return x.MatchedWorkloads + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetTotalMatched() int32 { + if x != nil { + return x.TotalMatched + } + return 0 +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetTotalReturned() int32 { + if x != nil { + return x.TotalReturned + } + return 0 +} + +type SchedulerPolicyTargetProto struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // empty on create; set on update to preserve identity + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // empty = all team clusters + NamespaceSelector *StringSetSelector `protobuf:"bytes,3,opt,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` + KindSelector *StringSetSelector `protobuf:"bytes,4,opt,name=kind_selector,json=kindSelector,proto3" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,5,opt,name=label_selector,json=labelSelector,proto3" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3" json:"namespace_pattern,omitempty"` +} + +func (x *SchedulerPolicyTargetProto) Reset() { + *x = SchedulerPolicyTargetProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[407] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyTargetProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyTargetProto) ProtoMessage() {} + +func (x *SchedulerPolicyTargetProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[407] + 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 SchedulerPolicyTargetProto.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyTargetProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{407} +} + +func (x *SchedulerPolicyTargetProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SchedulerPolicyTargetProto) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +type SchedulerPolicyProto struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"` + SchedulerName string `protobuf:"bytes,6,opt,name=scheduler_name,json=schedulerName,proto3" json:"scheduler_name,omitempty"` + OverrideCustomScheduler bool `protobuf:"varint,7,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3" json:"override_custom_scheduler,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,8,rep,name=targets,proto3" json:"targets,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // set while a delete waits for revert acks (spec 4.5) + DeleteRequestedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=delete_requested_at,json=deleteRequestedAt,proto3,oneof" json:"delete_requested_at,omitempty"` + // live enrollment count, filled by List (not persisted) + EnrolledWorkloads int32 `protobuf:"varint,12,opt,name=enrolled_workloads,json=enrolledWorkloads,proto3" json:"enrolled_workloads,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,13,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id -> display name, union of target clusters +} + +func (x *SchedulerPolicyProto) Reset() { + *x = SchedulerPolicyProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[408] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyProto) ProtoMessage() {} + +func (x *SchedulerPolicyProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[408] + 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 SchedulerPolicyProto.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{408} +} + +func (x *SchedulerPolicyProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SchedulerPolicyProto) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SchedulerPolicyProto) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SchedulerPolicyProto) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *SchedulerPolicyProto) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *SchedulerPolicyProto) GetSchedulerName() string { + if x != nil { + return x.SchedulerName + } + return "" +} + +func (x *SchedulerPolicyProto) GetOverrideCustomScheduler() bool { + if x != nil { + return x.OverrideCustomScheduler + } + return false +} + +func (x *SchedulerPolicyProto) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +func (x *SchedulerPolicyProto) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetDeleteRequestedAt() *timestamppb.Timestamp { + if x != nil { + return x.DeleteRequestedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetEnrolledWorkloads() int32 { + if x != nil { + return x.EnrolledWorkloads + } + return 0 +} + +func (x *SchedulerPolicyProto) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type CreateSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` + OverrideCustomScheduler bool `protobuf:"varint,4,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3" json:"override_custom_scheduler,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,5,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateSchedulerPolicyRequest) Reset() { + *x = CreateSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[409] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchedulerPolicyRequest) ProtoMessage() {} + +func (x *CreateSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[409] + 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 CreateSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{409} +} + +func (x *CreateSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetOverrideCustomScheduler() bool { + if x != nil { + return x.OverrideCustomScheduler + } + return false +} + +func (x *CreateSchedulerPolicyRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type CreateSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *CreateSchedulerPolicyResponse) Reset() { + *x = CreateSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[410] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchedulerPolicyResponse) ProtoMessage() {} + +func (x *CreateSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[410] + 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 CreateSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{410} +} + +func (x *CreateSchedulerPolicyResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ListSchedulerPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // When set, only policies with at least one live target covering this + // cluster are returned. Omitted (unset) returns every policy for the + // team, unfiltered. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` +} + +func (x *ListSchedulerPoliciesRequest) Reset() { + *x = ListSchedulerPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[411] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPoliciesRequest) ProtoMessage() {} + +func (x *ListSchedulerPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[411] + 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 ListSchedulerPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListSchedulerPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{411} +} + +func (x *ListSchedulerPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSchedulerPoliciesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListSchedulerPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SchedulerPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *ListSchedulerPoliciesResponse) Reset() { + *x = ListSchedulerPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[412] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPoliciesResponse) ProtoMessage() {} + +func (x *ListSchedulerPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[412] + 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 ListSchedulerPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListSchedulerPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{412} +} + +func (x *ListSchedulerPoliciesResponse) GetPolicies() []*SchedulerPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +type UpdateSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + OverrideCustomScheduler *bool `protobuf:"varint,5,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3,oneof" json:"override_custom_scheduler,omitempty"` + // full replacement of the target set (targets with ids are updated, + // without ids created, missing ones removed) — omitted (empty) list + // means "leave targets unchanged", carried by this flag: + ReplaceTargets bool `protobuf:"varint,6,opt,name=replace_targets,json=replaceTargets,proto3" json:"replace_targets,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,7,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *UpdateSchedulerPolicyRequest) Reset() { + *x = UpdateSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[413] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSchedulerPolicyRequest) ProtoMessage() {} + +func (x *UpdateSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[413] + 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 UpdateSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{413} +} + +func (x *UpdateSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetOverrideCustomScheduler() bool { + if x != nil && x.OverrideCustomScheduler != nil { + return *x.OverrideCustomScheduler + } + return false +} + +func (x *UpdateSchedulerPolicyRequest) GetReplaceTargets() bool { + if x != nil { + return x.ReplaceTargets + } + return false +} + +func (x *UpdateSchedulerPolicyRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type UpdateSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSchedulerPolicyResponse) Reset() { + *x = UpdateSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[414] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSchedulerPolicyResponse) ProtoMessage() {} + +func (x *UpdateSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[414] + 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 UpdateSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{414} +} + +func (x *UpdateSchedulerPolicyResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ToggleSchedulerPolicyDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` +} + +func (x *ToggleSchedulerPolicyDisabledRequest) Reset() { + *x = ToggleSchedulerPolicyDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[415] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleSchedulerPolicyDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleSchedulerPolicyDisabledRequest) ProtoMessage() {} + +func (x *ToggleSchedulerPolicyDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[415] + 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 ToggleSchedulerPolicyDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleSchedulerPolicyDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{415} +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type ToggleSchedulerPolicyDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + // active enrollments flipped to pending_revert by disabling + RevertsInitiated int32 `protobuf:"varint,2,opt,name=reverts_initiated,json=revertsInitiated,proto3" json:"reverts_initiated,omitempty"` +} + +func (x *ToggleSchedulerPolicyDisabledResponse) Reset() { + *x = ToggleSchedulerPolicyDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[416] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleSchedulerPolicyDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleSchedulerPolicyDisabledResponse) ProtoMessage() {} + +func (x *ToggleSchedulerPolicyDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[416] + 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 ToggleSchedulerPolicyDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleSchedulerPolicyDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{416} +} + +func (x *ToggleSchedulerPolicyDisabledResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +func (x *ToggleSchedulerPolicyDisabledResponse) GetRevertsInitiated() int32 { + if x != nil { + return x.RevertsInitiated + } + return 0 +} + +type DeleteSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // force skips reverts: enrollments are abandoned in place (spec 4.5) + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` +} + +func (x *DeleteSchedulerPolicyRequest) Reset() { + *x = DeleteSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[417] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSchedulerPolicyRequest) ProtoMessage() {} + +func (x *DeleteSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[417] + 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 DeleteSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{417} +} + +func (x *DeleteSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSchedulerPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *DeleteSchedulerPolicyRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +type DeleteSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Outcome DeleteSchedulerPolicyResponse_Outcome `protobuf:"varint,1,opt,name=outcome,proto3,enum=api.v1.DeleteSchedulerPolicyResponse_Outcome" json:"outcome,omitempty"` + RevertsInitiated int32 `protobuf:"varint,2,opt,name=reverts_initiated,json=revertsInitiated,proto3" json:"reverts_initiated,omitempty"` +} + +func (x *DeleteSchedulerPolicyResponse) Reset() { + *x = DeleteSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[418] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSchedulerPolicyResponse) ProtoMessage() {} + +func (x *DeleteSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[418] + 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 DeleteSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{418} +} + +func (x *DeleteSchedulerPolicyResponse) GetOutcome() DeleteSchedulerPolicyResponse_Outcome { + if x != nil { + return x.Outcome + } + return DeleteSchedulerPolicyResponse_OUTCOME_UNSPECIFIED +} + +func (x *DeleteSchedulerPolicyResponse) GetRevertsInitiated() int32 { + if x != nil { + return x.RevertsInitiated + } + return 0 +} + +type PreviewSchedulerPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // set when editing, for diff classification + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,3,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *PreviewSchedulerPolicyTargetsRequest) Reset() { + *x = PreviewSchedulerPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[419] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSchedulerPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSchedulerPolicyTargetsRequest) ProtoMessage() {} + +func (x *PreviewSchedulerPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[419] + 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 PreviewSchedulerPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*PreviewSchedulerPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{419} +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type SchedulerPolicyTargetMatch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Status SchedulerPolicyTargetMatch_Status `protobuf:"varint,5,opt,name=status,proto3,enum=api.v1.SchedulerPolicyTargetMatch_Status" json:"status,omitempty"` + OwningPolicyId *string `protobuf:"bytes,6,opt,name=owning_policy_id,json=owningPolicyId,proto3,oneof" json:"owning_policy_id,omitempty"` + OwningPolicyName *string `protobuf:"bytes,7,opt,name=owning_policy_name,json=owningPolicyName,proto3,oneof" json:"owning_policy_name,omitempty"` + // workload spec's current schedulerName ("" = unset/default) + CurrentScheduler string `protobuf:"bytes,8,opt,name=current_scheduler,json=currentScheduler,proto3" json:"current_scheduler,omitempty"` +} + +func (x *SchedulerPolicyTargetMatch) Reset() { + *x = SchedulerPolicyTargetMatch{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[420] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyTargetMatch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyTargetMatch) ProtoMessage() {} + +func (x *SchedulerPolicyTargetMatch) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[420] + 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 SchedulerPolicyTargetMatch.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyTargetMatch) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{420} +} + +func (x *SchedulerPolicyTargetMatch) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetStatus() SchedulerPolicyTargetMatch_Status { + if x != nil { + return x.Status + } + return SchedulerPolicyTargetMatch_STATUS_UNSPECIFIED +} + +func (x *SchedulerPolicyTargetMatch) GetOwningPolicyId() string { + if x != nil && x.OwningPolicyId != nil { + return *x.OwningPolicyId + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetOwningPolicyName() string { + if x != nil && x.OwningPolicyName != nil { + return *x.OwningPolicyName + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetCurrentScheduler() string { + if x != nil { + return x.CurrentScheduler + } + return "" +} + +type PreviewSchedulerPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MatchedWorkloads []*SchedulerPolicyTargetMatch `protobuf:"bytes,1,rep,name=matched_workloads,json=matchedWorkloads,proto3" json:"matched_workloads,omitempty"` + TotalMatched int32 `protobuf:"varint,2,opt,name=total_matched,json=totalMatched,proto3" json:"total_matched,omitempty"` + TotalReturned int32 `protobuf:"varint,3,opt,name=total_returned,json=totalReturned,proto3" json:"total_returned,omitempty"` // capped at 500, deterministic prefix + // Count over the FULL match set (like total_matched), not just the + // capped/returned prefix: matches whose current_scheduler is neither + // empty nor default-scheduler. + CustomSchedulerCount int32 `protobuf:"varint,4,opt,name=custom_scheduler_count,json=customSchedulerCount,proto3" json:"custom_scheduler_count,omitempty"` +} + +func (x *PreviewSchedulerPolicyTargetsResponse) Reset() { + *x = PreviewSchedulerPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[421] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSchedulerPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSchedulerPolicyTargetsResponse) ProtoMessage() {} + +func (x *PreviewSchedulerPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[421] + 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 PreviewSchedulerPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*PreviewSchedulerPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{421} +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetMatchedWorkloads() []*SchedulerPolicyTargetMatch { + if x != nil { + return x.MatchedWorkloads + } + return nil +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetTotalMatched() int32 { + if x != nil { + return x.TotalMatched + } + return 0 +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetTotalReturned() int32 { + if x != nil { + return x.TotalReturned + } + return 0 +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetCustomSchedulerCount() int32 { + if x != nil { + return x.CustomSchedulerCount + } + return 0 +} + +type ListSchedulerPolicyEnrollmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) Reset() { + *x = ListSchedulerPolicyEnrollmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[422] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPolicyEnrollmentsRequest) ProtoMessage() {} + +func (x *ListSchedulerPolicyEnrollmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[422] + 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 ListSchedulerPolicyEnrollmentsRequest.ProtoReflect.Descriptor instead. +func (*ListSchedulerPolicyEnrollmentsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{422} +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type SchedulerPolicyEnrollment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + State SchedulerPolicyEnrollment_State `protobuf:"varint,5,opt,name=state,proto3,enum=api.v1.SchedulerPolicyEnrollment_State" json:"state,omitempty"` + // Original scheduler captured in the workload's baseline. Unset when no + // baseline row exists yet (spec 3.3); an empty string is a real value — + // the baseline captured the field as unset on the workload, not "unknown". + OriginalSchedulerName *string `protobuf:"bytes,6,opt,name=original_scheduler_name,json=originalSchedulerName,proto3,oneof" json:"original_scheduler_name,omitempty"` + EnrolledAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=enrolled_at,json=enrolledAt,proto3" json:"enrolled_at,omitempty"` + UnenrolledAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=unenrolled_at,json=unenrolledAt,proto3,oneof" json:"unenrolled_at,omitempty"` +} + +func (x *SchedulerPolicyEnrollment) Reset() { + *x = SchedulerPolicyEnrollment{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[423] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyEnrollment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyEnrollment) ProtoMessage() {} + +func (x *SchedulerPolicyEnrollment) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[423] + 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 SchedulerPolicyEnrollment.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyEnrollment) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{423} +} + +func (x *SchedulerPolicyEnrollment) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetState() SchedulerPolicyEnrollment_State { + if x != nil { + return x.State + } + return SchedulerPolicyEnrollment_STATE_UNSPECIFIED +} + +func (x *SchedulerPolicyEnrollment) GetOriginalSchedulerName() string { + if x != nil && x.OriginalSchedulerName != nil { + return *x.OriginalSchedulerName + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetEnrolledAt() *timestamppb.Timestamp { + if x != nil { + return x.EnrolledAt + } + return nil +} + +func (x *SchedulerPolicyEnrollment) GetUnenrolledAt() *timestamppb.Timestamp { + if x != nil { + return x.UnenrolledAt + } + return nil +} + +type ListSchedulerPolicyEnrollmentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enrollments []*SchedulerPolicyEnrollment `protobuf:"bytes,1,rep,name=enrollments,proto3" json:"enrollments,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id -> display name +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) Reset() { + *x = ListSchedulerPolicyEnrollmentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[424] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPolicyEnrollmentsResponse) ProtoMessage() {} + +func (x *ListSchedulerPolicyEnrollmentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[424] + 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 ListSchedulerPolicyEnrollmentsResponse.ProtoReflect.Descriptor instead. +func (*ListSchedulerPolicyEnrollmentsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{424} +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) GetEnrollments() []*SchedulerPolicyEnrollment { + if x != nil { + return x.Enrollments + } + return nil +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type SchedulerPolicySync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SchedulerPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Reverts []*SchedulerRevertInstruction `protobuf:"bytes,2,rep,name=reverts,proto3" json:"reverts,omitempty"` + // Opaque fingerprint of (policies, reverts, scheduler_settings); tunr + // echoes it in its next enrollment report so dakr can log convergence. + // Not used for correctness. + SyncFingerprint string `protobuf:"bytes,3,opt,name=sync_fingerprint,json=syncFingerprint,proto3" json:"sync_fingerprint,omitempty"` + // Rendered dz-scheduler-config.yaml content for this cluster, when a + // settings row exists. Unset when the cluster has no persisted + // SchedulerSettings row — tunr must leave the helm-managed ConfigMap + // untouched in that case, not apply a rendered-defaults config. + SchedulerSettings *SchedulerConfigPayload `protobuf:"bytes,4,opt,name=scheduler_settings,json=schedulerSettings,proto3" json:"scheduler_settings,omitempty"` +} + +func (x *SchedulerPolicySync) Reset() { + *x = SchedulerPolicySync{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[425] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicySync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicySync) ProtoMessage() {} + +func (x *SchedulerPolicySync) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[425] + 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 SchedulerPolicySync.ProtoReflect.Descriptor instead. +func (*SchedulerPolicySync) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{425} +} + +func (x *SchedulerPolicySync) GetPolicies() []*SchedulerPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +func (x *SchedulerPolicySync) GetReverts() []*SchedulerRevertInstruction { + if x != nil { + return x.Reverts + } + return nil +} + +func (x *SchedulerPolicySync) GetSyncFingerprint() string { + if x != nil { + return x.SyncFingerprint + } + return "" +} + +func (x *SchedulerPolicySync) GetSchedulerSettings() *SchedulerConfigPayload { + if x != nil { + return x.SchedulerSettings + } + return nil +} + +type SchedulerConfigPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Complete dz-scheduler-config.yaml content, rendered by dakr. + RenderedConfig string `protobuf:"bytes,1,opt,name=rendered_config,json=renderedConfig,proto3" json:"rendered_config,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SchedulerConfigPayload) Reset() { + *x = SchedulerConfigPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[426] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerConfigPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerConfigPayload) ProtoMessage() {} + +func (x *SchedulerConfigPayload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[426] + 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 SchedulerConfigPayload.ProtoReflect.Descriptor instead. +func (*SchedulerConfigPayload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{426} +} + +func (x *SchedulerConfigPayload) GetRenderedConfig() string { + if x != nil { + return x.RenderedConfig + } + return "" +} + +func (x *SchedulerConfigPayload) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type SchedulerRevertInstruction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnrollmentId string `protobuf:"bytes,1,opt,name=enrollment_id,json=enrollmentId,proto3" json:"enrollment_id,omitempty"` // ack correlation id for apply + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + // literal value to restore; empty string means remove the field + // (baseline recorded the scheduler as unset). tunr prefers the + // on-workload annotation and uses this as fallback (spec 4.5 step 2). + OriginalSchedulerName string `protobuf:"bytes,5,opt,name=original_scheduler_name,json=originalSchedulerName,proto3" json:"original_scheduler_name,omitempty"` +} + +func (x *SchedulerRevertInstruction) Reset() { + *x = SchedulerRevertInstruction{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[427] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertInstruction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertInstruction) ProtoMessage() {} + +func (x *SchedulerRevertInstruction) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[427] + 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 SchedulerRevertInstruction.ProtoReflect.Descriptor instead. +func (*SchedulerRevertInstruction) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{427} +} + +func (x *SchedulerRevertInstruction) GetEnrollmentId() string { + if x != nil { + return x.EnrollmentId + } + return "" +} + +func (x *SchedulerRevertInstruction) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerRevertInstruction) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerRevertInstruction) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerRevertInstruction) GetOriginalSchedulerName() string { + if x != nil { + return x.OriginalSchedulerName + } + return "" +} + +type SchedulerEnrollmentReport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Observations []*SchedulerEnrollmentReport_Observation `protobuf:"bytes,1,rep,name=observations,proto3" json:"observations,omitempty"` + // Echo of the SchedulerPolicySync.sync_fingerprint tunr last applied. + // dakr compares this against the sending stream's current delivery-state + // fingerprint and logs a divergence once per report (Debug/Info) -- + // informational only, never rejected: a stale echo just means tunr's + // report raced an in-flight sync push and will self-correct on the next + // tick. + SyncFingerprint string `protobuf:"bytes,2,opt,name=sync_fingerprint,json=syncFingerprint,proto3" json:"sync_fingerprint,omitempty"` + // Full image ref of the running dz-scheduler container (registry/repo:tag), + // as read from the dz-scheduler Deployment's first container. Informational, + // and the version gate the config renderer (#9978) uses to decide which + // rendered-config shape a cluster can accept. "" = unknown or the + // Deployment was not found (scheduler disabled, or not yet observed). + SchedulerImage string `protobuf:"bytes,3,opt,name=scheduler_image,json=schedulerImage,proto3" json:"scheduler_image,omitempty"` +} + +func (x *SchedulerEnrollmentReport) Reset() { + *x = SchedulerEnrollmentReport{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[428] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerEnrollmentReport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerEnrollmentReport) ProtoMessage() {} + +func (x *SchedulerEnrollmentReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[428] + 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 SchedulerEnrollmentReport.ProtoReflect.Descriptor instead. +func (*SchedulerEnrollmentReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{428} +} + +func (x *SchedulerEnrollmentReport) GetObservations() []*SchedulerEnrollmentReport_Observation { + if x != nil { + return x.Observations + } + return nil +} + +func (x *SchedulerEnrollmentReport) GetSyncFingerprint() string { + if x != nil { + return x.SyncFingerprint + } + return "" +} + +func (x *SchedulerEnrollmentReport) GetSchedulerImage() string { + if x != nil { + return x.SchedulerImage + } + return "" +} + +// SchedulerRevertEventReport carries fail-open scheduler revert events +// observed by tunr's admission failsafe: pods steered away from an +// unhealthy tracked scheduler at CREATE time. Pod-level and transient -- +// the owning workload stays enrolled; dakr records these as the negative +// signal for scheduler-impact observability. Batched per stream tick; +// dropped_events counts buffer overflow drops since the last report. +type SchedulerRevertEventReport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*SchedulerRevertEventReport_Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + DroppedEvents uint32 `protobuf:"varint,2,opt,name=dropped_events,json=droppedEvents,proto3" json:"dropped_events,omitempty"` +} + +func (x *SchedulerRevertEventReport) Reset() { + *x = SchedulerRevertEventReport{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[429] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertEventReport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertEventReport) ProtoMessage() {} + +func (x *SchedulerRevertEventReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[429] + 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 SchedulerRevertEventReport.ProtoReflect.Descriptor instead. +func (*SchedulerRevertEventReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{429} +} + +func (x *SchedulerRevertEventReport) GetEvents() []*SchedulerRevertEventReport_Event { + if x != nil { + return x.Events + } + return nil +} + +func (x *SchedulerRevertEventReport) GetDroppedEvents() uint32 { + if x != nil { + return x.DroppedEvents + } + return 0 +} + +type GetWorkloadRulesByPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetWorkloadRulesByPolicyRequest) Reset() { + *x = GetWorkloadRulesByPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[430] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRulesByPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRulesByPolicyRequest) ProtoMessage() {} + +func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[430] + 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 GetWorkloadRulesByPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRulesByPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{430} +} + +func (x *GetWorkloadRulesByPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRulesByPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetWorkloadRulesByPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ManagedRules []*WorkloadRule `protobuf:"bytes,1,rep,name=managed_rules,json=managedRules,proto3" json:"managed_rules,omitempty"` + ExcludedRules []*WorkloadRule `protobuf:"bytes,2,rep,name=excluded_rules,json=excludedRules,proto3" json:"excluded_rules,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,3,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetWorkloadRulesByPolicyResponse) Reset() { + *x = GetWorkloadRulesByPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[431] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRulesByPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRulesByPolicyResponse) ProtoMessage() {} + +func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[431] + 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 GetWorkloadRulesByPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRulesByPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{431} +} + +func (x *GetWorkloadRulesByPolicyResponse) GetManagedRules() []*WorkloadRule { + if x != nil { + return x.ManagedRules + } + return nil +} + +func (x *GetWorkloadRulesByPolicyResponse) GetExcludedRules() []*WorkloadRule { + if x != nil { + return x.ExcludedRules + } + return nil +} + +func (x *GetWorkloadRulesByPolicyResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type ListWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` +} + +func (x *ListWorkloadRulesRequest) Reset() { + *x = ListWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[432] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRulesRequest) ProtoMessage() {} + +func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[432] + 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 ListWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{432} +} + +func (x *ListWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListWorkloadRulesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name + PolicyNames map[string]string `protobuf:"bytes,3,rep,name=policy_names,json=policyNames,proto3" json:"policy_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // policy_id → policy name +} + +func (x *ListWorkloadRulesResponse) Reset() { + *x = ListWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[433] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRulesResponse) ProtoMessage() {} + +func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[433] + 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 ListWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{433} +} + +func (x *ListWorkloadRulesResponse) GetRules() []*WorkloadRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *ListWorkloadRulesResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +func (x *ListWorkloadRulesResponse) GetPolicyNames() map[string]string { + if x != nil { + return x.PolicyNames + } + return nil +} + +type GetWorkloadRuleByIDRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *GetWorkloadRuleByIDRequest) Reset() { + *x = GetWorkloadRuleByIDRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[434] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByIDRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByIDRequest) ProtoMessage() {} + +func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[434] + 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 GetWorkloadRuleByIDRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByIDRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{434} +} + +func (x *GetWorkloadRuleByIDRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRuleByIDRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type GetWorkloadRuleByIDResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) +} + +func (x *GetWorkloadRuleByIDResponse) Reset() { + *x = GetWorkloadRuleByIDResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[435] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByIDResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByIDResponse) ProtoMessage() {} + +func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[435] + 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 GetWorkloadRuleByIDResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByIDResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{435} +} + +func (x *GetWorkloadRuleByIDResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +func (x *GetWorkloadRuleByIDResponse) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +func (x *GetWorkloadRuleByIDResponse) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +// GetWorkloadRuleByWorkloadRequest looks up a single rule by workload coordinates. +type GetWorkloadRuleByWorkloadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` +} + +func (x *GetWorkloadRuleByWorkloadRequest) Reset() { + *x = GetWorkloadRuleByWorkloadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[436] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByWorkloadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByWorkloadRequest) ProtoMessage() {} + +func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[436] + 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 GetWorkloadRuleByWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{436} +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +// GetWorkloadRuleByWorkloadResponse returns the rule for a workload (if any) plus display metadata. +// Returns found = false (with rule unset) when no rule exists for the given coordinates; +// internal errors continue to surface as gRPC error statuses. +type GetWorkloadRuleByWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id (when found) + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) + Found bool `protobuf:"varint,4,opt,name=found,proto3" json:"found,omitempty"` // true when a matching rule exists +} + +func (x *GetWorkloadRuleByWorkloadResponse) Reset() { + *x = GetWorkloadRuleByWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[437] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[437] + 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 GetWorkloadRuleByWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{437} +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetFound() bool { + if x != nil { + return x.Found + } + return false +} + +// GetWorkloadByWorkloadRuleRequest resolves the live workload UID for a rule. +// Lightweight lookup — does not return full workload data, just the uid that +// downstream RPCs (e.g. GetWorkloadProfiles, GetWorkload) require. +type GetWorkloadByWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *GetWorkloadByWorkloadRuleRequest) Reset() { + *x = GetWorkloadByWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[438] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadByWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadByWorkloadRuleRequest) ProtoMessage() {} + +func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[438] + 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 GetWorkloadByWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadByWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{438} +} + +func (x *GetWorkloadByWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadByWorkloadRuleRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type GetWorkloadByWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadUid string `protobuf:"bytes,1,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // empty when no live workload matches the rule's coordinates +} + +func (x *GetWorkloadByWorkloadRuleResponse) Reset() { + *x = GetWorkloadByWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[439] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadByWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadByWorkloadRuleResponse) ProtoMessage() {} + +func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[439] + 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 GetWorkloadByWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadByWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{439} +} + +func (x *GetWorkloadByWorkloadRuleResponse) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +type DeleteWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *DeleteWorkloadRuleRequest) Reset() { + *x = DeleteWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[440] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadRuleRequest) ProtoMessage() {} + +func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[440] + 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 DeleteWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{440} +} + +func (x *DeleteWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteWorkloadRuleRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type DeleteWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteWorkloadRuleResponse) Reset() { + *x = DeleteWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[441] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadRuleResponse) ProtoMessage() {} + +func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[441] + 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 DeleteWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{441} +} + +type DeleteAllWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *DeleteAllWorkloadRulesRequest) Reset() { + *x = DeleteAllWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[442] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAllWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllWorkloadRulesRequest) ProtoMessage() {} + +func (x *DeleteAllWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[442] + 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 DeleteAllWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{442} +} + +func (x *DeleteAllWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteAllWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type DeleteAllWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllWorkloadRulesResponse) Reset() { + *x = DeleteAllWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[443] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAllWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllWorkloadRulesResponse) ProtoMessage() {} + +func (x *DeleteAllWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[443] + 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 DeleteAllWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*DeleteAllWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{443} +} + +// BulkDeleteWorkloadRules deletes an explicit set of rules within a single +// cluster (e.g. a UI multi-select), triggering CRD removal for each. Scoped +// to cluster_id so the server can validate ownership once and reject any +// rule_ids that don't belong to that cluster, rather than trusting the caller. +type BulkDeleteWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RuleIds []string `protobuf:"bytes,3,rep,name=rule_ids,json=ruleIds,proto3" json:"rule_ids,omitempty"` +} + +func (x *BulkDeleteWorkloadRulesRequest) Reset() { + *x = BulkDeleteWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[444] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteWorkloadRulesRequest) ProtoMessage() {} + +func (x *BulkDeleteWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[444] + 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 BulkDeleteWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BulkDeleteWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{444} +} + +func (x *BulkDeleteWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BulkDeleteWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BulkDeleteWorkloadRulesRequest) GetRuleIds() []string { + if x != nil { + return x.RuleIds + } + return nil +} + +type BulkDeleteWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeletedCount int32 `protobuf:"varint,1,opt,name=deleted_count,json=deletedCount,proto3" json:"deleted_count,omitempty"` +} + +func (x *BulkDeleteWorkloadRulesResponse) Reset() { + *x = BulkDeleteWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[445] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteWorkloadRulesResponse) ProtoMessage() {} + +func (x *BulkDeleteWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[445] + 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 BulkDeleteWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BulkDeleteWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{445} +} + +func (x *BulkDeleteWorkloadRulesResponse) GetDeletedCount() int32 { + if x != nil { + return x.DeletedCount + } + return 0 +} + +// BulkToggleWorkloadRulesDisabled flips the disabled flag on an explicit set +// of rules within a single cluster (e.g. a UI multi-select) — each rule +// switches to whatever it currently is NOT, independently of the others, so +// a single call can disable some and enable others in one request. Mirrors +// BulkDeleteWorkloadRules's scoping: rule_ids that do not belong to +// cluster_id are silently excluded rather than erroring. +type BulkToggleWorkloadRulesDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RuleIds []string `protobuf:"bytes,3,rep,name=rule_ids,json=ruleIds,proto3" json:"rule_ids,omitempty"` +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) Reset() { + *x = BulkToggleWorkloadRulesDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[446] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkToggleWorkloadRulesDisabledRequest) ProtoMessage() {} + +func (x *BulkToggleWorkloadRulesDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[446] + 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 BulkToggleWorkloadRulesDisabledRequest.ProtoReflect.Descriptor instead. +func (*BulkToggleWorkloadRulesDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{446} +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetRuleIds() []string { + if x != nil { + return x.RuleIds + } + return nil +} + +type BulkToggleWorkloadRulesDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UpdatedCount int32 `protobuf:"varint,1,opt,name=updated_count,json=updatedCount,proto3" json:"updated_count,omitempty"` +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) Reset() { + *x = BulkToggleWorkloadRulesDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[447] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkToggleWorkloadRulesDisabledResponse) ProtoMessage() {} + +func (x *BulkToggleWorkloadRulesDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[447] + 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 BulkToggleWorkloadRulesDisabledResponse.ProtoReflect.Descriptor instead. +func (*BulkToggleWorkloadRulesDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{447} +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) GetUpdatedCount() int32 { + if x != nil { + return x.UpdatedCount + } + return 0 +} + +type DeleteRuleAndApplyRecommendationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,4,opt,name=workload_recommendation,json=workloadRecommendation,proto3" json:"workload_recommendation,omitempty"` +} + +func (x *DeleteRuleAndApplyRecommendationRequest) Reset() { + *x = DeleteRuleAndApplyRecommendationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[448] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRuleAndApplyRecommendationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRuleAndApplyRecommendationRequest) ProtoMessage() {} + +func (x *DeleteRuleAndApplyRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[448] + 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 DeleteRuleAndApplyRecommendationRequest.ProtoReflect.Descriptor instead. +func (*DeleteRuleAndApplyRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{448} +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { + if x != nil { + return x.WorkloadRecommendation + } + return nil +} + +type DeleteRuleAndApplyRecommendationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteRuleAndApplyRecommendationResponse) Reset() { + *x = DeleteRuleAndApplyRecommendationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[449] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRuleAndApplyRecommendationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRuleAndApplyRecommendationResponse) ProtoMessage() {} + +func (x *DeleteRuleAndApplyRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[449] + 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 DeleteRuleAndApplyRecommendationResponse.ProtoReflect.Descriptor instead. +func (*DeleteRuleAndApplyRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{449} +} + +// ManualRuleFields carries the user-configurable rule fields shared by the +// Upsert and Preview RPCs. Extracted as its own message so the two request +// messages stay shape-aligned and the Go conversion logic has a single entry +// point. +type ManualRuleFields struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,5,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + StartupPeriodSeconds *int64 `protobuf:"varint,7,opt,name=startup_period_seconds,json=startupPeriodSeconds,proto3,oneof" json:"startup_period_seconds,omitempty"` + CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,20,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. + Containers []*ContainerResourceRuleConfig `protobuf:"bytes,15,rep,name=containers,proto3" json:"containers,omitempty"` + // JVM heap optimization overrides for this rule. + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,16,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + // Per-rule override of the JVM CPU startup floor (millicores). See + // WorkloadRule.jvm_cpu_startup_floor_millicores for semantics. + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,17,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Rule-wide on/off switch. Only valid when creating a brand-new rule via + // UpsertManualWorkloadRule — the request is REJECTED with an error if this + // is set while updating an existing rule. Use ToggleWorkloadRuleDisabled + // to change an existing rule's disabled state. See WorkloadRule.disabled + // for runtime semantics. optional (not plain bool) so the server can tell + // "omitted" apart from "explicitly false" and enforce the create-only rule. + Disabled *bool `protobuf:"varint,18,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"` + // Per-rule metrics lookback override. Unset inherits the owning policy's + // window, else the 7-day default. + LookbackPeriodSeconds *int32 `protobuf:"varint,19,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // KEDA ScaledObject template authored by the user via the manual-rule form. + // Mirrors WorkloadRule.keda_scaled_object; written through by UpsertManualWorkloadRule. + // Field 20 is taken by main's allow_in_place_memory_limit_decrease (added on the + // main merge), so keda_scaled_object is 21. + KedaScaledObject *KEDAScaledObjectTemplate `protobuf:"bytes,21,opt,name=keda_scaled_object,json=kedaScaledObject,proto3,oneof" json:"keda_scaled_object,omitempty"` +} + +func (x *ManualRuleFields) Reset() { + *x = ManualRuleFields{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[450] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ManualRuleFields) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ManualRuleFields) ProtoMessage() {} + +func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[450] + 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 ManualRuleFields.ProtoReflect.Descriptor instead. +func (*ManualRuleFields) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{450} +} + +func (x *ManualRuleFields) GetCpuRule() *ResourceRuleConfig { + if x != nil { + return x.CpuRule + } + return nil +} + +func (x *ManualRuleFields) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *ManualRuleFields) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +func (x *ManualRuleFields) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *ManualRuleFields) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +func (x *ManualRuleFields) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *ManualRuleFields) GetStartupPeriodSeconds() int64 { + if x != nil && x.StartupPeriodSeconds != nil { + return *x.StartupPeriodSeconds + } + return 0 +} + +func (x *ManualRuleFields) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *ManualRuleFields) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *ManualRuleFields) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *ManualRuleFields) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *ManualRuleFields) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *ManualRuleFields) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *ManualRuleFields) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *ManualRuleFields) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *ManualRuleFields) GetContainers() []*ContainerResourceRuleConfig { + if x != nil { + return x.Containers + } + return nil +} + +func (x *ManualRuleFields) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *ManualRuleFields) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *ManualRuleFields) GetDisabled() bool { + if x != nil && x.Disabled != nil { + return *x.Disabled + } + return false +} + +func (x *ManualRuleFields) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *ManualRuleFields) GetKedaScaledObject() *KEDAScaledObjectTemplate { + if x != nil { + return x.KedaScaledObject + } + return nil +} + +type UpsertManualWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + AutoGenerate bool `protobuf:"varint,6,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` + // Manual fields (only used when auto_generate = false). + Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` + // Optional: identifies which caller is upserting this rule. When unset, + // the server defaults to WORKLOAD_RULE_SOURCE_MANUAL (legacy UI behavior). + // External IaC providers (pulumi, terraform) MUST set this so the rule + // can be attributed in audit and UI surfaces. + Source WorkloadRuleSource `protobuf:"varint,11,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` +} + +func (x *UpsertManualWorkloadRuleRequest) Reset() { + *x = UpsertManualWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[451] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertManualWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertManualWorkloadRuleRequest) ProtoMessage() {} + +func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[451] + 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 UpsertManualWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*UpsertManualWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{451} +} + +func (x *UpsertManualWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetAutoGenerate() bool { + if x != nil { + return x.AutoGenerate + } + return false +} + +func (x *UpsertManualWorkloadRuleRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *UpsertManualWorkloadRuleRequest) GetSource() WorkloadRuleSource { + if x != nil { + return x.Source + } + return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED +} + +type UpsertManualWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *UpsertManualWorkloadRuleResponse) Reset() { + *x = UpsertManualWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[452] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertManualWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertManualWorkloadRuleResponse) ProtoMessage() {} + +func (x *UpsertManualWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[452] + 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 UpsertManualWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*UpsertManualWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{452} +} + +func (x *UpsertManualWorkloadRuleResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +// ToggleWorkloadRuleDisabled is the sole way to change an EXISTING rule's +// disabled state. UpsertManualWorkloadRule only honors ManualRuleFields.disabled +// when creating a brand-new rule; every other transition goes through here. +type ToggleWorkloadRuleDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` +} + +func (x *ToggleWorkloadRuleDisabledRequest) Reset() { + *x = ToggleWorkloadRuleDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[453] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadRuleDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadRuleDisabledRequest) ProtoMessage() {} + +func (x *ToggleWorkloadRuleDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[453] + 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 ToggleWorkloadRuleDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadRuleDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{453} +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type ToggleWorkloadRuleDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *ToggleWorkloadRuleDisabledResponse) Reset() { + *x = ToggleWorkloadRuleDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[454] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadRuleDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadRuleDisabledResponse) ProtoMessage() {} + +func (x *ToggleWorkloadRuleDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[454] + 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 ToggleWorkloadRuleDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadRuleDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{454} +} + +func (x *ToggleWorkloadRuleDisabledResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +// PreviewWorkloadRuleRequest mirrors the upsert request but does not +// persist anything; returns a side-by-side preview instead. +type PreviewWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + // Required so the server can fetch the workload's profile (percentiles, + // behavior). The form already has uid for any existing workload. + WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` + // Optional. Set when this preview is being driven by a + // WorkloadOptimizationPolicy rather than a manual draft (e.g. the policy + // targeting preview's per-row rule detail) — applies the policy's + // operational overrides (currently just hpa_enabled=false, which can only + // disable HPA, never force it on — same clamp real rule generation + // applies) to the materialized pass. Has no effect on engine_projection. + PolicyId *string `protobuf:"bytes,11,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` +} + +func (x *PreviewWorkloadRuleRequest) Reset() { + *x = PreviewWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[455] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadRuleRequest) ProtoMessage() {} + +func (x *PreviewWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[455] + 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 PreviewWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{455} +} + +func (x *PreviewWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *PreviewWorkloadRuleRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +type PreviewWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Materialized rule — engine output overlaid with the user's draft as + // constraints (engine's BaseRequest clamped to user's min/max, multipliers + // overridden, etc.). When `fields` is empty/missing, equals engine_projection. + // Same shape as a saved rule. + MaterializedRule *WorkloadRule `protobuf:"bytes,1,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` + // Engine projection — pure-engine recommendation (classification-driven, + // no user constraints). Stable benchmark; same maths Apply uses for auto. + // Empty when profile data is insufficient; see engine_projection_unavailable_reason. + EngineProjection *WorkloadRule `protobuf:"bytes,2,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` + // Observed profile (per-container percentiles, behavior, classification, + // currently configured resources). Same shape as GetWorkloadProfiles + // single-workload result. + Profile *WorkloadProfileResult `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` + // Set when the engine couldn't produce a projection (insufficient data, + // workload not yet emitting metrics, etc.). FE renders the materialized + // draft + observed view without an engine column. + EngineProjectionUnavailableReason string `protobuf:"bytes,4,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` + // The persisted DB rule for this workload. Null when no rule has been saved + // yet (create mode). Frontend fills ALL form fields directly from this when + // present; falls back to engine_projection for create-mode prefill. + // Engine suggestion chips always compare against engine_projection. + DbRule *WorkloadRule `protobuf:"bytes,5,opt,name=db_rule,json=dbRule,proto3" json:"db_rule,omitempty"` +} + +func (x *PreviewWorkloadRuleResponse) Reset() { + *x = PreviewWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[456] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadRuleResponse) ProtoMessage() {} + +func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[456] + 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 PreviewWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{456} +} + +func (x *PreviewWorkloadRuleResponse) GetMaterializedRule() *WorkloadRule { + if x != nil { + return x.MaterializedRule + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetEngineProjection() *WorkloadRule { + if x != nil { + return x.EngineProjection + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetProfile() *WorkloadProfileResult { + if x != nil { + return x.Profile + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetEngineProjectionUnavailableReason() string { + if x != nil { + return x.EngineProjectionUnavailableReason + } + return "" +} + +func (x *PreviewWorkloadRuleResponse) GetDbRule() *WorkloadRule { + if x != nil { + return x.DbRule + } + return nil +} + +type GetWorkloadContainerNamesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetWorkloadContainerNamesRequest) Reset() { + *x = GetWorkloadContainerNamesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[457] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerNamesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerNamesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[457] + 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 GetWorkloadContainerNamesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerNamesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{457} +} + +func (x *GetWorkloadContainerNamesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetWorkloadContainerNamesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerNames []string `protobuf:"bytes,1,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` +} + +func (x *GetWorkloadContainerNamesResponse) Reset() { + *x = GetWorkloadContainerNamesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[458] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerNamesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerNamesResponse) ProtoMessage() {} + +func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[458] + 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 GetWorkloadContainerNamesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerNamesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{458} +} + +func (x *GetWorkloadContainerNamesResponse) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +type BatchAutoOptimizeWorkload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *BatchAutoOptimizeWorkload) Reset() { + *x = BatchAutoOptimizeWorkload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[459] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkload) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[459] + 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 BatchAutoOptimizeWorkload.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{459} +} + +func (x *BatchAutoOptimizeWorkload) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchAutoOptimizeWorkload) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchAutoOptimizeWorkload) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type BatchAutoOptimizeWorkloadsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchAutoOptimizeWorkload `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadsRequest) Reset() { + *x = BatchAutoOptimizeWorkloadsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[460] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadsRequest) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[460] + 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 BatchAutoOptimizeWorkloadsRequest.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{460} +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetWorkloads() []*BatchAutoOptimizeWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +type BatchAutoOptimizeWorkloadResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadResult) Reset() { + *x = BatchAutoOptimizeWorkloadResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[461] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadResult) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[461] + 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 BatchAutoOptimizeWorkloadResult.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{461} +} + +func (x *BatchAutoOptimizeWorkloadResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchAutoOptimizeWorkloadResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +type BatchAutoOptimizeWorkloadsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchAutoOptimizeWorkloadResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadsResponse) Reset() { + *x = BatchAutoOptimizeWorkloadsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[462] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadsResponse) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[462] + 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 BatchAutoOptimizeWorkloadsResponse.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{462} +} + +func (x *BatchAutoOptimizeWorkloadsResponse) GetResults() []*BatchAutoOptimizeWorkloadResult { + if x != nil { + return x.Results + } + return nil +} + +// Identifies a workload by namespace/kind/name. Shared by batch RPCs +// (BatchUpsertManualWorkloadRules, BatchPreviewWorkloadRules). +// workload_uid is only needed for preview (the profiling service uses it). +type BatchWorkloadEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + WorkloadUid *string `protobuf:"bytes,5,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` +} + +func (x *BatchWorkloadEntry) Reset() { + *x = BatchWorkloadEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[463] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchWorkloadEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchWorkloadEntry) ProtoMessage() {} + +func (x *BatchWorkloadEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[463] + 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 BatchWorkloadEntry.ProtoReflect.Descriptor instead. +func (*BatchWorkloadEntry) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{463} +} + +func (x *BatchWorkloadEntry) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchWorkloadEntry) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchWorkloadEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchWorkloadEntry) GetWorkloadUid() string { + if x != nil && x.WorkloadUid != nil { + return *x.WorkloadUid + } + return "" +} + +type BatchUpsertManualWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchWorkloadEntry `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + AutoGenerate bool `protobuf:"varint,4,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,5,opt,name=fields,proto3" json:"fields,omitempty"` // shared across all workloads (only used when auto_generate=false) + Source WorkloadRuleSource `protobuf:"varint,6,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRulesRequest) Reset() { + *x = BatchUpsertManualWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[464] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRulesRequest) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[464] + 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 BatchUpsertManualWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{464} +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetWorkloads() []*BatchWorkloadEntry { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetAutoGenerate() bool { + if x != nil { + return x.AutoGenerate + } + return false +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetSource() WorkloadRuleSource { + if x != nil { + return x.Source + } + return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED +} + +type BatchUpsertManualWorkloadRuleResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRuleResult) Reset() { + *x = BatchUpsertManualWorkloadRuleResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[465] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRuleResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRuleResult) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRuleResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[465] + 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 BatchUpsertManualWorkloadRuleResult.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRuleResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{465} +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +type BatchUpsertManualWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchUpsertManualWorkloadRuleResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRulesResponse) Reset() { + *x = BatchUpsertManualWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[466] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRulesResponse) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[466] + 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 BatchUpsertManualWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{466} +} + +func (x *BatchUpsertManualWorkloadRulesResponse) GetResults() []*BatchUpsertManualWorkloadRuleResult { + if x != nil { + return x.Results + } + return nil +} + +// Batch preview — applies the same ManualRuleFields to multiple workloads +// and returns per-workload previews without persisting anything. +type BatchPreviewWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchWorkloadEntry `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,4,opt,name=fields,proto3" json:"fields,omitempty"` // shared across all workloads +} + +func (x *BatchPreviewWorkloadRulesRequest) Reset() { + *x = BatchPreviewWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[467] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRulesRequest) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[467] + 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 BatchPreviewWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{467} +} + +func (x *BatchPreviewWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchPreviewWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchPreviewWorkloadRulesRequest) GetWorkloads() []*BatchWorkloadEntry { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *BatchPreviewWorkloadRulesRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +type BatchPreviewWorkloadRuleResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + MaterializedRule *WorkloadRule `protobuf:"bytes,6,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` + EngineProjection *WorkloadRule `protobuf:"bytes,7,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` + Profile *WorkloadProfileResult `protobuf:"bytes,8,opt,name=profile,proto3" json:"profile,omitempty"` + EngineProjectionUnavailableReason string `protobuf:"bytes,9,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` +} + +func (x *BatchPreviewWorkloadRuleResult) Reset() { + *x = BatchPreviewWorkloadRuleResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[468] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRuleResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRuleResult) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRuleResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[468] + 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 BatchPreviewWorkloadRuleResult.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRuleResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{468} +} + +func (x *BatchPreviewWorkloadRuleResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchPreviewWorkloadRuleResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetMaterializedRule() *WorkloadRule { + if x != nil { + return x.MaterializedRule + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetEngineProjection() *WorkloadRule { + if x != nil { + return x.EngineProjection + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetProfile() *WorkloadProfileResult { + if x != nil { + return x.Profile + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetEngineProjectionUnavailableReason() string { + if x != nil { + return x.EngineProjectionUnavailableReason + } + return "" +} + +type BatchPreviewWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchPreviewWorkloadRuleResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchPreviewWorkloadRulesResponse) Reset() { + *x = BatchPreviewWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[469] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRulesResponse) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[469] + 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 BatchPreviewWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{469} +} + +func (x *BatchPreviewWorkloadRulesResponse) GetResults() []*BatchPreviewWorkloadRuleResult { + if x != nil { + return x.Results + } + return nil +} + +// ApplyOneTimeOptimization runs the MPA v2 engine for a workload and immediately +// creates a WorkloadRecommendation (no WorkloadRule persisted). Only allowed when +// no WorkloadRule already exists for the workload — the frontend disables the +// button in edit mode to enforce this at the UI layer too. +type ApplyOneTimeOptimizationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` +} + +func (x *ApplyOneTimeOptimizationRequest) Reset() { + *x = ApplyOneTimeOptimizationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[470] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApplyOneTimeOptimizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyOneTimeOptimizationRequest) ProtoMessage() {} + +func (x *ApplyOneTimeOptimizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[470] + 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 ApplyOneTimeOptimizationRequest.ProtoReflect.Descriptor instead. +func (*ApplyOneTimeOptimizationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{470} +} + +func (x *ApplyOneTimeOptimizationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +type ApplyOneTimeOptimizationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ApplyOneTimeOptimizationResponse) Reset() { + *x = ApplyOneTimeOptimizationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[471] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApplyOneTimeOptimizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyOneTimeOptimizationResponse) ProtoMessage() {} + +func (x *ApplyOneTimeOptimizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[471] + 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 ApplyOneTimeOptimizationResponse.ProtoReflect.Descriptor instead. +func (*ApplyOneTimeOptimizationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{471} +} + +// WorkloadProfileManifest is the authoritative key set for a single emit cycle +// of profile snapshots for a (cluster, window) pair. The server sends exactly +// one manifest followed by zero or more BatchWorkloadProfiles, all tagged with +// the same emit_id. The operator uses the manifest's keys to GC local +// WorkloadProfile CRs whose workload_uid is absent from `keys` once the emit +// cycle finalizes. +type WorkloadProfileManifest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + Keys []*ProfileKey `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` + IssuedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=issued_at,json=issuedAt,proto3" json:"issued_at,omitempty"` + // emit_id is a UUID that identifies this emit cycle. Required. The operator + // buffers batches with a matching emit_id and finalizes the prior cycle + // when a manifest with a new emit_id arrives. + EmitId string `protobuf:"bytes,4,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` +} + +func (x *WorkloadProfileManifest) Reset() { + *x = WorkloadProfileManifest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[472] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadProfileManifest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadProfileManifest) ProtoMessage() {} + +func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[472] + 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 WorkloadProfileManifest.ProtoReflect.Descriptor instead. +func (*WorkloadProfileManifest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{472} +} + +func (x *WorkloadProfileManifest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *WorkloadProfileManifest) GetKeys() []*ProfileKey { + if x != nil { + return x.Keys + } + return nil +} + +func (x *WorkloadProfileManifest) GetIssuedAt() *timestamppb.Timestamp { + if x != nil { + return x.IssuedAt + } + return nil +} + +func (x *WorkloadProfileManifest) GetEmitId() string { + if x != nil { + return x.EmitId + } + return "" +} + +// BatchWorkloadProfiles is a chunk of WorkloadProfileSnapshot values for a +// single emit cycle. Up to 128 profiles per batch. The emit_id MUST match the +// manifest's emit_id for the same cycle; operators discard batches whose +// emit_id does not match the currently-buffered cycle. +type BatchWorkloadProfiles struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + Profiles []*WorkloadProfileSnapshot `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` + // emit_id matches the manifest emit_id for this cycle. Required. + EmitId string `protobuf:"bytes,3,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` +} + +func (x *BatchWorkloadProfiles) Reset() { + *x = BatchWorkloadProfiles{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[473] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchWorkloadProfiles) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchWorkloadProfiles) ProtoMessage() {} + +func (x *BatchWorkloadProfiles) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[473] + 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 BatchWorkloadProfiles.ProtoReflect.Descriptor instead. +func (*BatchWorkloadProfiles) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{473} +} + +func (x *BatchWorkloadProfiles) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *BatchWorkloadProfiles) GetProfiles() []*WorkloadProfileSnapshot { + if x != nil { + return x.Profiles + } + return nil +} + +func (x *BatchWorkloadProfiles) GetEmitId() string { + if x != nil { + return x.EmitId + } + return "" +} + +type NodeConfigApplyEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` +} + +func (x *NodeConfigApplyEvent) Reset() { + *x = NodeConfigApplyEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[474] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeConfigApplyEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeConfigApplyEvent) ProtoMessage() {} + +func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[474] + 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 NodeConfigApplyEvent.ProtoReflect.Descriptor instead. +func (*NodeConfigApplyEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{474} +} + +func (x *NodeConfigApplyEvent) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *NodeConfigApplyEvent) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *NodeConfigApplyEvent) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *NodeConfigApplyEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *NodeConfigApplyEvent) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + +type GetNodeRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + HistoryLimit int32 `protobuf:"varint,3,opt,name=history_limit,json=historyLimit,proto3" json:"history_limit,omitempty"` +} + +func (x *GetNodeRecommendationStatusRequest) Reset() { + *x = GetNodeRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[475] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[475] + 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 GetNodeRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetNodeRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{475} +} + +func (x *GetNodeRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeRecommendationStatusRequest) GetHistoryLimit() int32 { + if x != nil { + return x.HistoryLimit + } + return 0 +} + +type GetNodeRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3" json:"current_config,omitempty"` + History []*NodeConfigApplyEvent `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"` +} + +func (x *GetNodeRecommendationStatusResponse) Reset() { + *x = GetNodeRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[476] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[476] + 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 GetNodeRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetNodeRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{476} +} + +func (x *GetNodeRecommendationStatusResponse) GetCurrentConfig() *NodeRecommendationConfig { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetNodeRecommendationStatusResponse) GetHistory() []*NodeConfigApplyEvent { + if x != nil { + return x.History + } + return nil +} + +// EnableCheckpointForPolicyRequest is the orchestration request for the C/R +// toggle on a node policy. enabled=true sets dakr.devzero.io/checkpoint-node +// on the policy template AND enqueues per-node label patches for all live nodes +// in the policy's matched groups. enabled=false unsets the label and enqueues +// the corresponding unset patches. +type EnableCheckpointForPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *EnableCheckpointForPolicyRequest) Reset() { + *x = EnableCheckpointForPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[477] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableCheckpointForPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableCheckpointForPolicyRequest) ProtoMessage() {} + +func (x *EnableCheckpointForPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[477] + 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 EnableCheckpointForPolicyRequest.ProtoReflect.Descriptor instead. +func (*EnableCheckpointForPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{477} +} + +func (x *EnableCheckpointForPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *EnableCheckpointForPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *EnableCheckpointForPolicyRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +type EnableCheckpointForPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // UUID grouping the enqueued per-node patches; empty when no live nodes + // needed enqueueing (policy template still got patched). + BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` + EnqueuedNodes uint32 `protobuf:"varint,2,opt,name=enqueued_nodes,json=enqueuedNodes,proto3" json:"enqueued_nodes,omitempty"` + // cluster_ids whose live nodes were NOT enqueued because their dakr + // operator reports a version lower than MinVersionNodeLabelApply (the + // operator release carrying the Node `patch` RBAC verb + the + // dakr.devzero.io/* allowlist for SSA). The policy template was still + // patched for these clusters, so newly-provisioned nodes inherit the + // label via the NodePool template; existing nodes will be picked up the + // next time the user re-runs this action after the operator upgrade. + SkippedClusters []string `protobuf:"bytes,3,rep,name=skipped_clusters,json=skippedClusters,proto3" json:"skipped_clusters,omitempty"` +} + +func (x *EnableCheckpointForPolicyResponse) Reset() { + *x = EnableCheckpointForPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[478] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableCheckpointForPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableCheckpointForPolicyResponse) ProtoMessage() {} + +func (x *EnableCheckpointForPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[478] + 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 EnableCheckpointForPolicyResponse.ProtoReflect.Descriptor instead. +func (*EnableCheckpointForPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{478} +} + +func (x *EnableCheckpointForPolicyResponse) GetBatchId() string { + if x != nil { + return x.BatchId + } + return "" +} + +func (x *EnableCheckpointForPolicyResponse) GetEnqueuedNodes() uint32 { + if x != nil { + return x.EnqueuedNodes + } + return 0 +} + +func (x *EnableCheckpointForPolicyResponse) GetSkippedClusters() []string { + if x != nil { + return x.SkippedClusters + } + return nil +} + +type GetCheckpointApplyStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetCheckpointApplyStatusRequest) Reset() { + *x = GetCheckpointApplyStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[479] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCheckpointApplyStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCheckpointApplyStatusRequest) ProtoMessage() {} + +func (x *GetCheckpointApplyStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[479] + 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 GetCheckpointApplyStatusRequest.ProtoReflect.Descriptor instead. +func (*GetCheckpointApplyStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{479} +} + +func (x *GetCheckpointApplyStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetCheckpointApplyStatusRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetCheckpointApplyStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // batch_id of the most-recent EnableCheckpointForPolicy batch for the + // supplied policy, or empty when no batch exists yet. + BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` + Pending uint32 `protobuf:"varint,2,opt,name=pending,proto3" json:"pending,omitempty"` + Applied uint32 `protobuf:"varint,3,opt,name=applied,proto3" json:"applied,omitempty"` + Failed uint32 `protobuf:"varint,4,opt,name=failed,proto3" json:"failed,omitempty"` + // rejected lumps every other terminal status (superseded, blocked, ignored, + // and the operator's Rejected) — the UI surfaces them collectively as "did + // not apply". + Rejected uint32 `protobuf:"varint,5,opt,name=rejected,proto3" json:"rejected,omitempty"` + Failures []*NodeApplyFailure `protobuf:"bytes,6,rep,name=failures,proto3" json:"failures,omitempty"` +} + +func (x *GetCheckpointApplyStatusResponse) Reset() { + *x = GetCheckpointApplyStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[480] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCheckpointApplyStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCheckpointApplyStatusResponse) ProtoMessage() {} + +func (x *GetCheckpointApplyStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[480] + 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 GetCheckpointApplyStatusResponse.ProtoReflect.Descriptor instead. +func (*GetCheckpointApplyStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{480} +} + +func (x *GetCheckpointApplyStatusResponse) GetBatchId() string { + if x != nil { + return x.BatchId + } + return "" +} + +func (x *GetCheckpointApplyStatusResponse) GetPending() uint32 { + if x != nil { + return x.Pending + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetApplied() uint32 { + if x != nil { + return x.Applied + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetFailed() uint32 { + if x != nil { + return x.Failed + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetRejected() uint32 { + if x != nil { + return x.Rejected + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetFailures() []*NodeApplyFailure { + if x != nil { + return x.Failures + } + return nil +} + +type NodeApplyFailure struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *NodeApplyFailure) Reset() { + *x = NodeApplyFailure{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[481] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeApplyFailure) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeApplyFailure) ProtoMessage() {} + +func (x *NodeApplyFailure) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[481] + 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 NodeApplyFailure.ProtoReflect.Descriptor instead. +func (*NodeApplyFailure) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{481} +} + +func (x *NodeApplyFailure) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *NodeApplyFailure) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type GetClusterCheckpointLabelCoverageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *GetClusterCheckpointLabelCoverageRequest) Reset() { + *x = GetClusterCheckpointLabelCoverageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[482] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterCheckpointLabelCoverageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterCheckpointLabelCoverageRequest) ProtoMessage() {} + +func (x *GetClusterCheckpointLabelCoverageRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[482] + 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 GetClusterCheckpointLabelCoverageRequest.ProtoReflect.Descriptor instead. +func (*GetClusterCheckpointLabelCoverageRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{482} +} + +func (x *GetClusterCheckpointLabelCoverageRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetClusterCheckpointLabelCoverageRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type NodeGroupCheckpointLabelCoverage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodePoolName string `protobuf:"bytes,1,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + // total_nodes counts live nodes in the group whose node_group_name maps to + // a policy attached to this cluster via an enabled NodePolicyTarget. Nodes + // outside any policy's scope are excluded. + TotalNodes uint32 `protobuf:"varint,2,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` + LabeledNodes uint32 `protobuf:"varint,3,opt,name=labeled_nodes,json=labeledNodes,proto3" json:"labeled_nodes,omitempty"` + PendingNodes uint32 `protobuf:"varint,4,opt,name=pending_nodes,json=pendingNodes,proto3" json:"pending_nodes,omitempty"` + FailedNodes uint32 `protobuf:"varint,5,opt,name=failed_nodes,json=failedNodes,proto3" json:"failed_nodes,omitempty"` + // ready_nodes = label applied AND criu_configured AND agent heartbeat fresh + // (<5 min). Drives the "Active · X/Y ready" / "Awaiting runtime · X/Y ready" + // NG-row subtext. + ReadyNodes uint32 `protobuf:"varint,6,opt,name=ready_nodes,json=readyNodes,proto3" json:"ready_nodes,omitempty"` +} + +func (x *NodeGroupCheckpointLabelCoverage) Reset() { + *x = NodeGroupCheckpointLabelCoverage{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[483] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupCheckpointLabelCoverage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupCheckpointLabelCoverage) ProtoMessage() {} + +func (x *NodeGroupCheckpointLabelCoverage) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[483] + 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 NodeGroupCheckpointLabelCoverage.ProtoReflect.Descriptor instead. +func (*NodeGroupCheckpointLabelCoverage) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{483} +} + +func (x *NodeGroupCheckpointLabelCoverage) GetNodePoolName() string { + if x != nil { + return x.NodePoolName + } + return "" +} + +func (x *NodeGroupCheckpointLabelCoverage) GetTotalNodes() uint32 { + if x != nil { + return x.TotalNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetLabeledNodes() uint32 { + if x != nil { + return x.LabeledNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetPendingNodes() uint32 { + if x != nil { + return x.PendingNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetFailedNodes() uint32 { + if x != nil { + return x.FailedNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetReadyNodes() uint32 { + if x != nil { + return x.ReadyNodes + } + return 0 +} + +type GetClusterCheckpointLabelCoverageResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []*NodeGroupCheckpointLabelCoverage `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *GetClusterCheckpointLabelCoverageResponse) Reset() { + *x = GetClusterCheckpointLabelCoverageResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[484] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterCheckpointLabelCoverageResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterCheckpointLabelCoverageResponse) ProtoMessage() {} + +func (x *GetClusterCheckpointLabelCoverageResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[484] + 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 GetClusterCheckpointLabelCoverageResponse.ProtoReflect.Descriptor instead. +func (*GetClusterCheckpointLabelCoverageResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{484} +} + +func (x *GetClusterCheckpointLabelCoverageResponse) GetGroups() []*NodeGroupCheckpointLabelCoverage { + if x != nil { + return x.Groups + } + return nil +} + +type ListNodeGroupCheckpointLabelStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodePoolName string `protobuf:"bytes,3,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) Reset() { + *x = ListNodeGroupCheckpointLabelStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[485] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListNodeGroupCheckpointLabelStateRequest) ProtoMessage() {} + +func (x *ListNodeGroupCheckpointLabelStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[485] + 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 ListNodeGroupCheckpointLabelStateRequest.ProtoReflect.Descriptor instead. +func (*ListNodeGroupCheckpointLabelStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{485} +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetNodePoolName() string { + if x != nil { + return x.NodePoolName + } + return "" +} + +type NodeCheckpointLabelEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + HasLabel bool `protobuf:"varint,2,opt,name=has_label,json=hasLabel,proto3" json:"has_label,omitempty"` + LastApplyState NodeCheckpointLabelState `protobuf:"varint,3,opt,name=last_apply_state,json=lastApplyState,proto3,enum=api.v1.NodeCheckpointLabelState" json:"last_apply_state,omitempty"` + LastError string `protobuf:"bytes,4,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` + // criu_configured = dakr-operator's last probe found criu installed on this + // node. Pair with criu_heartbeat_fresh — a true value with a stale heartbeat + // is not trustworthy. + CriuConfigured bool `protobuf:"varint,5,opt,name=criu_configured,json=criuConfigured,proto3" json:"criu_configured,omitempty"` + // criu_heartbeat_fresh = agent_healths.last_ping_at within the last 5 min. + // FE renders "Active" only when has_label + criu_configured + this. + CriuHeartbeatFresh bool `protobuf:"varint,6,opt,name=criu_heartbeat_fresh,json=criuHeartbeatFresh,proto3" json:"criu_heartbeat_fresh,omitempty"` +} + +func (x *NodeCheckpointLabelEntry) Reset() { + *x = NodeCheckpointLabelEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[486] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeCheckpointLabelEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeCheckpointLabelEntry) ProtoMessage() {} + +func (x *NodeCheckpointLabelEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[486] + 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 NodeCheckpointLabelEntry.ProtoReflect.Descriptor instead. +func (*NodeCheckpointLabelEntry) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{486} +} + +func (x *NodeCheckpointLabelEntry) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *NodeCheckpointLabelEntry) GetHasLabel() bool { + if x != nil { + return x.HasLabel + } + return false +} + +func (x *NodeCheckpointLabelEntry) GetLastApplyState() NodeCheckpointLabelState { + if x != nil { + return x.LastApplyState + } + return NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED +} + +func (x *NodeCheckpointLabelEntry) GetLastError() string { + if x != nil { + return x.LastError + } + return "" +} + +func (x *NodeCheckpointLabelEntry) GetCriuConfigured() bool { + if x != nil { + return x.CriuConfigured + } + return false +} + +func (x *NodeCheckpointLabelEntry) GetCriuHeartbeatFresh() bool { + if x != nil { + return x.CriuHeartbeatFresh + } + return false +} + +type ListNodeGroupCheckpointLabelStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodes []*NodeCheckpointLabelEntry `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) Reset() { + *x = ListNodeGroupCheckpointLabelStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[487] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListNodeGroupCheckpointLabelStateResponse) ProtoMessage() {} + +func (x *ListNodeGroupCheckpointLabelStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[487] + 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 ListNodeGroupCheckpointLabelStateResponse.ProtoReflect.Descriptor instead. +func (*ListNodeGroupCheckpointLabelStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{487} +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) GetNodes() []*NodeCheckpointLabelEntry { + if x != nil { + return x.Nodes + } + return nil +} + +type SnapshotPercentBounds struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Upper *int32 `protobuf:"varint,1,opt,name=upper,proto3,oneof" json:"upper,omitempty"` + Lower *int32 `protobuf:"varint,2,opt,name=lower,proto3,oneof" json:"lower,omitempty"` +} + +func (x *SnapshotPercentBounds) Reset() { + *x = SnapshotPercentBounds{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[488] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPercentBounds) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPercentBounds) ProtoMessage() {} + +func (x *SnapshotPercentBounds) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[488] + 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 SnapshotPercentBounds.ProtoReflect.Descriptor instead. +func (*SnapshotPercentBounds) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{488} +} + +func (x *SnapshotPercentBounds) GetUpper() int32 { + if x != nil && x.Upper != nil { + return *x.Upper + } + return 0 +} + +func (x *SnapshotPercentBounds) GetLower() int32 { + if x != nil && x.Lower != nil { + return *x.Lower + } + return 0 +} + +type SnapshotResourceThreshold struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuPercent *SnapshotPercentBounds `protobuf:"bytes,1,opt,name=cpu_percent,json=cpuPercent,proto3,oneof" json:"cpu_percent,omitempty"` + MemoryPercent *SnapshotPercentBounds `protobuf:"bytes,2,opt,name=memory_percent,json=memoryPercent,proto3,oneof" json:"memory_percent,omitempty"` + PollIntervalSeconds *int32 `protobuf:"varint,3,opt,name=poll_interval_seconds,json=pollIntervalSeconds,proto3,oneof" json:"poll_interval_seconds,omitempty"` +} + +func (x *SnapshotResourceThreshold) Reset() { + *x = SnapshotResourceThreshold{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[489] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResourceThreshold) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResourceThreshold) ProtoMessage() {} + +func (x *SnapshotResourceThreshold) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[489] + 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 SnapshotResourceThreshold.ProtoReflect.Descriptor instead. +func (*SnapshotResourceThreshold) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{489} +} + +func (x *SnapshotResourceThreshold) GetCpuPercent() *SnapshotPercentBounds { + if x != nil { + return x.CpuPercent + } + return nil +} + +func (x *SnapshotResourceThreshold) GetMemoryPercent() *SnapshotPercentBounds { + if x != nil { + return x.MemoryPercent + } + return nil +} + +func (x *SnapshotResourceThreshold) GetPollIntervalSeconds() int32 { + if x != nil && x.PollIntervalSeconds != nil { + return *x.PollIntervalSeconds + } + return 0 +} + +// CheckpointSchedule behavior (triggers only — scope lives on the target). +type SnapshotSchedulePolicySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IntervalSeconds *int64 `protobuf:"varint,1,opt,name=interval_seconds,json=intervalSeconds,proto3,oneof" json:"interval_seconds,omitempty"` + ResourceThreshold *SnapshotResourceThreshold `protobuf:"bytes,2,opt,name=resource_threshold,json=resourceThreshold,proto3,oneof" json:"resource_threshold,omitempty"` + // Values: NodeDrain | PodEviction | Preemption (validated server-side; the CRD has no enum). + OnKubernetesEvents []string `protobuf:"bytes,3,rep,name=on_kubernetes_events,json=onKubernetesEvents,proto3" json:"on_kubernetes_events,omitempty"` + OnAnnotation bool `protobuf:"varint,4,opt,name=on_annotation,json=onAnnotation,proto3" json:"on_annotation,omitempty"` +} + +func (x *SnapshotSchedulePolicySpec) Reset() { + *x = SnapshotSchedulePolicySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[490] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotSchedulePolicySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotSchedulePolicySpec) ProtoMessage() {} + +func (x *SnapshotSchedulePolicySpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[490] + 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 SnapshotSchedulePolicySpec.ProtoReflect.Descriptor instead. +func (*SnapshotSchedulePolicySpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{490} +} + +func (x *SnapshotSchedulePolicySpec) GetIntervalSeconds() int64 { + if x != nil && x.IntervalSeconds != nil { + return *x.IntervalSeconds + } + return 0 +} + +func (x *SnapshotSchedulePolicySpec) GetResourceThreshold() *SnapshotResourceThreshold { + if x != nil { + return x.ResourceThreshold + } + return nil +} + +func (x *SnapshotSchedulePolicySpec) GetOnKubernetesEvents() []string { + if x != nil { + return x.OnKubernetesEvents + } + return nil +} + +func (x *SnapshotSchedulePolicySpec) GetOnAnnotation() bool { + if x != nil { + return x.OnAnnotation + } + return false +} + +type SnapshotGlobalRetention struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetainOrphan *bool `protobuf:"varint,1,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpointsPerNamespace *int32 `protobuf:"varint,2,opt,name=max_checkpoints_per_namespace,json=maxCheckpointsPerNamespace,proto3,oneof" json:"max_checkpoints_per_namespace,omitempty"` + MaxCheckpointsPerPod *int32 `protobuf:"varint,3,opt,name=max_checkpoints_per_pod,json=maxCheckpointsPerPod,proto3,oneof" json:"max_checkpoints_per_pod,omitempty"` + MaxCheckpointsPerContainer *int32 `protobuf:"varint,4,opt,name=max_checkpoints_per_container,json=maxCheckpointsPerContainer,proto3,oneof" json:"max_checkpoints_per_container,omitempty"` + // Sizes are integer MB; the compiler renders them as "Mi" quantities. + MaxCheckpointSizeMb *int32 `protobuf:"varint,5,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizePerNamespaceMb *int32 `protobuf:"varint,6,opt,name=max_total_size_per_namespace_mb,json=maxTotalSizePerNamespaceMb,proto3,oneof" json:"max_total_size_per_namespace_mb,omitempty"` + MaxTotalSizePerPodMb *int32 `protobuf:"varint,7,opt,name=max_total_size_per_pod_mb,json=maxTotalSizePerPodMb,proto3,oneof" json:"max_total_size_per_pod_mb,omitempty"` + MaxTotalSizePerContainerMb *int32 `protobuf:"varint,8,opt,name=max_total_size_per_container_mb,json=maxTotalSizePerContainerMb,proto3,oneof" json:"max_total_size_per_container_mb,omitempty"` +} + +func (x *SnapshotGlobalRetention) Reset() { + *x = SnapshotGlobalRetention{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[491] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotGlobalRetention) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotGlobalRetention) ProtoMessage() {} + +func (x *SnapshotGlobalRetention) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[491] + 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 SnapshotGlobalRetention.ProtoReflect.Descriptor instead. +func (*SnapshotGlobalRetention) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{491} +} + +func (x *SnapshotGlobalRetention) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerNamespace() int32 { + if x != nil && x.MaxCheckpointsPerNamespace != nil { + return *x.MaxCheckpointsPerNamespace + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerPod() int32 { + if x != nil && x.MaxCheckpointsPerPod != nil { + return *x.MaxCheckpointsPerPod + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerContainer() int32 { + if x != nil && x.MaxCheckpointsPerContainer != nil { + return *x.MaxCheckpointsPerContainer + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerNamespaceMb() int32 { + if x != nil && x.MaxTotalSizePerNamespaceMb != nil { + return *x.MaxTotalSizePerNamespaceMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerPodMb() int32 { + if x != nil && x.MaxTotalSizePerPodMb != nil { + return *x.MaxTotalSizePerPodMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerContainerMb() int32 { + if x != nil && x.MaxTotalSizePerContainerMb != nil { + return *x.MaxTotalSizePerContainerMb + } + return 0 +} + +type SnapshotContainerRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Pod string `protobuf:"bytes,2,opt,name=pod,proto3" json:"pod,omitempty"` + Container string `protobuf:"bytes,3,opt,name=container,proto3" json:"container,omitempty"` + RetainOrphan *bool `protobuf:"varint,4,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,5,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,6,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,7,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotContainerRetentionPolicy) Reset() { + *x = SnapshotContainerRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[492] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotContainerRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotContainerRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotContainerRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[492] + 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 SnapshotContainerRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotContainerRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{492} +} + +func (x *SnapshotContainerRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetPod() string { + if x != nil { + return x.Pod + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetContainer() string { + if x != nil { + return x.Container + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +type SnapshotPodRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Pod string `protobuf:"bytes,2,opt,name=pod,proto3" json:"pod,omitempty"` + RetainOrphan *bool `protobuf:"varint,3,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,4,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,5,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,6,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotPodRetentionPolicy) Reset() { + *x = SnapshotPodRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[493] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPodRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPodRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotPodRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[493] + 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 SnapshotPodRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotPodRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{493} +} + +func (x *SnapshotPodRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotPodRetentionPolicy) GetPod() string { + if x != nil { + return x.Pod + } + return "" +} + +func (x *SnapshotPodRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotPodRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotPodRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotPodRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +type SnapshotNamespaceRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + RetainOrphan *bool `protobuf:"varint,2,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,3,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,4,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,5,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotNamespaceRetentionPolicy) Reset() { + *x = SnapshotNamespaceRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[494] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotNamespaceRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotNamespaceRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotNamespaceRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[494] + 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 SnapshotNamespaceRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotNamespaceRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{494} +} + +func (x *SnapshotNamespaceRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotNamespaceRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +// CheckpointRestoreOperator behavior (cluster-wide retention/GC config). +type SnapshotRetentionPolicySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CheckpointDirectory string `protobuf:"bytes,1,opt,name=checkpoint_directory,json=checkpointDirectory,proto3" json:"checkpoint_directory,omitempty"` + ApplyPoliciesImmediately bool `protobuf:"varint,2,opt,name=apply_policies_immediately,json=applyPoliciesImmediately,proto3" json:"apply_policies_immediately,omitempty"` + GlobalRetention *SnapshotGlobalRetention `protobuf:"bytes,3,opt,name=global_retention,json=globalRetention,proto3,oneof" json:"global_retention,omitempty"` + ContainerPolicies []*SnapshotContainerRetentionPolicy `protobuf:"bytes,4,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` + PodPolicies []*SnapshotPodRetentionPolicy `protobuf:"bytes,5,rep,name=pod_policies,json=podPolicies,proto3" json:"pod_policies,omitempty"` + NamespacePolicies []*SnapshotNamespaceRetentionPolicy `protobuf:"bytes,6,rep,name=namespace_policies,json=namespacePolicies,proto3" json:"namespace_policies,omitempty"` +} + +func (x *SnapshotRetentionPolicySpec) Reset() { + *x = SnapshotRetentionPolicySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[495] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotRetentionPolicySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotRetentionPolicySpec) ProtoMessage() {} + +func (x *SnapshotRetentionPolicySpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[495] + 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 SnapshotRetentionPolicySpec.ProtoReflect.Descriptor instead. +func (*SnapshotRetentionPolicySpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{495} +} + +func (x *SnapshotRetentionPolicySpec) GetCheckpointDirectory() string { + if x != nil { + return x.CheckpointDirectory + } + return "" +} + +func (x *SnapshotRetentionPolicySpec) GetApplyPoliciesImmediately() bool { + if x != nil { + return x.ApplyPoliciesImmediately + } + return false +} + +func (x *SnapshotRetentionPolicySpec) GetGlobalRetention() *SnapshotGlobalRetention { + if x != nil { + return x.GlobalRetention + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetContainerPolicies() []*SnapshotContainerRetentionPolicy { + if x != nil { + return x.ContainerPolicies + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetPodPolicies() []*SnapshotPodRetentionPolicy { + if x != nil { + return x.PodPolicies + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetNamespacePolicies() []*SnapshotNamespaceRetentionPolicy { + if x != nil { + return x.NamespacePolicies + } + return nil +} + +type SnapshotPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + // Types that are assignable to Spec: + // + // *SnapshotPolicy_Schedule + // *SnapshotPolicy_Retention + Spec isSnapshotPolicy_Spec `protobuf_oneof:"spec"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotPolicy) Reset() { + *x = SnapshotPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[496] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPolicy) ProtoMessage() {} + +func (x *SnapshotPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[496] + 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 SnapshotPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{496} +} + +func (x *SnapshotPolicy) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotPolicy) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SnapshotPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (m *SnapshotPolicy) GetSpec() isSnapshotPolicy_Spec { + if m != nil { + return m.Spec + } + return nil +} + +func (x *SnapshotPolicy) GetSchedule() *SnapshotSchedulePolicySpec { + if x, ok := x.GetSpec().(*SnapshotPolicy_Schedule); ok { + return x.Schedule + } + return nil +} + +func (x *SnapshotPolicy) GetRetention() *SnapshotRetentionPolicySpec { + if x, ok := x.GetSpec().(*SnapshotPolicy_Retention); ok { + return x.Retention + } + return nil +} + +func (x *SnapshotPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type isSnapshotPolicy_Spec interface { + isSnapshotPolicy_Spec() +} + +type SnapshotPolicy_Schedule struct { + Schedule *SnapshotSchedulePolicySpec `protobuf:"bytes,11,opt,name=schedule,proto3,oneof"` +} + +type SnapshotPolicy_Retention struct { + Retention *SnapshotRetentionPolicySpec `protobuf:"bytes,12,opt,name=retention,proto3,oneof"` +} + +func (*SnapshotPolicy_Schedule) isSnapshotPolicy_Spec() {} + +func (*SnapshotPolicy_Retention) isSnapshotPolicy_Spec() {} + +type ForensicSnapshotPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + IntervalSeconds *int64 `protobuf:"varint,11,opt,name=interval_seconds,json=intervalSeconds,proto3,oneof" json:"interval_seconds,omitempty"` + MaxSnapshots *int32 `protobuf:"varint,12,opt,name=max_snapshots,json=maxSnapshots,proto3,oneof" json:"max_snapshots,omitempty"` + MaxDurationSeconds *int64 `protobuf:"varint,13,opt,name=max_duration_seconds,json=maxDurationSeconds,proto3,oneof" json:"max_duration_seconds,omitempty"` + HashAlgorithm string `protobuf:"bytes,14,opt,name=hash_algorithm,json=hashAlgorithm,proto3" json:"hash_algorithm,omitempty"` + PostSnapshotAction ForensicPostSnapshotAction `protobuf:"varint,15,opt,name=post_snapshot_action,json=postSnapshotAction,proto3,enum=api.v1.ForensicPostSnapshotAction" json:"post_snapshot_action,omitempty"` + // Read-only: 0 = never triggered. Mutable only via + // TriggerForensicSnapshotRun. Create rejects non-zero values; Update + // ignores the field entirely (round-tripped entities carry it). + RunGeneration int32 `protobuf:"varint,16,opt,name=run_generation,json=runGeneration,proto3" json:"run_generation,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *ForensicSnapshotPolicy) Reset() { + *x = ForensicSnapshotPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[497] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicSnapshotPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicSnapshotPolicy) ProtoMessage() {} + +func (x *ForensicSnapshotPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[497] + 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 ForensicSnapshotPolicy.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{497} +} + +func (x *ForensicSnapshotPolicy) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetIntervalSeconds() int64 { + if x != nil && x.IntervalSeconds != nil { + return *x.IntervalSeconds + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetMaxSnapshots() int32 { + if x != nil && x.MaxSnapshots != nil { + return *x.MaxSnapshots + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetMaxDurationSeconds() int64 { + if x != nil && x.MaxDurationSeconds != nil { + return *x.MaxDurationSeconds + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetHashAlgorithm() string { + if x != nil { + return x.HashAlgorithm + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetPostSnapshotAction() ForensicPostSnapshotAction { + if x != nil { + return x.PostSnapshotAction + } + return ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED +} + +func (x *ForensicSnapshotPolicy) GetRunGeneration() int32 { + if x != nil { + return x.RunGeneration + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +// Scope shared by both target families. Non-nil criteria combine with AND. +// Empty cluster_ids = NO clusters (deliberately inverted from WorkloadPolicyTarget). +type SnapshotTargetScope struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterIds []string `protobuf:"bytes,1,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + Namespaces []string `protobuf:"bytes,11,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,12,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,13,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + WorkloadSelector *LabelSelector `protobuf:"bytes,14,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,17,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + KindFilter []K8SObjectKind `protobuf:"varint,18,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` + NodeGroupNames []string `protobuf:"bytes,19,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` + // Passed verbatim into the CR's spec.selector; operators restricted to + // In/NotIn/Exists/DoesNotExist (validated server-side). + PodSelector *LabelSelector `protobuf:"bytes,21,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` + ContainerNames []string `protobuf:"bytes,22,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` +} + +func (x *SnapshotTargetScope) Reset() { + *x = SnapshotTargetScope{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[498] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotTargetScope) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotTargetScope) ProtoMessage() {} + +func (x *SnapshotTargetScope) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[498] + 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 SnapshotTargetScope.ProtoReflect.Descriptor instead. +func (*SnapshotTargetScope) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{498} +} + +func (x *SnapshotTargetScope) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespaces() []string { + if x != nil { + return x.Namespaces + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *SnapshotTargetScope) GetWorkloadSelector() *LabelSelector { + if x != nil { + return x.WorkloadSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetAnnotationSelector() *LabelSelector { + if x != nil { + return x.AnnotationSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetWorkloadNames() []string { + if x != nil { + return x.WorkloadNames + } + return nil +} + +func (x *SnapshotTargetScope) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *SnapshotTargetScope) GetKindFilter() []K8SObjectKind { + if x != nil { + return x.KindFilter + } + return nil +} + +func (x *SnapshotTargetScope) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *SnapshotTargetScope) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +// NOTE: the spec's target-level runtime `status` field (§8) is deliberately +// absent — phase 6 (status ingestion) adds it as a backward-compatible field +// at tag 120, mirroring NodePolicyTarget.status. +type SnapshotPolicyTarget struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,11,opt,name=scope,proto3" json:"scope,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Ingested runtime status of the target's compiled CRs (spec §8). + // Populated by ListSnapshotPolicyTargets; unset when nothing ingested. + Status *SnapshotPolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SnapshotPolicyTarget) Reset() { + *x = SnapshotPolicyTarget{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[499] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPolicyTarget) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPolicyTarget) ProtoMessage() {} + +func (x *SnapshotPolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[499] + 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 SnapshotPolicyTarget.ProtoReflect.Descriptor instead. +func (*SnapshotPolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{499} +} + +func (x *SnapshotPolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotPolicyTarget) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SnapshotPolicyTarget) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *SnapshotPolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *SnapshotPolicyTarget) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *SnapshotPolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotPolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *SnapshotPolicyTarget) GetStatus() *SnapshotPolicyTargetStatus { + if x != nil { + return x.Status + } + return nil +} + +type ForensicSnapshotPolicyTarget struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,11,opt,name=scope,proto3" json:"scope,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Ingested runtime status of the target's compiled chain CRs (spec §8). + Status *SnapshotPolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *ForensicSnapshotPolicyTarget) Reset() { + *x = ForensicSnapshotPolicyTarget{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[500] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicSnapshotPolicyTarget) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicSnapshotPolicyTarget) ProtoMessage() {} + +func (x *ForensicSnapshotPolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[500] + 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 ForensicSnapshotPolicyTarget.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotPolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{500} +} + +func (x *ForensicSnapshotPolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *ForensicSnapshotPolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ForensicSnapshotPolicyTarget) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetStatus() *SnapshotPolicyTargetStatus { + if x != nil { + return x.Status + } + return nil +} + +// ---- CRUD: snapshot policies ---- +type CreateSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*SnapshotPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` // policy_id/timestamps ignored +} + +func (x *CreateSnapshotPoliciesRequest) Reset() { + *x = CreateSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[501] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *CreateSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[501] + 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 CreateSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{501} +} + +func (x *CreateSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSnapshotPoliciesRequest) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type CreateSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateSnapshotPoliciesResponse) Reset() { + *x = CreateSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[502] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *CreateSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[502] + 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 CreateSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{502} +} + +func (x *CreateSnapshotPoliciesResponse) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type ListSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListSnapshotPoliciesRequest) Reset() { + *x = ListSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[503] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *ListSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[503] + 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 ListSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{503} +} + +func (x *ListSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSnapshotPoliciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListSnapshotPoliciesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListSnapshotPoliciesResponse) Reset() { + *x = ListSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[504] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *ListSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[504] + 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 ListSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{504} +} + +func (x *ListSnapshotPoliciesResponse) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *ListSnapshotPoliciesResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *SnapshotPolicy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSnapshotPolicyRequest) Reset() { + *x = UpdateSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[505] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyRequest) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[505] + 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 UpdateSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{505} +} + +func (x *UpdateSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSnapshotPolicyRequest) GetPolicy() *SnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SnapshotPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSnapshotPolicyResponse) Reset() { + *x = UpdateSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[506] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyResponse) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[506] + 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 UpdateSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{506} +} + +func (x *UpdateSnapshotPolicyResponse) GetPolicy() *SnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *DeleteSnapshotPolicyRequest) Reset() { + *x = DeleteSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[507] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyRequest) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[507] + 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 DeleteSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{507} +} + +func (x *DeleteSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSnapshotPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteSnapshotPolicyResponse) Reset() { + *x = DeleteSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[508] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyResponse) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[508] + 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 DeleteSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{508} +} + +func (x *DeleteSnapshotPolicyResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- CRUD: snapshot policy targets ---- +type CreateSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Targets []*SnapshotPolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` // target_id/timestamps ignored +} + +func (x *CreateSnapshotPolicyTargetsRequest) Reset() { + *x = CreateSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[509] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *CreateSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[509] + 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 CreateSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{509} +} + +func (x *CreateSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSnapshotPolicyTargetsRequest) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type CreateSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*SnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateSnapshotPolicyTargetsResponse) Reset() { + *x = CreateSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[510] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *CreateSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[510] + 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 CreateSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{510} +} + +func (x *CreateSnapshotPolicyTargetsResponse) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type ListSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListSnapshotPolicyTargetsRequest) Reset() { + *x = ListSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[511] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *ListSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[511] + 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 ListSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{511} +} + +func (x *ListSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSnapshotPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *ListSnapshotPolicyTargetsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListSnapshotPolicyTargetsRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*SnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListSnapshotPolicyTargetsResponse) Reset() { + *x = ListSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[512] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *ListSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[512] + 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 ListSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{512} +} + +func (x *ListSnapshotPolicyTargetsResponse) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +func (x *ListSnapshotPolicyTargetsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Target *SnapshotPolicyTarget `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateSnapshotPolicyTargetRequest) Reset() { + *x = UpdateSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[513] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[513] + 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 UpdateSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{513} +} + +func (x *UpdateSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSnapshotPolicyTargetRequest) GetTarget() *SnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *SnapshotPolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateSnapshotPolicyTargetResponse) Reset() { + *x = UpdateSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[514] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[514] + 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 UpdateSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{514} +} + +func (x *UpdateSnapshotPolicyTargetResponse) GetTarget() *SnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type DeleteSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TargetIds []string `protobuf:"bytes,2,rep,name=target_ids,json=targetIds,proto3" json:"target_ids,omitempty"` +} + +func (x *DeleteSnapshotPolicyTargetRequest) Reset() { + *x = DeleteSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[515] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[515] + 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 DeleteSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{515} +} + +func (x *DeleteSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSnapshotPolicyTargetRequest) GetTargetIds() []string { + if x != nil { + return x.TargetIds + } + return nil +} + +type DeleteSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteSnapshotPolicyTargetResponse) Reset() { + *x = DeleteSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[516] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[516] + 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 DeleteSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{516} +} + +func (x *DeleteSnapshotPolicyTargetResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- CRUD: forensic snapshot policies + targets (mirrors above) ---- +type CreateForensicSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateForensicSnapshotPoliciesRequest) Reset() { + *x = CreateForensicSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[517] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *CreateForensicSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[517] + 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 CreateForensicSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{517} +} + +func (x *CreateForensicSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateForensicSnapshotPoliciesRequest) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type CreateForensicSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateForensicSnapshotPoliciesResponse) Reset() { + *x = CreateForensicSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[518] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *CreateForensicSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[518] + 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 CreateForensicSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{518} +} + +func (x *CreateForensicSnapshotPoliciesResponse) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type ListForensicSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListForensicSnapshotPoliciesRequest) Reset() { + *x = ListForensicSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[519] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *ListForensicSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[519] + 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 ListForensicSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{519} +} + +func (x *ListForensicSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListForensicSnapshotPoliciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListForensicSnapshotPoliciesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListForensicSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListForensicSnapshotPoliciesResponse) Reset() { + *x = ListForensicSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[520] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *ListForensicSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[520] + 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 ListForensicSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{520} +} + +func (x *ListForensicSnapshotPoliciesResponse) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *ListForensicSnapshotPoliciesResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateForensicSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *ForensicSnapshotPolicy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyRequest) Reset() { + *x = UpdateForensicSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[521] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyRequest) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[521] + 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 UpdateForensicSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{521} +} + +func (x *UpdateForensicSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateForensicSnapshotPolicyRequest) GetPolicy() *ForensicSnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateForensicSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *ForensicSnapshotPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyResponse) Reset() { + *x = UpdateForensicSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[522] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyResponse) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[522] + 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 UpdateForensicSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{522} +} + +func (x *UpdateForensicSnapshotPolicyResponse) GetPolicy() *ForensicSnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteForensicSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyRequest) Reset() { + *x = DeleteForensicSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[523] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyRequest) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[523] + 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 DeleteForensicSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{523} +} + +func (x *DeleteForensicSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteForensicSnapshotPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteForensicSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyResponse) Reset() { + *x = DeleteForensicSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[524] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyResponse) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[524] + 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 DeleteForensicSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{524} +} + +func (x *DeleteForensicSnapshotPolicyResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +type CreateForensicSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) Reset() { + *x = CreateForensicSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[525] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[525] + 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 CreateForensicSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{525} +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type CreateForensicSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) Reset() { + *x = CreateForensicSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[526] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[526] + 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 CreateForensicSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{526} +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type ListForensicSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) Reset() { + *x = ListForensicSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[527] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *ListForensicSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[527] + 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 ListForensicSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{527} +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListForensicSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) Reset() { + *x = ListForensicSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[528] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *ListForensicSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[528] + 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 ListForensicSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{528} +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateForensicSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Target *ForensicSnapshotPolicyTarget `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) Reset() { + *x = UpdateForensicSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[529] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[529] + 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 UpdateForensicSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{529} +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) GetTarget() *ForensicSnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateForensicSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *ForensicSnapshotPolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) Reset() { + *x = UpdateForensicSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[530] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[530] + 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 UpdateForensicSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{530} +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) GetTarget() *ForensicSnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type DeleteForensicSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TargetIds []string `protobuf:"bytes,2,rep,name=target_ids,json=targetIds,proto3" json:"target_ids,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) Reset() { + *x = DeleteForensicSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[531] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[531] + 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 DeleteForensicSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{531} +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) GetTargetIds() []string { + if x != nil { + return x.TargetIds + } + return nil +} + +type DeleteForensicSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) Reset() { + *x = DeleteForensicSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[532] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[532] + 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 DeleteForensicSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{532} +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- Forensic run trigger ---- +type TriggerForensicSnapshotRunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *TriggerForensicSnapshotRunRequest) Reset() { + *x = TriggerForensicSnapshotRunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[533] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TriggerForensicSnapshotRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TriggerForensicSnapshotRunRequest) ProtoMessage() {} + +func (x *TriggerForensicSnapshotRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[533] + 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 TriggerForensicSnapshotRunRequest.ProtoReflect.Descriptor instead. +func (*TriggerForensicSnapshotRunRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{533} +} + +func (x *TriggerForensicSnapshotRunRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *TriggerForensicSnapshotRunRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type TriggerForensicSnapshotRunResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunGeneration int32 `protobuf:"varint,1,opt,name=run_generation,json=runGeneration,proto3" json:"run_generation,omitempty"` +} + +func (x *TriggerForensicSnapshotRunResponse) Reset() { + *x = TriggerForensicSnapshotRunResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[534] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TriggerForensicSnapshotRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TriggerForensicSnapshotRunResponse) ProtoMessage() {} + +func (x *TriggerForensicSnapshotRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[534] + 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 TriggerForensicSnapshotRunResponse.ProtoReflect.Descriptor instead. +func (*TriggerForensicSnapshotRunResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{534} +} + +func (x *TriggerForensicSnapshotRunResponse) GetRunGeneration() int32 { + if x != nil { + return x.RunGeneration + } + return 0 +} + +// ---- Targeting preview (shared resolver, spec §6) ---- +type SnapshotResolvedWorkload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind K8SObjectKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` + PodSelector *LabelSelector `protobuf:"bytes,4,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` // from the workload's pod template + // Summed container resource requests + replicas from the workload spec, + // for the preview's workload table. Zero when the kind has no typed spec + // (Pod, CRDs) or the field is absent (DaemonSet/Job have no replica count). + Replicas int32 `protobuf:"varint,5,opt,name=replicas,proto3" json:"replicas,omitempty"` + CpuRequestMillicores int64 `protobuf:"varint,6,opt,name=cpu_request_millicores,json=cpuRequestMillicores,proto3" json:"cpu_request_millicores,omitempty"` + MemoryRequestBytes int64 `protobuf:"varint,7,opt,name=memory_request_bytes,json=memoryRequestBytes,proto3" json:"memory_request_bytes,omitempty"` +} + +func (x *SnapshotResolvedWorkload) Reset() { + *x = SnapshotResolvedWorkload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[535] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResolvedWorkload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResolvedWorkload) ProtoMessage() {} + +func (x *SnapshotResolvedWorkload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[535] + 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 SnapshotResolvedWorkload.ProtoReflect.Descriptor instead. +func (*SnapshotResolvedWorkload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{535} +} + +func (x *SnapshotResolvedWorkload) GetKind() K8SObjectKind { + if x != nil { + return x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +func (x *SnapshotResolvedWorkload) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotResolvedWorkload) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *SnapshotResolvedWorkload) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotResolvedWorkload) GetReplicas() int32 { + if x != nil { + return x.Replicas + } + return 0 +} + +func (x *SnapshotResolvedWorkload) GetCpuRequestMillicores() int64 { + if x != nil { + return x.CpuRequestMillicores + } + return 0 +} + +func (x *SnapshotResolvedWorkload) GetMemoryRequestBytes() int64 { + if x != nil { + return x.MemoryRequestBytes + } + return 0 +} + +type SnapshotResolvedNamespace struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + // Present only when workload-scope criteria were used; empty for + // pod_selector-passthrough targets. + Workloads []*SnapshotResolvedWorkload `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` + PodSelectorPassthrough bool `protobuf:"varint,3,opt,name=pod_selector_passthrough,json=podSelectorPassthrough,proto3" json:"pod_selector_passthrough,omitempty"` +} + +func (x *SnapshotResolvedNamespace) Reset() { + *x = SnapshotResolvedNamespace{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[536] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResolvedNamespace) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResolvedNamespace) ProtoMessage() {} + +func (x *SnapshotResolvedNamespace) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[536] + 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 SnapshotResolvedNamespace.ProtoReflect.Descriptor instead. +func (*SnapshotResolvedNamespace) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{536} +} + +func (x *SnapshotResolvedNamespace) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotResolvedNamespace) GetWorkloads() []*SnapshotResolvedWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *SnapshotResolvedNamespace) GetPodSelectorPassthrough() bool { + if x != nil { + return x.PodSelectorPassthrough + } + return false +} + +type SnapshotClusterScopePreview struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespaces []*SnapshotResolvedNamespace `protobuf:"bytes,2,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + Truncated bool `protobuf:"varint,3,opt,name=truncated,proto3" json:"truncated,omitempty"` // fan-out cap hit (spec §6) + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` // per-cluster resolution error (cluster missing, etc.) +} + +func (x *SnapshotClusterScopePreview) Reset() { + *x = SnapshotClusterScopePreview{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[537] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotClusterScopePreview) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotClusterScopePreview) ProtoMessage() {} + +func (x *SnapshotClusterScopePreview) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[537] + 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 SnapshotClusterScopePreview.ProtoReflect.Descriptor instead. +func (*SnapshotClusterScopePreview) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{537} +} + +func (x *SnapshotClusterScopePreview) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotClusterScopePreview) GetNamespaces() []*SnapshotResolvedNamespace { + if x != nil { + return x.Namespaces + } + return nil +} + +func (x *SnapshotClusterScopePreview) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +func (x *SnapshotClusterScopePreview) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type PreviewSnapshotPolicyTargetMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"` // unsaved target scope +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) Reset() { + *x = PreviewSnapshotPolicyTargetMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[538] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotPolicyTargetMatchesRequest) ProtoMessage() {} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[538] + 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 PreviewSnapshotPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{538} +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +type PreviewSnapshotPolicyTargetMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*SnapshotClusterScopePreview `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) Reset() { + *x = PreviewSnapshotPolicyTargetMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[539] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotPolicyTargetMatchesResponse) ProtoMessage() {} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[539] + 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 PreviewSnapshotPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{539} +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) GetClusters() []*SnapshotClusterScopePreview { + if x != nil { + return x.Clusters + } + return nil +} + +type ForensicTargetOverlap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadUids []string `protobuf:"bytes,5,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` +} + +func (x *ForensicTargetOverlap) Reset() { + *x = ForensicTargetOverlap{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[540] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicTargetOverlap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicTargetOverlap) ProtoMessage() {} + +func (x *ForensicTargetOverlap) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[540] + 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 ForensicTargetOverlap.ProtoReflect.Descriptor instead. +func (*ForensicTargetOverlap) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{540} +} + +func (x *ForensicTargetOverlap) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *ForensicTargetOverlap) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicTargetOverlap) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ForensicTargetOverlap) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ForensicTargetOverlap) GetWorkloadUids() []string { + if x != nil { + return x.WorkloadUids + } + return nil +} + +type PreviewForensicSnapshotPolicyTargetMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"` + // When previewing edits to an existing target, set this to its id so the + // target's persisted copy is not reported as overlapping itself. + ExcludeTargetId *string `protobuf:"bytes,3,opt,name=exclude_target_id,json=excludeTargetId,proto3,oneof" json:"exclude_target_id,omitempty"` +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) Reset() { + *x = PreviewForensicSnapshotPolicyTargetMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[541] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotPolicyTargetMatchesRequest) ProtoMessage() {} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[541] + 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 PreviewForensicSnapshotPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{541} +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetExcludeTargetId() string { + if x != nil && x.ExcludeTargetId != nil { + return *x.ExcludeTargetId + } + return "" +} + +type PreviewForensicSnapshotPolicyTargetMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*SnapshotClusterScopePreview `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` + // Enabled forensic targets whose rendered workloads intersect this scope + // (overlapping forensic captures race on DeletePod — spec §2). Computed + // against the rendered-scope read model, so overlaps reflect each + // target's matches as of its LAST RENDER (up to one render interval + // stale), not a live re-resolution. + Overlaps []*ForensicTargetOverlap `protobuf:"bytes,2,rep,name=overlaps,proto3" json:"overlaps,omitempty"` +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) Reset() { + *x = PreviewForensicSnapshotPolicyTargetMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[542] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotPolicyTargetMatchesResponse) ProtoMessage() {} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[542] + 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 PreviewForensicSnapshotPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{542} +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) GetClusters() []*SnapshotClusterScopePreview { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) GetOverlaps() []*ForensicTargetOverlap { + if x != nil { + return x.Overlaps + } + return nil +} + +// ---- Rendered scope (read model, spec §3.5) ---- +type SnapshotRenderedScopeRow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TargetId string `protobuf:"bytes,3,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodSelector *LabelSelector `protobuf:"bytes,5,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` + ContainerNames []string `protobuf:"bytes,6,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` + WorkloadCount int32 `protobuf:"varint,7,opt,name=workload_count,json=workloadCount,proto3" json:"workload_count,omitempty"` + Workloads []*SnapshotResolvedWorkload `protobuf:"bytes,8,rep,name=workloads,proto3" json:"workloads,omitempty"` + ConfigId string `protobuf:"bytes,9,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + RunGeneration *int32 `protobuf:"varint,10,opt,name=run_generation,json=runGeneration,proto3,oneof" json:"run_generation,omitempty"` // forensic only + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotRenderedScopeRow) Reset() { + *x = SnapshotRenderedScopeRow{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[543] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotRenderedScopeRow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotRenderedScopeRow) ProtoMessage() {} + +func (x *SnapshotRenderedScopeRow) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[543] + 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 SnapshotRenderedScopeRow.ProtoReflect.Descriptor instead. +func (*SnapshotRenderedScopeRow) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{543} +} + +func (x *SnapshotRenderedScopeRow) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetWorkloadCount() int32 { + if x != nil { + return x.WorkloadCount + } + return 0 +} + +func (x *SnapshotRenderedScopeRow) GetWorkloads() []*SnapshotResolvedWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetRunGeneration() int32 { + if x != nil && x.RunGeneration != nil { + return *x.RunGeneration + } + return 0 +} + +func (x *SnapshotRenderedScopeRow) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type GetSnapshotPolicyTargetRenderedScopeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Types that are assignable to By: + // + // *GetSnapshotPolicyTargetRenderedScopeRequest_TargetId + // *GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId + By isGetSnapshotPolicyTargetRenderedScopeRequest_By `protobuf_oneof:"by"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) Reset() { + *x = GetSnapshotPolicyTargetRenderedScopeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[544] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest) ProtoMessage() {} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[544] + 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 GetSnapshotPolicyTargetRenderedScopeRequest.ProtoReflect.Descriptor instead. +func (*GetSnapshotPolicyTargetRenderedScopeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{544} +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (m *GetSnapshotPolicyTargetRenderedScopeRequest) GetBy() isGetSnapshotPolicyTargetRenderedScopeRequest_By { + if m != nil { + return m.By + } + return nil +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetTargetId() string { + if x, ok := x.GetBy().(*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId); ok { + return x.TargetId + } + return "" +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetPolicyId() string { + if x, ok := x.GetBy().(*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId); ok { + return x.PolicyId + } + return "" +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type isGetSnapshotPolicyTargetRenderedScopeRequest_By interface { + isGetSnapshotPolicyTargetRenderedScopeRequest_By() +} + +type GetSnapshotPolicyTargetRenderedScopeRequest_TargetId struct { + TargetId string `protobuf:"bytes,2,opt,name=target_id,json=targetId,proto3,oneof"` +} + +type GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId struct { + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3,oneof"` +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId) isGetSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId) isGetSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +type GetSnapshotPolicyTargetRenderedScopeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rows []*SnapshotRenderedScopeRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) Reset() { + *x = GetSnapshotPolicyTargetRenderedScopeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[545] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotPolicyTargetRenderedScopeResponse) ProtoMessage() {} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[545] + 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 GetSnapshotPolicyTargetRenderedScopeResponse.ProtoReflect.Descriptor instead. +func (*GetSnapshotPolicyTargetRenderedScopeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{545} +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) GetRows() []*SnapshotRenderedScopeRow { + if x != nil { + return x.Rows + } + return nil +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Types that are assignable to By: + // + // *GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId + // *GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId + By isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By `protobuf_oneof:"by"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) Reset() { + *x = GetForensicSnapshotPolicyTargetRenderedScopeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[546] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest) ProtoMessage() {} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[546] + 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 GetForensicSnapshotPolicyTargetRenderedScopeRequest.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{546} +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (m *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetBy() isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By { + if m != nil { + return m.By + } + return nil +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetTargetId() string { + if x, ok := x.GetBy().(*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId); ok { + return x.TargetId + } + return "" +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetPolicyId() string { + if x, ok := x.GetBy().(*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId); ok { + return x.PolicyId + } + return "" +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By interface { + isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId struct { + TargetId string `protobuf:"bytes,2,opt,name=target_id,json=targetId,proto3,oneof"` +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId struct { + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3,oneof"` +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId) isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId) isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +type GetForensicSnapshotPolicyTargetRenderedScopeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rows []*SnapshotRenderedScopeRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) Reset() { + *x = GetForensicSnapshotPolicyTargetRenderedScopeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[547] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeResponse) ProtoMessage() {} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[547] + 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 GetForensicSnapshotPolicyTargetRenderedScopeResponse.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotPolicyTargetRenderedScopeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{547} +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) GetRows() []*SnapshotRenderedScopeRow { + if x != nil { + return x.Rows + } + return nil +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +// ---- Delivery status (apply layer now; runtime status added in phase 6) ---- +type SnapshotConfigInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // pending | applied | failed + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + RunGeneration *int32 `protobuf:"varint,6,opt,name=run_generation,json=runGeneration,proto3,oneof" json:"run_generation,omitempty"` // forensic only + TriggeredBy string `protobuf:"bytes,7,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"` // forensic only + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotConfigInfo) Reset() { + *x = SnapshotConfigInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[548] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotConfigInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotConfigInfo) ProtoMessage() {} + +func (x *SnapshotConfigInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[548] + 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 SnapshotConfigInfo.ProtoReflect.Descriptor instead. +func (*SnapshotConfigInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{548} +} + +func (x *SnapshotConfigInfo) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotConfigInfo) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotConfigInfo) GetContentHash() string { + if x != nil { + return x.ContentHash + } + return "" +} + +func (x *SnapshotConfigInfo) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *SnapshotConfigInfo) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *SnapshotConfigInfo) GetRunGeneration() int32 { + if x != nil && x.RunGeneration != nil { + return *x.RunGeneration + } + return 0 +} + +func (x *SnapshotConfigInfo) GetTriggeredBy() string { + if x != nil { + return x.TriggeredBy + } + return "" +} + +func (x *SnapshotConfigInfo) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotConfigInfo) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type SnapshotConfigApplyEventInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventId string `protobuf:"bytes,1,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + ConfigId string `protobuf:"bytes,2,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` +} + +func (x *SnapshotConfigApplyEventInfo) Reset() { + *x = SnapshotConfigApplyEventInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[549] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotConfigApplyEventInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotConfigApplyEventInfo) ProtoMessage() {} + +func (x *SnapshotConfigApplyEventInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[549] + 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 SnapshotConfigApplyEventInfo.ProtoReflect.Descriptor instead. +func (*SnapshotConfigApplyEventInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{549} +} + +func (x *SnapshotConfigApplyEventInfo) GetEventId() string { + if x != nil { + return x.EventId + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + +func (x *SnapshotConfigApplyEventInfo) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +type GetSnapshotRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + EventLimit int32 `protobuf:"varint,3,opt,name=event_limit,json=eventLimit,proto3" json:"event_limit,omitempty"` // default 20 +} + +func (x *GetSnapshotRecommendationStatusRequest) Reset() { + *x = GetSnapshotRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[550] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetSnapshotRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[550] + 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 GetSnapshotRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetSnapshotRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{550} +} + +func (x *GetSnapshotRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetSnapshotRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetSnapshotRecommendationStatusRequest) GetEventLimit() int32 { + if x != nil { + return x.EventLimit + } + return 0 +} + +type GetSnapshotRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *SnapshotConfigInfo `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3,oneof" json:"current_config,omitempty"` + Events []*SnapshotConfigApplyEventInfo `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"` + // Ingested runtime status of the cluster's resilience-family CRs. + Runtime []*SnapshotCRRuntimeStatus `protobuf:"bytes,3,rep,name=runtime,proto3" json:"runtime,omitempty"` + Prereqs *SnapshotPrereqs `protobuf:"bytes,4,opt,name=prereqs,proto3" json:"prereqs,omitempty"` +} + +func (x *GetSnapshotRecommendationStatusResponse) Reset() { + *x = GetSnapshotRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[551] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetSnapshotRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[551] + 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 GetSnapshotRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetSnapshotRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{551} +} + +func (x *GetSnapshotRecommendationStatusResponse) GetCurrentConfig() *SnapshotConfigInfo { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetEvents() []*SnapshotConfigApplyEventInfo { + if x != nil { + return x.Events + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetRuntime() []*SnapshotCRRuntimeStatus { + if x != nil { + return x.Runtime + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetPrereqs() *SnapshotPrereqs { + if x != nil { + return x.Prereqs + } + return nil +} + +type GetForensicSnapshotRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + EventLimit int32 `protobuf:"varint,3,opt,name=event_limit,json=eventLimit,proto3" json:"event_limit,omitempty"` +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) Reset() { + *x = GetForensicSnapshotRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[552] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetForensicSnapshotRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[552] + 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 GetForensicSnapshotRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{552} +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetEventLimit() int32 { + if x != nil { + return x.EventLimit + } + return 0 +} + +type GetForensicSnapshotRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *SnapshotConfigInfo `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3,oneof" json:"current_config,omitempty"` + Events []*SnapshotConfigApplyEventInfo `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"` + // Ingested runtime status of the cluster's ForensicSnapshotChain CRs. + Runtime []*SnapshotCRRuntimeStatus `protobuf:"bytes,3,rep,name=runtime,proto3" json:"runtime,omitempty"` +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) Reset() { + *x = GetForensicSnapshotRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[553] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetForensicSnapshotRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[553] + 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 GetForensicSnapshotRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{553} +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetCurrentConfig() *SnapshotConfigInfo { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetEvents() []*SnapshotConfigApplyEventInfo { + if x != nil { + return x.Events + } + return nil +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetRuntime() []*SnapshotCRRuntimeStatus { + if x != nil { + return x.Runtime + } + return nil +} + +// ---- Compiled-config preview (implemented in phase 3; Unimplemented now) ---- +type PreviewSnapshotRecommendationConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *PreviewSnapshotRecommendationConfigRequest) Reset() { + *x = PreviewSnapshotRecommendationConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[554] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotRecommendationConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotRecommendationConfigRequest) ProtoMessage() {} + +func (x *PreviewSnapshotRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[554] + 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 PreviewSnapshotRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{554} +} + +func (x *PreviewSnapshotRecommendationConfigRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSnapshotRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type PreviewSnapshotRecommendationConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Yaml string `protobuf:"bytes,1,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *PreviewSnapshotRecommendationConfigResponse) Reset() { + *x = PreviewSnapshotRecommendationConfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[555] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotRecommendationConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotRecommendationConfigResponse) ProtoMessage() {} + +func (x *PreviewSnapshotRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[555] + 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 PreviewSnapshotRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{555} +} + +func (x *PreviewSnapshotRecommendationConfigResponse) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +type PreviewForensicSnapshotRecommendationConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) Reset() { + *x = PreviewForensicSnapshotRecommendationConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[556] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotRecommendationConfigRequest) ProtoMessage() {} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[556] + 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 PreviewForensicSnapshotRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{556} +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type PreviewForensicSnapshotRecommendationConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Yaml string `protobuf:"bytes,1,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) Reset() { + *x = PreviewForensicSnapshotRecommendationConfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[557] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotRecommendationConfigResponse) ProtoMessage() {} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[557] + 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 PreviewForensicSnapshotRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{557} +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +// ---- KEDA shared authentication ---- +type ListReferencedAuthenticationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *ListReferencedAuthenticationsRequest) Reset() { + *x = ListReferencedAuthenticationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[558] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListReferencedAuthenticationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReferencedAuthenticationsRequest) ProtoMessage() {} + +func (x *ListReferencedAuthenticationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[558] + 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 ListReferencedAuthenticationsRequest.ProtoReflect.Descriptor instead. +func (*ListReferencedAuthenticationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{558} +} + +func (x *ListReferencedAuthenticationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListReferencedAuthenticationsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ReferencedAuthentication is a distinct KEDA authenticationRef observed +// across a cluster's active WorkloadRules. +// It carries no credential or secret data. +type ReferencedAuthentication struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // kind is either TriggerAuthentication or ClusterTriggerAuthentication. + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + // used_by_count is the number of active WorkloadRules that reference this auth object. + UsedByCount int64 `protobuf:"varint,3,opt,name=used_by_count,json=usedByCount,proto3" json:"used_by_count,omitempty"` + // namespaces lists the namespaces of the referencing WorkloadRules. + Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` +} + +func (x *ReferencedAuthentication) Reset() { + *x = ReferencedAuthentication{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[559] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReferencedAuthentication) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReferencedAuthentication) ProtoMessage() {} + +func (x *ReferencedAuthentication) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[559] + 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 ReferencedAuthentication.ProtoReflect.Descriptor instead. +func (*ReferencedAuthentication) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{559} +} + +func (x *ReferencedAuthentication) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ReferencedAuthentication) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ReferencedAuthentication) GetUsedByCount() int64 { + if x != nil { + return x.UsedByCount + } + return 0 +} + +func (x *ReferencedAuthentication) GetNamespaces() []string { + if x != nil { + return x.Namespaces + } + return nil +} + +type ListReferencedAuthenticationsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Authentications []*ReferencedAuthentication `protobuf:"bytes,1,rep,name=authentications,proto3" json:"authentications,omitempty"` +} + +func (x *ListReferencedAuthenticationsResponse) Reset() { + *x = ListReferencedAuthenticationsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[560] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListReferencedAuthenticationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReferencedAuthenticationsResponse) ProtoMessage() {} + +func (x *ListReferencedAuthenticationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[560] + 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 ListReferencedAuthenticationsResponse.ProtoReflect.Descriptor instead. +func (*ListReferencedAuthenticationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{560} +} + +func (x *ListReferencedAuthenticationsResponse) GetAuthentications() []*ReferencedAuthentication { + if x != nil { + return x.Authentications + } + return nil +} + +type SchedulerEnrollmentReport_Observation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // pre-mutation scheduler observed at first application; "" = field + // was unset in the workload spec + OriginalSchedulerName string `protobuf:"bytes,5,opt,name=original_scheduler_name,json=originalSchedulerName,proto3" json:"original_scheduler_name,omitempty"` +} + +func (x *SchedulerEnrollmentReport_Observation) Reset() { + *x = SchedulerEnrollmentReport_Observation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[597] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerEnrollmentReport_Observation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerEnrollmentReport_Observation) ProtoMessage() {} + +func (x *SchedulerEnrollmentReport_Observation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[597] + 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 SchedulerEnrollmentReport_Observation.ProtoReflect.Descriptor instead. +func (*SchedulerEnrollmentReport_Observation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{428, 0} +} + +func (x *SchedulerEnrollmentReport_Observation) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetOriginalSchedulerName() string { + if x != nil { + return x.OriginalSchedulerName + } + return "" +} + +type SchedulerRevertEventReport_Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodName string `protobuf:"bytes,2,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + // Owning controller identity when resolvable from ownerRefs at + // admission time; empty for bare pods. + WorkloadKind string `protobuf:"bytes,3,opt,name=workload_kind,json=workloadKind,proto3" json:"workload_kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + // scheduler-policy id annotation value if the pod carried one. + PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + FromScheduler string `protobuf:"bytes,6,opt,name=from_scheduler,json=fromScheduler,proto3" json:"from_scheduler,omitempty"` + ToScheduler string `protobuf:"bytes,7,opt,name=to_scheduler,json=toScheduler,proto3" json:"to_scheduler,omitempty"` + // Why the scheduler was considered unhealthy at revert time. + Reason SchedulerUnhealthyReason `protobuf:"varint,8,opt,name=reason,proto3,enum=api.v1.SchedulerUnhealthyReason" json:"reason,omitempty"` + OccurredAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=occurred_at,json=occurredAt,proto3" json:"occurred_at,omitempty"` +} + +func (x *SchedulerRevertEventReport_Event) Reset() { + *x = SchedulerRevertEventReport_Event{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[598] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertEventReport_Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertEventReport_Event) ProtoMessage() {} + +func (x *SchedulerRevertEventReport_Event) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[598] + 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 SchedulerRevertEventReport_Event.ProtoReflect.Descriptor instead. +func (*SchedulerRevertEventReport_Event) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{429, 0} +} + +func (x *SchedulerRevertEventReport_Event) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetPodName() string { + if x != nil { + return x.PodName + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetWorkloadKind() string { + if x != nil { + return x.WorkloadKind + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetFromScheduler() string { + if x != nil { + return x.FromScheduler + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetToScheduler() string { + if x != nil { + return x.ToScheduler + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetReason() SchedulerUnhealthyReason { + if x != nil { + return x.Reason + } + return SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED +} + +func (x *SchedulerRevertEventReport_Event) GetOccurredAt() *timestamppb.Timestamp { + if x != nil { + return x.OccurredAt + } + return nil +} + +var File_api_v1_recommendation_proto protoreflect.FileDescriptor + +var file_api_v1_recommendation_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, + 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x38, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xfc, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xae, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x99, 0x02, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x71, 0x0a, + 0x25, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x92, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x89, 0x03, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x97, 0x03, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, + 0x5f, 0x70, 0x39, 0x35, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x39, + 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x35, 0x12, 0x41, 0x0a, 0x1f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, 0x66, + 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x27, 0x0a, + 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, + 0x39, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x39, 0x12, 0x41, 0x0a, 0x1f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x27, + 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x2a, 0x0a, 0x11, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, + 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x89, 0x03, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, + 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x5c, 0x0a, + 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x03, 0x72, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x72, 0x65, 0x63, 0x22, 0xc4, 0x02, 0x0a, 0x28, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, + 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, + 0x62, 0x61, 0x63, 0x6b, 0x52, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x29, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xca, 0x03, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x25, 0x47, 0x65, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x43, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, - 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x22, 0xe7, 0x03, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, + 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, + 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x29, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x97, 0x01, 0x0a, 0x28, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x22, 0x45, 0x0a, 0x29, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x81, 0x02, 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, + 0x5a, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2d, 0x0a, 0x0c, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xea, 0x05, 0x0a, 0x2a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x50, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, @@ -28297,58 +45351,77 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, - 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, + 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x02, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, + 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, + 0x0a, 0x17, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5f, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x69, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0x45, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, - 0xe7, 0x03, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x70, 0x0a, 0x2b, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x87, 0x06, 0x0a, 0x2a, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x50, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, @@ -28358,685 +45431,534 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x97, 0x01, 0x0a, - 0x28, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x22, 0x45, 0x0a, 0x29, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, + 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, + 0x07, 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, + 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, + 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x81, 0x02, - 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, - 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x7c, 0x0a, - 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5a, 0x0a, 0x16, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2d, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xea, 0x05, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, - 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, - 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, - 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, - 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, - 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, - 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x5f, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x22, 0x69, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x45, 0x0a, - 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x22, 0x70, 0x0a, 0x2b, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0x62, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x87, 0x06, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x12, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, - 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, - 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, 0x6d, 0x69, 0x6e, - 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, - 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, - 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, - 0x22, 0x6c, 0x0a, 0x2b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x2b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0xb3, 0x02, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x62, - 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, + 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, + 0x61, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x47, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x82, + 0x01, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x22, 0x47, 0x0a, 0x2b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x6a, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xb3, 0x02, 0x0a, 0x2a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x12, - 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x53, - 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x47, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x29, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x6a, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5e, 0x0a, 0x26, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x67, 0x0a, 0x27, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6e, 0x0a, 0x2a, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, + 0x5e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x67, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x29, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6e, + 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x82, + 0x01, 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x61, 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x61, 0x0a, 0x29, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x22, 0x46, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x03, 0x0a, 0x29, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x46, - 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x03, 0x0a, 0x29, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, + 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, + 0x65, 0x74, 0x61, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x2b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x72, 0x0a, 0x2c, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xe5, - 0x02, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xff, 0x07, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, - 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0xbc, 0x01, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x72, + 0x0a, 0x2c, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xe5, 0x02, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfa, 0x08, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, + 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x03, - 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xf4, 0x07, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, - 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xf9, 0x06, 0x0a, 0x21, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, + 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, - 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, + 0x0a, 0x12, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, + 0x49, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, + 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, + 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0x56, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x56, 0x0a, 0x1e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x20, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0b, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x21, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa9, 0x07, 0x0a, 0x21, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x22, 0xa4, 0x08, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 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, 0x26, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, - 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0x5b, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x76, 0x0a, - 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, + 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, + 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x14, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, + 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x06, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x5b, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x46, 0x0a, 0x1f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbf, 0x05, 0x0a, 0x29, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x49, 0x0a, - 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, + 0x64, 0x73, 0x22, 0x76, 0x0a, 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x23, 0x54, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x1f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xba, 0x06, 0x0a, + 0x29, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, + 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, + 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, - 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, + 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, + 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, @@ -29050,7 +45972,7 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x92, 0x06, 0x0a, 0x34, 0x47, + 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xb7, 0x07, 0x0a, 0x34, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, @@ -29088,471 +46010,707 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, - 0xb5, 0x03, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, + 0x69, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, + 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, + 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf7, 0x05, 0x0a, 0x35, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, + 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x14, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, - 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, - 0x12, 0x89, 0x01, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x56, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x18, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, - 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xa9, 0x03, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, - 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xa3, 0x02, - 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x59, 0x0a, 0x20, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x02, 0x52, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x22, 0x5d, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, - 0xa3, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x75, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x1a, 0x69, + 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x69, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, + 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x69, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa9, + 0x03, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x5c, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0x5c, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, - 0x73, 0x22, 0x77, 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x57, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x59, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, 0x54, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x23, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x22, 0x70, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, - 0x83, 0x01, 0x0a, 0x36, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, + 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, + 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5d, 0x0a, + 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xeb, 0x03, 0x0a, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0d, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, - 0x0a, 0x19, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa3, 0x02, 0x0a, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0x5c, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, + 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, 0x54, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x23, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x8e, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x70, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x83, 0x01, 0x0a, + 0x36, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x96, 0x06, 0x0a, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x19, 0x69, + 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, + 0x52, 0x17, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x19, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x16, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x63, 0x0a, 0x1b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, + 0x52, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x67, 0x0a, 0x1d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x41, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x38, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x0e, 0x0a, 0x21, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x59, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0f, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, - 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, - 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x38, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, - 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xb1, 0x0b, 0x0a, 0x21, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, - 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6c, 0x0a, 0x1e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1c, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1e, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6b, 0x69, 0x6e, 0x64, 0x54, 0x6f, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x1b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5d, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, - 0x57, 0x0a, 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x48, - 0x00, 0x52, 0x15, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x17, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, - 0x00, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x82, 0x01, 0x0a, 0x26, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, - 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x48, 0x00, 0x52, 0x1e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x12, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0x58, 0x0a, 0x12, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x0a, 0x1d, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x6e, 0x48, 0x00, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x13, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x20, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1d, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6c, 0x0a, 0x1e, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1c, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1e, 0x6b, 0x69, + 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, + 0x1a, 0x6b, 0x69, 0x6e, 0x64, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x1b, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, + 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x15, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x4e, 0x0a, 0x17, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x82, 0x01, 0x0a, 0x26, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, + 0x52, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x12, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x12, 0x6b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x72, 0x0a, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x1e, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x70, 0x61, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x48, 0x00, 0x52, + 0x12, 0x62, 0x61, 0x74, 0x63, 0x68, 0x48, 0x70, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x15, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x42, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x48, + 0x00, 0x52, 0x13, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6a, 0x0a, 0x1d, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x0d, - 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, + 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, + 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x11, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, - 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3a, - 0x0a, 0x19, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x17, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x1e, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, - 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, - 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, - 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, - 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1d, - 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x46, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x53, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x5a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, - 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0xe8, 0x05, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, + 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, + 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x6f, 0x75, 0x74, 0x6c, + 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6f, 0x75, 0x74, + 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x21, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, + 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, + 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3d, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x3c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, + 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, + 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, + 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, + 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x51, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x65, 0x64, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x65, 0x64, 0x12, 0x43, + 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x5a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x1c, + 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, + 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x17, 0x6c, + 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x15, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x12, 0x6b, 0x65, 0x64, 0x61, + 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x5f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, + 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x07, 0x52, 0x10, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, + 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, + 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, + 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, + 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0xb5, 0x0a, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x6d, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x0f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, + 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, + 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, 0x09, 0x70, 0x6d, 0x61, + 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, + 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x0c, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x48, 0x09, 0x52, 0x0e, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x0a, 0x52, 0x0c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x0b, 0x52, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, 0x6f, 0x6f, 0x72, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x48, 0x0c, 0x52, 0x13, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, + 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0d, 0x52, 0x0d, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x27, 0x0a, 0x0d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, + 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0e, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, + 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x22, 0xf0, 0x03, 0x0a, 0x10, 0x48, + 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1b, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x02, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x15, 0x0a, 0x13, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, + 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x72, 0x0a, + 0x0b, 0x48, 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x22, 0xf2, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, @@ -29568,3555 +46726,4434 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, - 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x04, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, - 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, - 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6d, - 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x70, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, - 0x09, 0x70, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, - 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x42, 0x17, - 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x22, 0xb7, 0x03, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x26, - 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x04, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x1a, 0x3b, - 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0x11, - 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x0b, 0x48, - 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x66, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, - 0xc1, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, + 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, + 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, + 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, + 0x72, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0d, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, + 0x0d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, + 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, + 0x5f, 0x72, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, + 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, + 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x67, + 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, + 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x22, 0xaf, 0x04, 0x0a, 0x11, 0x4a, 0x56, 0x4d, 0x48, + 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x68, 0x65, 0x61, + 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x48, 0x01, 0x52, 0x12, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, + 0x6f, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x19, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x02, 0x52, 0x16, 0x6e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, + 0x72, 0x68, 0x65, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x17, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x03, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, 0x72, 0x68, + 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x6d, + 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, + 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x48, 0x65, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6e, 0x6f, + 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0xb3, 0x05, 0x0a, 0x0d, 0x48, 0x50, + 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, - 0x0a, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, - 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, - 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, - 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x22, 0xfe, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x63, 0x70, - 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, - 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, - 0x52, 0x75, 0x6c, 0x65, 0x22, 0xe2, 0x06, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, - 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x11, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x17, 0x6d, - 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, - 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x48, 0x05, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, - 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x75, - 0x6c, 0x61, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x48, 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x48, 0x07, 0x52, 0x08, - 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x08, 0x52, 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x3f, 0x0a, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x09, 0x52, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x1d, 0x0a, 0x1b, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf8, 0x02, 0x0a, 0x17, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x6f, 0x6d, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6f, 0x6f, 0x6d, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x6f, - 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, - 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, - 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, - 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, - 0x0a, 0x18, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x16, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x70, 0x75, 0x5f, - 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x63, 0x70, 0x75, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x69, 0x65, 0x72, 0x22, 0x6c, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, - 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x35, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, - 0x39, 0x39, 0x22, 0xd5, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x70, - 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, + 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, + 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x17, 0x6d, 0x61, 0x78, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x62, + 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, + 0x6f, 0x72, 0x48, 0x03, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x10, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x48, 0x05, 0x52, 0x08, 0x66, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, + 0x52, 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, + 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x1e, + 0x0a, 0x1c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, + 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, + 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xf8, 0x02, 0x0a, 0x17, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x6f, 0x6f, 0x6d, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, + 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6f, 0x6f, 0x6d, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6f, 0x6f, 0x6d, + 0x4d, 0x61, 0x78, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, + 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6f, 0x6f, 0x6d, 0x43, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x34, + 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3a, + 0x0a, 0x19, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x17, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x8b, 0x05, 0x0a, 0x18, 0x4b, + 0x45, 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x64, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x69, 0x64, 0x6c, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x10, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0e, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, + 0x77, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x15, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x48, 0x06, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, + 0x35, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x48, 0x07, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x6f, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x22, 0xea, 0x02, 0x0a, 0x0b, 0x4b, 0x45, 0x44, + 0x41, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x3d, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x51, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x48, 0x00, 0x52, 0x11, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, + 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x75, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x22, 0x3f, 0x0a, 0x15, 0x4b, 0x45, 0x44, 0x41, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x73, 0x0a, 0x0c, 0x4b, 0x45, 0x44, 0x41, 0x46, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x0c, + 0x4b, 0x45, 0x44, 0x41, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x21, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, + 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x6c, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x04, - 0x64, 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x22, 0xa0, 0x01, 0x0a, 0x10, 0x42, - 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x63, 0x70, - 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, - 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x43, - 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x22, 0x7f, 0x0a, - 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, - 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, - 0x6f, 0x73, 0x52, 0x0a, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x6d, - 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, - 0x6c, 0x65, 0x49, 0x64, 0x73, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x5d, 0x0a, - 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xa6, 0x04, 0x0a, - 0x1d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, - 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, + 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xd5, 0x01, 0x0a, 0x13, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x30, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x12, 0x32, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x07, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x04, 0x64, 0x69, + 0x73, 0x6b, 0x22, 0xa0, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, + 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x12, + 0x19, 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6d, + 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x70, 0x6d, + 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x22, 0x7f, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, 0x6d, 0x69, + 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0a, + 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, + 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x52, 0x0a, 0x62, 0x75, 0x72, 0x73, + 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x6d, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x54, 0x6f, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x73, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x21, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xa6, 0x04, 0x0a, 0x1d, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x76, 0x0a, 0x23, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, - 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x22, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x74, 0x0a, 0x23, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x76, 0x0a, 0x23, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4f, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x7d, 0x0a, 0x2c, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, - 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, - 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, 0x1e, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x0f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, + 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x74, + 0x0a, 0x23, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x7d, 0x0a, 0x2c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x50, - 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x27, 0x47, 0x65, - 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x72, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, + 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x01, 0x0a, - 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x22, 0xfd, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x16, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x75, 0x70, 0x64, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x36, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, + 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd6, 0x01, 0x0a, 0x17, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x46, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x3e, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x4a, 0x73, 0x6f, + 0x6e, 0x22, 0xce, 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x5d, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x66, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x09, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, + 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x22, 0xfd, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xf7, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x41, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x27, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x23, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x5f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x6e, 0x6f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x29, - 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x72, 0x67, - 0x6f, 0x63, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x69, - 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, - 0x65, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x76, 0x63, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc1, 0x01, - 0x0a, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x55, 0x0a, - 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x5b, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xcd, 0x01, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, - 0x75, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x69, 0x75, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x0e, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, - 0x6e, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x22, 0x9f, 0x04, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x70, 0x75, - 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, - 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, - 0x48, 0x6f, 0x75, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, - 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, - 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x29, 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2a, 0x0a, 0x11, - 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, - 0x0a, 0x16, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, - 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, - 0x75, 0x72, 0x22, 0xcd, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, - 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x50, 0x0a, 0x12, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, - 0x11, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x22, 0xe4, 0x03, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, - 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x70, 0x75, - 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, - 0x56, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xec, 0x01, 0x0a, 0x19, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x20, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, - 0x63, 0x70, 0x75, 0x12, 0x26, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x03, 0x67, - 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x29, 0x0a, - 0x08, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, - 0x07, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x22, 0xee, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x37, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, - 0x03, 0x70, 0x39, 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, - 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, - 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x37, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, - 0x70, 0x39, 0x37, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9b, 0x03, 0x0a, 0x17, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x1e, 0x4b, 0x65, 0x64, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0xcc, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, - 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x67, - 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, - 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, - 0x52, 0x09, 0x63, 0x70, 0x75, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x6d, - 0x65, 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x6d, 0x65, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x33, 0x0a, 0x0a, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x67, 0x70, 0x75, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, - 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, - 0x54, 0x61, 0x6b, 0x65, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xf1, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, - 0x52, 0x11, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x9c, 0x04, 0x0a, 0x1b, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, - 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, - 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, - 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x92, 0x07, 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x50, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, - 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, - 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, - 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, - 0x52, 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x39, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0xb9, 0x06, 0x0a, 0x21, - 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0b, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x68, - 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, - 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, - 0x11, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x3f, 0x0a, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x06, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x2e, 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x69, 0x65, 0x72, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x0f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, - 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, - 0x1a, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x5f, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x15, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, - 0x49, 0x66, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x16, - 0x0a, 0x14, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x42, 0x17, 0x0a, 0x15, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x13, - 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x69, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x85, 0x07, 0x0a, 0x23, 0x48, 0x6f, 0x72, 0x69, - 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, - 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0d, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x88, 0x01, 0x01, - 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, - 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x05, 0x52, 0x17, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x58, 0x0a, 0x27, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x29, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x06, 0x52, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x17, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, - 0x34, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x09, 0x52, 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, - 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, - 0x2a, 0x0a, 0x28, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, - 0x1e, 0x0a, 0x1c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, - 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, - 0xda, 0x12, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, - 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x5b, 0x0a, 0x14, 0x63, 0x70, - 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x12, 0x63, 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x61, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x56, 0x65, 0x72, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x14, 0x67, 0x70, - 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x12, 0x67, 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x64, 0x0a, 0x19, 0x67, 0x70, 0x75, 0x5f, 0x76, - 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x16, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x56, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, - 0x12, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x11, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, - 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, + 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xf7, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x54, 0x0a, 0x27, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x23, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, + 0x6f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, + 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x12, + 0x35, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x5f, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x73, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x76, 0x63, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x0b, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x12, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x1a, 0x5b, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, + 0x65, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, + 0x01, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x69, 0x75, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x0e, + 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xfc, + 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9f, 0x04, + 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x70, + 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x70, + 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, + 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, + 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x70, 0x75, + 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, + 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, + 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x67, + 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x67, 0x70, 0x75, + 0x56, 0x72, 0x61, 0x6d, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, + 0xcd, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x50, 0x0a, + 0x12, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x11, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, + 0xe4, 0x03, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x70, + 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, + 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, + 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, + 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xec, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x26, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x29, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x67, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x22, 0xee, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6d, + 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, + 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x39, 0x37, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x37, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, + 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xcd, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x5f, 0x6d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, + 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6f, 0x6d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x6f, 0x6d, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x1e, 0x4b, 0x65, 0x64, 0x61, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0xcc, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, + 0x09, 0x63, 0x70, 0x75, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x6d, 0x65, + 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x6d, 0x65, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x0a, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x67, 0x70, 0x75, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, + 0x61, 0x6b, 0x65, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x0e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa8, 0x01, + 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, + 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, + 0x6c, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x78, 0x0a, 0x12, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x0a, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xf1, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x32, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x11, + 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x9c, 0x04, 0x0a, 0x1b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, + 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, - 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, - 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x33, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x75, 0x69, 0x64, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x3d, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x92, 0x07, 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, + 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, + 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, + 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, + 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, + 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, + 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0xb5, 0x07, 0x0a, 0x21, 0x56, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, + 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, + 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x02, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, + 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x06, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2e, + 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, + 0x65, 0x72, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2b, + 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x1a, 0x61, + 0x64, 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, 0x49, 0x66, + 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, + 0x2b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x0a, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, + 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, + 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, + 0x73, 0x22, 0x85, 0x07, 0x0a, 0x23, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x48, + 0x02, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x17, 0x6d, + 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x27, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x63, 0x18, 0x29, 0x20, 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x22, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, + 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x75, 0x6c, 0x61, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, 0x18, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x15, 0x0a, 0x13, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x2a, 0x0a, 0x28, 0x5f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x63, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, + 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xe7, 0x1e, 0x0a, 0x1c, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x04, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x59, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x48, - 0x06, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x76, 0x4d, 0x61, - 0x78, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, - 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x5d, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x07, 0x52, 0x12, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, - 0x56, 0x73, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x64, - 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x02, 0x48, 0x08, 0x52, 0x11, 0x64, 0x72, 0x69, 0x66, - 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, - 0x12, 0x3f, 0x0a, 0x1a, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x5f, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x56, 0x70, 0x61, 0x57, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, - 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x0f, 0x63, - 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x70, 0x61, 0x18, 0x61, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4d, 0x70, 0x61, 0x12, 0x46, 0x0a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, - 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x64, 0x62, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x62, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x70, 0x64, 0x62, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x12, - 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, - 0x48, 0x0b, 0x52, 0x12, 0x70, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x0c, 0x52, 0x09, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, - 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, - 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, - 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x42, - 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, - 0x73, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x72, 0x69, - 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, - 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x8b, 0x01, 0x0a, - 0x23, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x4b, 0x0a, - 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x64, 0x0a, 0x24, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x22, 0xb1, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x5b, 0x0a, 0x14, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x63, + 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x61, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x15, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, + 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x14, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x67, + 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x64, 0x0a, 0x19, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x16, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x12, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x72, + 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x11, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x02, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, + 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x39, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, + 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, + 0x31, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x10, 0x6d, + 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x59, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, + 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, 0x0e, 0x73, 0x74, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x76, 0x4d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x12, 0x35, + 0x0a, 0x14, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x12, + 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x56, 0x73, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x5e, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x08, 0x52, 0x11, 0x64, 0x72, 0x69, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x6d, 0x69, + 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, + 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x56, 0x70, 0x61, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x60, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, + 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x20, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x50, + 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x79, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x64, 0x62, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x62, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x64, 0x62, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6d, + 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x64, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x14, 0x70, 0x6d, 0x61, + 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0b, 0x52, 0x12, 0x70, 0x6d, 0x61, 0x78, 0x52, + 0x61, 0x74, 0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x66, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x0c, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x41, 0x0a, 0x1d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1a, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x18, 0x69, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0d, 0x52, 0x17, 0x6a, 0x76, 0x6d, 0x48, 0x65, + 0x61, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x1c, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, + 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0e, 0x52, 0x19, 0x6a, + 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x48, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x1d, 0x6a, + 0x76, 0x6d, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x0f, 0x52, 0x19, 0x6a, 0x76, 0x6d, 0x4e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, + 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x6a, 0x76, 0x6d, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x10, 0x52, 0x17, 0x6a, 0x76, 0x6d, 0x4e, 0x6f, + 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x69, 0x6e, + 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x6d, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x11, 0x52, 0x0f, 0x6a, 0x76, 0x6d, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x6e, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x12, 0x52, 0x0f, 0x6a, 0x76, 0x6d, 0x4d, 0x61, 0x78, 0x48, 0x65, 0x61, + 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1c, 0x6a, 0x76, 0x6d, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x19, 0x6a, 0x76, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, + 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x70, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x13, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x71, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x14, 0x52, 0x0f, 0x63, 0x70, 0x75, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x72, 0x20, 0x01, 0x28, 0x03, 0x48, 0x15, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x33, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x73, 0x20, 0x01, 0x28, 0x03, 0x48, 0x16, 0x52, 0x11, + 0x63, 0x70, 0x75, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x74, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x17, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x75, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x18, 0x52, 0x14, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, 0x6f, 0x6f, + 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x76, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x19, 0x52, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, + 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, + 0x19, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x77, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x1a, 0x52, 0x16, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, + 0x1c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x78, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x1b, 0x52, 0x19, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x79, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, + 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, + 0x0a, 0x15, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x42, 0x1f, 0x0a, 0x1d, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x6e, + 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6a, 0x76, 0x6d, + 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, + 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6a, 0x76, 0x6d, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, 0x61, 0x70, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1a, 0x0a, + 0x18, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1f, 0x0a, 0x1d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x61, 0x10, 0x62, 0x52, 0x14, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x6d, 0x70, 0x61, 0x22, 0x8b, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, - 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, - 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x52, 0x0a, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x20, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x25, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x01, 0x52, 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x20, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, - 0x6e, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x6e, - 0x6c, 0x79, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x28, 0x0a, 0x26, 0x5f, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x22, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, + 0x65, 0x22, 0x64, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xb1, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, + 0x00, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0f, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x25, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x21, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x65, + 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x42, 0x28, 0x0a, 0x26, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xa4, 0x03, 0x0a, 0x22, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x48, 0x01, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, + 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, + 0x02, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x22, 0xed, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xfb, 0x02, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, - 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x01, 0x52, 0x13, 0x6c, 0x69, 0x76, - 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x18, 0x0a, - 0x16, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x76, 0x65, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x34, 0x0a, 0x16, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x12, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x17, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x12, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, - 0x00, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xe1, 0x06, 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, - 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x47, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, - 0x4f, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, - 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, - 0x12, 0x54, 0x0a, 0x1d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, - 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, - 0x65, 0x79, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x5c, - 0x0a, 0x21, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, - 0x6e, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, - 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x70, 0x75, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, + 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xe1, 0x06, + 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x47, 0x0a, 0x16, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, + 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, + 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x17, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, + 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, + 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x54, 0x0a, 0x1d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x08, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, - 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x12, 0x3c, 0x0a, 0x18, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, - 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x00, 0x52, 0x15, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x52, - 0x75, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1b, - 0x0a, 0x19, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, 0x91, 0x0e, 0x0a, 0x16, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, + 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x5c, 0x0a, 0x21, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, + 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3c, 0x0a, 0x18, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x15, 0x65, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x88, 0x01, 0x01, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x22, 0x8b, 0x14, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x71, 0x0a, 0x21, 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, + 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x73, 0x65, 0x4c, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x07, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x13, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x4f, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, + 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x33, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, + 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x48, 0x04, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x06, 0x52, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x48, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x49, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x06, 0x72, 0x75, 0x6c, + 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0a, 0x72, + 0x75, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, + 0x52, 0x16, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x14, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, + 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x52, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, + 0x0b, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x53, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x6a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x48, 0x0e, 0x52, 0x0a, + 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, + 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x5c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, + 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x5d, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x54, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x65, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x14, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x49, 0x0a, + 0x16, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, + 0x61, 0x6b, 0x65, 0x52, 0x13, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x6c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x0f, 0x52, + 0x10, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x88, 0x01, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0xc8, 0x03, 0x0a, 0x10, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x08, 0x69, + 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x10, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x48, 0x00, 0x52, + 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x09, + 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x72, 0x69, 0x73, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, + 0x3c, 0x0a, 0x1a, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x61, + 0x64, 0x62, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x18, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x61, 0x64, 0x62, 0x61, 0x6e, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x69, 0x0a, 0x11, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, + 0x68, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x08, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x76, + 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, + 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x18, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, + 0x67, 0x65, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x35, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2f, + 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, + 0x23, 0x0a, 0x0d, 0x6f, 0x6f, 0x6d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x6f, 0x6d, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x09, 0x63, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, + 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x6f, 0x73, 0x63, 0x69, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x4f, 0x73, + 0x63, 0x69, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0xea, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x3e, 0x0a, 0x0b, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x51, + 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x11, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0xa6, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x23, 0x47, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xd3, 0x01, + 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x72, + 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x71, 0x0a, 0x21, 0x6b, - 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, - 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x76, - 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x75, 0x73, 0x65, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x50, 0x72, - 0x6f, 0x70, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, - 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, - 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x04, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x06, 0x52, 0x0c, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x2d, 0x0a, 0x10, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x48, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x49, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x08, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x14, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, - 0x52, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x52, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, - 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x48, 0x09, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x53, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x48, 0x0b, - 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, - 0x18, 0x5c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, - 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, - 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x22, - 0x85, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x41, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x22, 0xd3, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x55, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x56, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, + 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, + 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x1a, + 0x6e, 0x0a, 0x1d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, 0x6f, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x65, 0x0a, 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x8c, 0x01, 0x0a, + 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x49, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x23, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x73, 0x22, 0x9e, 0x03, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x1a, 0x6e, 0x0a, 0x1d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x65, 0x0a, 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x60, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x19, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x22, 0x4f, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x40, - 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x22, 0xa3, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, - 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x22, 0x9e, 0x03, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5a, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x60, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, - 0x0e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xa8, + 0x03, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x65, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x1a, 0x63, 0x0a, 0x0e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x54, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x22, 0xa8, 0x03, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, - 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x65, 0x0a, 0x0e, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, - 0x70, 0x1a, 0x63, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, - 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x01, 0x1a, 0x56, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0xbc, 0x01, 0x0a, + 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd9, 0x02, 0x0a, + 0x1a, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x5c, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1d, 0x0a, 0x1b, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd7, + 0x02, 0x0a, 0x21, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, + 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0xbd, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x07, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, + 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x22, 0x64, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2e, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x4c, + 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x1a, + 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, - 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xd9, 0x02, 0x0a, 0x1a, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x5c, 0x0a, 0x17, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x16, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, - 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1d, 0x0a, - 0x1b, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x1b, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x1c, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xd7, 0x02, 0x0a, 0x21, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, - 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, - 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0xbd, 0x01, - 0x0a, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, - 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x07, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x11, 0x67, 0x65, 0x74, - 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x65, 0x74, 0x5f, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x22, 0x64, 0x0a, - 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x49, 0x64, 0x22, 0x49, 0x0a, 0x1b, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x8d, 0x01, + 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x22, 0x4c, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x22, 0x54, 0x0a, 0x1a, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x1b, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, - 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, - 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, - 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xd2, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x85, 0x02, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, + 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x8f, 0x01, + 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x8e, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x22, 0x9b, 0x02, 0x0a, 0x2a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x78, + 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, - 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x27, 0x0a, 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x75, - 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x75, 0x6e, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, - 0x52, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xc2, 0x02, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x75, 0x6e, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x1a, 0x61, 0x6b, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x61, 0x6b, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x58, 0x0a, 0x1e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xc5, 0x01, 0x0a, 0x1f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x68, 0x61, 0x73, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x68, 0x61, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0b, + 0x68, 0x61, 0x73, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x43, 0x61, 0x73, 0x74, 0x41, 0x69, 0x22, 0x52, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x9a, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xaf, 0x01, + 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x21, 0x0a, + 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x22, + 0x2e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x5b, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xb8, 0x01, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x72, 0x49, 0x64, 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, 0x21, 0x0a, 0x0c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x37, 0x0a, + 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xc0, 0x02, 0x0a, 0x1a, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x3b, + 0x0a, 0x0b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0f, 0x61, + 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, + 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x42, 0x79, 0x22, 0x62, 0x0a, 0x28, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa6, 0x01, + 0x0a, 0x29, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x63, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, + 0x18, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x7a, 0x65, 0x72, + 0x6f, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x44, 0x65, 0x76, 0x5a, 0x65, 0x72, 0x6f, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0x91, 0x01, 0x0a, 0x2c, 0x41, 0x63, 0x6b, 0x6e, 0x6f, + 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, + 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, + 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x42, 0x79, 0x22, 0x3f, 0x0a, 0x2d, 0x41, 0x63, + 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x17, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, + 0x6d, 0x6c, 0x22, 0x5c, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0xaf, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, - 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x22, 0xd4, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, + 0x22, 0x64, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x83, 0x01, 0x0a, + 0x21, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x60, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, + 0x6e, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x57, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, - 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, - 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x64, 0x0a, 0x1e, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, - 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x64, 0x0a, + 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x42, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x22, 0x5e, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa6, 0x02, 0x0a, 0x19, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x33, 0x0a, 0x16, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x13, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x22, 0x5e, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, + 0x0a, 0x0d, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x62, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x1a, 0x61, 0x0a, 0x10, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x46, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x4f, 0x0a, 0x17, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x18, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x22, 0xf5, 0x17, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x46, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, - 0x72, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0e, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x18, - 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x12, - 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, - 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x13, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x54, - 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, - 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x5f, 0x74, - 0x69, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x54, - 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, - 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, 0x74, - 0x69, 0x70, 0x18, 0x72, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x14, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x54, 0x69, 0x70, - 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, + 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x4f, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x66, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8c, 0x1a, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, - 0x12, 0x3b, 0x0a, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, + 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, + 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, + 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x12, 0x48, 0x0a, + 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, + 0x69, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, + 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, + 0x3e, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x73, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, + 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, - 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3c, 0x0a, - 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, - 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x7a, 0x6f, 0x6e, 0x65, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x08, 0x7a, 0x6f, - 0x6e, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2e, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x10, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, - 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x30, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x13, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x54, - 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x33, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x25, 0x0a, - 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x61, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, - 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, - 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x37, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, - 0x69, 0x70, 0x18, 0x39, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x09, 0x74, 0x61, 0x69, 0x6e, - 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x72, - 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3a, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x0c, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x09, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, - 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, - 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, - 0x19, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x16, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, - 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x51, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, - 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, - 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x67, 0x63, 0x70, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x30, - 0x0a, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x63, 0x69, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2f, 0x0a, 0x11, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x55, 0x20, 0x01, 0x28, 0x03, 0x48, 0x0f, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, - 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, - 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0b, 0x7a, - 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, - 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x7a, 0x6f, 0x6e, 0x61, - 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x64, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x77, - 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x72, - 0x61, 0x77, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1a, - 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x69, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x45, 0x0a, + 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x6e, 0x76, 0x6d, 0x65, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x4e, 0x76, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, + 0x01, 0x12, 0x37, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, + 0x6c, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x70, 0x75, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, - 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1a, 0x0a, 0x18, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, - 0x76, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, - 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, - 0x70, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, - 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xaf, 0x01, 0x0a, 0x26, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0x5d, 0x0a, 0x27, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x6e, 0x72, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x6e, 0x72, 0x63, 0x22, 0xb2, 0x03, 0x0a, 0x18, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x34, 0x0a, - 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x59, - 0x61, 0x6d, 0x6c, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x59, 0x0a, 0x1f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0xb0, 0x03, 0x0a, 0x20, + 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x16, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x5f, + 0x74, 0x69, 0x70, 0x18, 0x75, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x72, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x07, 0x52, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, + 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x20, 0x0a, 0x09, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2d, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x08, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x54, 0x69, 0x70, + 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, + 0x52, 0x10, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x54, + 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x0a, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, + 0x36, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x38, + 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x35, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0a, 0x64, 0x69, + 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x37, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, + 0x0a, 0x0a, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x0c, 0x52, 0x09, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, + 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x0e, 0x64, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, + 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3b, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x09, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x54, 0x69, + 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x0f, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, + 0x67, 0x63, 0x70, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x63, + 0x69, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x55, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x10, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0b, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, + 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x73, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x76, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x44, 0x0a, 0x1e, 0x75, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x77, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x75, 0x6e, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, + 0x0a, 0x19, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, + 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, + 0x74, 0x69, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, 0x69, + 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, 0x0a, + 0x16, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x61, 0x69, 0x6e, + 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, 0x69, 0x73, 0x72, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xaf, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0x5d, 0x0a, 0x27, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x6e, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x03, 0x6e, 0x72, 0x63, 0x22, 0xb2, 0x03, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x79, + 0x61, 0x6d, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, + 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x59, 0x0a, 0x1f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x60, 0x0a, 0x0e, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x12, 0x63, 0x0a, 0x0f, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, - 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x1a, 0x61, 0x0a, 0x11, 0x4e, 0x67, 0x54, 0x6f, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0xb0, 0x03, 0x0a, 0x20, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0e, + 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, + 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x6e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x63, + 0x0a, 0x0f, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x1a, 0x61, 0x0a, 0x11, 0x4e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x12, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x12, 0x4e, 0x67, - 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa4, - 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, - 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x01, 0x0a, 0x24, 0x53, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x22, 0xf0, 0x02, 0x0a, 0x25, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x09, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x09, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, + 0x3e, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0xc1, 0x01, 0x0a, 0x28, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0xcb, 0x02, + 0x0a, 0x1e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0xe5, 0x05, 0x0a, 0x14, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2d, 0x0a, + 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x30, 0x0a, 0x06, + 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x52, 0x06, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x12, 0x36, + 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x76, 0x69, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x46, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x75, + 0x73, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x53, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x18, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x16, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x12, 0x49, 0x0a, 0x1f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, + 0x73, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x1b, 0x75, + 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x42, 0x20, 0x0a, + 0x1e, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x75, 0x73, 0x64, 0x42, + 0x22, 0x0a, 0x20, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, + 0x75, 0x73, 0x64, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xc2, 0x01, 0x0a, + 0x12, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x66, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xc9, 0x02, + 0x0a, 0x11, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x3c, 0x0a, 0x0e, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x0d, + 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x34, 0x0a, + 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x1e, 0x75, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x75, 0x6e, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x2a, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x8d, 0x02, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x46, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x86, 0x03, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, - 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x00, 0x52, - 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, - 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x48, 0x01, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, - 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, - 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, - 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, - 0x69, 0x6e, 0x64, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x29, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x12, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x86, 0x03, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, + 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x01, 0x52, 0x10, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, 0x0a, 0x2b, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x3b, 0x0a, 0x11, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x54, 0x0a, - 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, + 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x29, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2b, + 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x11, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x54, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x55, + 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x53, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x1c, 0x4c, 0x69, - 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x22, 0x53, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x51, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x1e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0xbf, 0x03, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x65, 0x74, 0x73, 0x22, 0x51, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xbf, 0x03, 0x0a, 0x10, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x70, 0x20, 0x01, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, 0x01, 0x0a, - 0x10, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x7a, 0x6f, 0x6e, - 0x61, 0x6c, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, - 0x74, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x65, 0x76, 0x69, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x7a, 0x6f, 0x6e, - 0x65, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5a, 0x6f, 0x6e, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x22, 0x47, 0x0a, 0x05, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x10, - 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x02, 0x0a, 0x10, 0x44, 0x69, 0x73, - 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, - 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, - 0x12, 0x35, 0x0a, 0x17, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x14, 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x1d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, - 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x32, 0x0a, 0x07, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x64, - 0x67, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x22, 0x86, 0x0a, 0x0a, 0x10, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4e, 0x0a, 0x15, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, - 0x52, 0x13, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x64, 0x0a, 0x1d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, - 0x1a, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x23, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, - 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, - 0x6d, 0x52, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, - 0x72, 0x6d, 0x73, 0x12, 0x42, 0x0a, 0x1b, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, - 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x18, 0x61, 0x73, 0x73, 0x6f, - 0x63, 0x69, 0x61, 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x12, 0x61, 0x6d, 0x69, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x10, 0x61, 0x6d, - 0x69, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x22, - 0x0a, 0x0a, 0x61, 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, 0x6d, 0x69, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, - 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, - 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x05, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x54, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x06, - 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x12, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x47, - 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x48, 0x08, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x1e, 0x0a, 0x1c, 0x5f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, - 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x45, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x22, 0x62, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, - 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x43, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, - 0x6c, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, - 0x6c, 0x79, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, - 0x6c, 0x69, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x73, 0x22, 0x49, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, - 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc1, 0x01, 0x0a, + 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, 0x61, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x55, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x10, 0x5a, 0x6f, 0x6e, 0x61, + 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x13, + 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x30, 0x0a, 0x14, + 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x76, 0x69, 0x63, + 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5a, 0x6f, 0x6e, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x47, + 0x0a, 0x05, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x72, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x02, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x17, 0x74, + 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x74, + 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, 0x65, 0x72, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x47, 0x0a, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x62, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x3a, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x86, 0x0a, 0x0a, 0x10, + 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x4e, 0x0a, 0x15, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x13, 0x73, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, + 0x12, 0x64, 0x0a, 0x1d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x1a, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x23, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x20, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x42, + 0x0a, 0x1b, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x18, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x45, 0x0a, 0x12, 0x61, 0x6d, 0x69, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x10, 0x61, 0x6d, 0x69, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x6d, 0x69, + 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x09, 0x61, 0x6d, 0x69, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, + 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x12, 0x3b, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x05, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, + 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, + 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x06, 0x52, 0x13, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x07, 0x52, 0x12, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x10, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x08, 0x52, 0x0f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x61, + 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, + 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x45, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, 0x10, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x22, + 0x42, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x0d, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x5b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x52, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x49, + 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x0d, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x0c, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5f, 0x0a, 0x10, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, + 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x12, 0x12, 0x0a, 0x04, + 0x76, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x63, 0x70, 0x75, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5f, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x50, 0x55, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x63, 0x70, 0x75, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, - 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x1c, 0x47, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x6a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x73, 0x22, 0x6a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x12, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, - 0x22, 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, - 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x22, 0x46, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x22, 0x5f, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3f, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x22, 0x97, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, - 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x01, 0x0a, 0x19, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x37, - 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x45, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, + 0x55, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x22, + 0x46, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x5f, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, + 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb9, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, + 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcc, + 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, - 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x37, 0x0a, + 0x72, 0x6d, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x49, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf6, 0x01, + 0x0a, 0x0f, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, + 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, + 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x73, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x73, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf6, 0x01, 0x0a, 0x0f, 0x41, 0x4d, 0x49, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x73, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x73, 0x6d, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xc2, 0x0a, 0x0a, 0x14, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x64, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, - 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x6d, - 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x6f, 0x64, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x01, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x72, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x59, 0x0a, 0x0f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc2, 0x0a, 0x0a, 0x14, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, 0x6e, 0x73, + 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x73, 0x50, + 0x65, 0x72, 0x43, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x0f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, - 0x0d, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, - 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x12, 0x76, 0x0a, 0x1a, - 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x67, 0x72, - 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6b, 0x75, 0x62, + 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, - 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x65, 0x76, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x0a, 0x1d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x19, 0x65, - 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x61, - 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, - 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, - 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, - 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, - 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x4b, - 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, - 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, - 0x11, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, - 0x0a, 0x1c, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, - 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, - 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x64, 0x73, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x76, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, - 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, - 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, - 0x75, 0x6f, 0x74, 0x61, 0x22, 0xb4, 0x01, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x62, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x48, 0x01, 0x52, 0x03, 0x65, 0x62, 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, - 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x62, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9d, 0x04, 0x0a, 0x0b, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x21, 0x0a, 0x0a, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x68, 0x72, - 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, - 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x1a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x06, 0x52, 0x18, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0a, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, - 0x16, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x6f, 0x70, 0x73, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x1d, 0x0a, 0x1b, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x0f, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x28, 0x0a, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x70, 0x76, 0x36, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x02, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x6f, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x24, 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x42, 0x1e, - 0x0a, 0x1c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xfa, - 0x04, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x14, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x15, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, - 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x01, 0x52, 0x14, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, - 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x25, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, - 0x6b, 0x52, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x12, 0x53, + 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x6f, 0x66, 0x74, 0x12, 0x76, 0x0a, 0x1a, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, + 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x17, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, + 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x0a, 0x1d, 0x65, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, + 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x02, 0x52, 0x19, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x78, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, + 0x4c, 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, + 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, + 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x1a, + 0x41, 0x0a, 0x13, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x1c, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, + 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, + 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x22, 0xb4, 0x01, 0x0a, 0x12, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x62, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x48, 0x01, 0x52, 0x03, 0x65, 0x62, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0a, 0x72, 0x6f, 0x6f, + 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, + 0x62, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x22, 0x9d, 0x04, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x65, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, + 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, + 0x0a, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x04, + 0x69, 0x6f, 0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0a, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6b, + 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, + 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x18, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, + 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, + 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, + 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x69, 0x6f, 0x70, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, + 0x70, 0x75, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0c, 0x68, 0x74, 0x74, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x12, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, + 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x70, 0x76, 0x36, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, + 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x6f, 0x70, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x68, + 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x5f, 0x69, 0x70, 0x76, 0x36, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, + 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xfa, 0x04, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, + 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, + 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, + 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x15, 0x6b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x14, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x12, 0x25, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x1a, + 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6b, 0x75, 0x62, + 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3c, 0x0a, 0x14, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0xb6, 0x01, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x73, 0x69, 0x7a, 0x65, 0x47, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xa5, 0x04, 0x0a, 0x12, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x29, 0x0a, 0x0e, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x76, 0x6e, 0x65, 0x74, + 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0f, 0x6f, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x6f, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x47, 0x62, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x20, 0x0a, 0x09, 0x66, 0x69, 0x70, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x66, 0x69, 0x70, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x6b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x04, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, + 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, + 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3c, 0x0a, 0x14, 0x47, - 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, - 0x65, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xb6, 0x01, 0x0a, 0x07, 0x47, 0x43, - 0x50, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x69, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x69, 0x7a, 0x65, 0x47, 0x69, 0x62, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x74, - 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, - 0x6f, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, - 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, - 0x64, 0x65, 0x22, 0xe9, 0x03, 0x0a, 0x12, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x0e, 0x76, 0x6e, 0x65, - 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0c, 0x76, 0x6e, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, - 0x0c, 0x6f, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x62, 0x88, 0x01, 0x01, - 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, - 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x69, 0x70, 0x73, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x66, - 0x69, 0x70, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x04, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, - 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, - 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, - 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x70, 0x73, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, - 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xc4, - 0x06, 0x0a, 0x19, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x12, - 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, 0x70, 0x75, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, - 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x70, 0x75, 0x5f, - 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, - 0x51, 0x75, 0x6f, 0x74, 0x61, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x49, - 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, 0x6f, 0x77, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x15, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x73, 0x61, 0x66, - 0x65, 0x5f, 0x73, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x53, 0x79, - 0x73, 0x63, 0x74, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x3a, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x07, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x70, - 0x6f, 0x64, 0x5f, 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x64, 0x50, 0x69, 0x64, 0x73, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x42, - 0x17, 0x0a, 0x15, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, - 0x61, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x21, 0x0a, 0x1f, - 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x70, + 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xc4, 0x06, 0x0a, 0x19, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x31, 0x0a, 0x12, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, + 0x70, 0x75, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, + 0x6f, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x63, 0x70, 0x75, + 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x63, + 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, + 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, + 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, + 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x15, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x6e, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x6e, 0x73, 0x61, 0x66, + 0x65, 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, + 0x0a, 0x0e, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x64, 0x50, 0x69, 0x64, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, + 0x74, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, + 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, - 0x1a, 0x0a, 0x18, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x19, 0x0a, 0x17, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, 0x64, 0x73, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x61, 0x0a, 0x14, 0x4f, 0x43, 0x49, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, - 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x15, 0x4f, 0x43, 0x49, 0x53, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, - 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x1c, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x0d, 0x4f, 0x43, 0x49, - 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x17, 0x62, 0x6f, - 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, - 0x6e, 0x5f, 0x67, 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x6f, 0x6f, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x73, - 0x12, 0x34, 0x0a, 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x13, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x56, 0x70, 0x75, - 0x73, 0x50, 0x65, 0x72, 0x47, 0x62, 0x22, 0x90, 0x03, 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4c, 0x61, - 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x62, - 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x66, 0x69, - 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, - 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x51, 0x0a, 0x23, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x1f, - 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, - 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x69, 0x72, 0x6d, - 0x77, 0x61, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x19, + 0x0a, 0x17, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, + 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x61, 0x0a, 0x14, 0x4f, 0x43, 0x49, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x15, 0x4f, + 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x1c, 0x4f, 0x43, 0x49, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x0d, + 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, + 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, + 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x47, 0x62, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x56, 0x70, 0x75, 0x73, 0x50, 0x65, 0x72, 0x47, 0x62, 0x22, 0x90, 0x03, 0x0a, 0x10, 0x4f, 0x43, + 0x49, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, + 0x0a, 0x10, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, + 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, + 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x51, 0x0a, 0x23, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x69, 0x6e, - 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x13, 0x4f, 0x43, 0x49, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x73, - 0x12, 0x1e, 0x0a, 0x0b, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x70, 0x75, 0x73, 0x50, 0x65, 0x72, 0x47, 0x62, - 0x22, 0x91, 0x08, 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x63, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x63, 0x6e, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0e, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, - 0x49, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, - 0x72, 0x6d, 0x52, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x46, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x6e, 0x65, - 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x17, 0x73, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, - 0x52, 0x15, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x70, 0x72, 0x65, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x70, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x09, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, - 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0e, - 0x66, 0x72, 0x65, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, - 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x46, - 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x12, 0x36, - 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, - 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, - 0x0a, 0x11, 0x46, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x22, 0x6a, 0x0a, 0x1f, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x04, 0x52, 0x1f, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, + 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x13, + 0x4f, 0x43, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, + 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x47, 0x62, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x70, 0x75, 0x73, 0x50, 0x65, + 0x72, 0x47, 0x62, 0x22, 0x91, 0x08, 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x63, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x63, 0x6e, 0x49, 0x64, 0x12, + 0x43, 0x0a, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0e, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x17, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, + 0x65, 0x72, 0x6d, 0x52, 0x15, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, + 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x70, 0x72, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x43, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x50, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x62, + 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0e, 0x6c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4c, 0x61, + 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x6c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x46, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x6a, 0x0a, 0x1f, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x25, 0x0a, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x59, + 0x61, 0x6d, 0x6c, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x66, 0x67, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, + 0x68, 0x22, 0xa3, 0x01, 0x0a, 0x1e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x43, + 0x66, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x50, 0x0a, 0x16, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x36, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x10, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6a, 0x73, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x73, 0x6f, 0x6e, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe2, 0x04, 0x0a, 0x17, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x43, 0x52, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5b, 0x0a, 0x1a, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x6b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x03, 0x61, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4b, 0x53, 0x4b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x6b, 0x73, + 0x12, 0x2a, 0x0a, 0x03, 0x67, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x2a, 0x0a, 0x03, + 0x6f, 0x63, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x25, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x43, 0x66, 0x67, 0x49, 0x64, 0x22, + 0x60, 0x0a, 0x10, 0x41, 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x43, + 0x32, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x65, 0x63, 0x32, 0x6e, + 0x63, 0x22, 0x60, 0x0a, 0x10, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x61, 0x6b, 0x73, 0x6e, 0x63, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x4b, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x61, 0x6b, + 0x73, 0x6e, 0x63, 0x22, 0x26, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x45, + 0x43, 0x32, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x41, 0x4b, 0x53, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x5e, 0x0a, 0x10, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, - 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x59, 0x61, 0x6d, 0x6c, - 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, - 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, - 0x61, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x6b, 0x73, 0x12, - 0x2a, 0x0a, 0x03, 0x67, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x2a, 0x0a, 0x03, 0x6f, - 0x63, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x25, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x72, 0x65, 0x63, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x43, 0x66, 0x67, 0x49, 0x64, 0x22, 0x60, - 0x0a, 0x10, 0x41, 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, + 0x6e, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x6d, + 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x43, 0x32, - 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, - 0x22, 0x60, 0x0a, 0x10, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x61, 0x6b, 0x73, 0x6e, 0x63, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x4b, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x61, 0x6b, 0x73, - 0x6e, 0x63, 0x22, 0x26, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x45, 0x43, - 0x32, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x41, 0x4b, 0x53, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, - 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x6d, 0x0a, - 0x10, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, - 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, - 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x0c, - 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x93, 0x0a, 0x0a, 0x1b, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2a, 0x0a, + 0x0c, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x93, 0x0a, 0x0a, 0x1b, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, - 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, - 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, - 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, - 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, - 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, - 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, - 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, - 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, - 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, - 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, - 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, - 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, - 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, - 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, - 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, - 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, - 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, - 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, - 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, - 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, - 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, - 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xa3, - 0x08, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, - 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, - 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, - 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, - 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, - 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, - 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, - 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, - 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, - 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, - 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, - 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, - 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, - 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, - 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, - 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, + 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, + 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, + 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, + 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, + 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, + 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, + 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, + 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, + 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, + 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, + 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, + 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, + 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, + 0xa3, 0x08, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, - 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, - 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, - 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, - 0x0a, 0x25, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, + 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, + 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, + 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, + 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, + 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, + 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, + 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, + 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, + 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, + 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, + 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, + 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x44, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xc0, - 0x08, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, - 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, - 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, - 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, - 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, - 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, - 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, - 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, - 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, - 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, - 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, - 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, - 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, - 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x22, 0x68, 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, + 0xc0, 0x08, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, + 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, + 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, + 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, + 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, + 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, + 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, + 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, + 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, + 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, + 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x45, + 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x45, 0x0a, - 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x22, 0xda, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x22, 0xd4, 0x02, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, - 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, - 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x58, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x22, 0x6d, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xda, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x22, 0xd4, 0x02, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, + 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x58, 0x0a, 0x21, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0x6d, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x59, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x22, 0x59, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x57, 0x0a, + 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x58, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x57, 0x0a, 0x20, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x58, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0x58, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x21, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x0b, 0x0a, 0x18, 0x50, 0x76, 0x63, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, - 0x76, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x76, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x61, - 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x73, - 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, - 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x64, 0x61, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x67, 0x72, 0x6f, 0x77, 0x74, - 0x68, 0x52, 0x61, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, 0x79, - 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, - 0x6c, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, - 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x73, - 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, - 0x73, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, - 0x73, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, - 0x55, 0x73, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x6f, - 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, 0x73, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, - 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x03, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, - 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3f, 0x0a, 0x0e, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3c, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, - 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x3d, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, - 0x64, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x08, 0x0a, 0x06, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x22, 0x47, 0x65, - 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6f, 0x0a, - 0x23, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xba, - 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbb, 0x01, 0x0a, 0x25, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x97, 0x01, 0x0a, 0x27, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x49, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x22, 0x96, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x27, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0x58, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x21, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x0b, 0x0a, 0x18, 0x50, 0x76, + 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x70, 0x76, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x76, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, + 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, + 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x67, 0x72, 0x6f, 0x77, 0x74, + 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x64, 0x61, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x67, 0x72, 0x6f, 0x77, + 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, + 0x79, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, + 0x75, 0x6c, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, + 0x73, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x55, 0x73, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, + 0x75, 0x73, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, + 0x79, 0x55, 0x73, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x1b, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, 0x73, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, + 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x03, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3f, 0x0a, + 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x3c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x76, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x3d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x05, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x22, 0x47, + 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6f, + 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x91, 0x05, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, - 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x12, - 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, 0x12, - 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, 0x65, - 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, - 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, - 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x20, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, - 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6f, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x1c, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6b, 0x0a, 0x1d, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf1, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xba, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbb, 0x01, 0x0a, + 0x25, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x97, 0x01, 0x0a, 0x27, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0x96, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x27, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x91, 0x05, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, + 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, + 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x28, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x75, - 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, - 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x46, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x70, 0x75, 0x5f, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x6e, - 0x65, 0x77, 0x43, 0x70, 0x75, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, 0x77, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xc4, 0x01, 0x0a, 0x28, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, - 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, - 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, - 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x22, 0x7f, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, - 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, + 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6f, 0x0a, 0x21, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x22, 0xd5, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, + 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x1c, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, @@ -33128,1638 +51165,4331 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x25, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6b, 0x0a, 0x1d, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcb, 0x08, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf1, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x5e, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, - 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, - 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, - 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, - 0x1f, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, - 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0xac, 0x06, 0x0a, 0x27, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, - 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, - 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, - 0x1f, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x22, 0x6b, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, + 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x46, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, + 0x6e, 0x65, 0x77, 0x43, 0x70, 0x75, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, + 0x77, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xc4, 0x01, 0x0a, 0x28, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x22, 0x7f, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x22, 0xd5, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x25, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x15, 0x0a, + 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, + 0x6f, 0x74, 0x49, 0x6e, 0x22, 0xe4, 0x10, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x5e, + 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3e, + 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, + 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0e, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, + 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, + 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, + 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x43, + 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x05, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x06, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x48, 0x07, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x08, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, + 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, + 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, + 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, + 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x0a, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, + 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, + 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, + 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0xfb, 0x03, 0x0a, 0x1b, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, + 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, + 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, + 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0xa8, 0x0b, 0x0a, 0x27, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, + 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, + 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, + 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, + 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, + 0x65, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x05, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x06, 0x52, 0x0d, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x07, 0x52, 0x0b, 0x6e, 0x61, 0x6d, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x08, 0x52, 0x10, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, + 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, + 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, + 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x42, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x79, 0x22, 0x61, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xc4, - 0x07, 0x0a, 0x27, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xbf, 0x01, + 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x72, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0xcd, 0x0c, 0x0a, 0x27, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x05, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, + 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, + 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, + 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x07, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, + 0x52, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, 0x52, + 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x09, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x0a, 0x52, 0x0c, 0x6b, + 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, + 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x0b, 0x52, + 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x0c, 0x52, + 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x48, 0x0d, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0e, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, + 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, + 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, + 0x15, 0x10, 0x16, 0x22, 0xd5, 0x01, 0x0a, 0x2f, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, + 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x30, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x02, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, - 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x17, 0x64, 0x65, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x45, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x19, 0x75, 0x73, 0x65, - 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x70, 0x61, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, - 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, - 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x69, 0x76, - 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x6b, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, + 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x6b, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xb7, 0x01, + 0x0a, 0x27, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x40, 0x0a, 0x0b, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x04, 0x0a, 0x2f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0xed, 0x02, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x45, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0e, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6f, + 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x30, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x22, 0x82, 0x01, 0x0a, 0x27, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x22, 0x91, 0x03, 0x0a, 0x1a, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x41, 0x0a, 0x11, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xeb, 0x05, 0x0a, + 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4f, 0x0a, 0x13, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, + 0x12, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x53, 0x0a, 0x0d, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x1d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x6a, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xf3, 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3f, + 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x02, 0x52, 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x1c, 0x0a, 0x1a, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, 0x55, 0x0a, + 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0x78, 0x0a, 0x24, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x8a, + 0x01, 0x0a, 0x25, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, + 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x22, 0x6a, 0x0a, 0x1c, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xe5, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6f, 0x75, 0x74, + 0x63, 0x6f, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x22, + 0x4e, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x55, + 0x54, 0x43, 0x4f, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x43, 0x4f, 0x4d, 0x45, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x55, 0x54, 0x43, + 0x4f, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x22, + 0xad, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, + 0xf5, 0x03, 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, 0x74, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x45, 0x57, 0x5f, 0x45, + 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x41, + 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x5f, + 0x54, 0x48, 0x49, 0x53, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x1c, 0x0a, + 0x18, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4f, 0x54, 0x48, + 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x03, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xfa, 0x01, 0x0a, 0x25, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4f, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x34, + 0x0a, 0x16, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x19, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x44, 0x0a, 0x0d, 0x75, 0x6e, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x75, 0x6e, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x22, 0x73, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, + 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x56, 0x45, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x75, 0x6e, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x95, 0x02, 0x0a, 0x26, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x87, 0x02, 0x0a, 0x13, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x79, 0x6e, + 0x63, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x12, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x7c, 0x0a, 0x16, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x1a, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xfe, 0x02, 0x0a, + 0x19, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x51, 0x0a, 0x0c, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf0, 0x03, + 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xe8, 0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x25, 0x0a, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x41, 0x74, + 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x20, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, + 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0xf9, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, + 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4e, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, + 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x8b, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x20, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa7, + 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x54, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x46, + 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x20, 0x0a, 0x1e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, + 0x0a, 0x1e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x1f, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7b, 0x0a, 0x26, 0x42, + 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x4e, 0x0a, 0x27, 0x42, 0x75, 0x6c, 0x6b, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x27, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x57, 0x0a, 0x17, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe1, + 0x0b, 0x0a, 0x10, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, + 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, + 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, + 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, + 0x61, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, + 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, + 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, + 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x12, 0x6b, 0x65, 0x64, + 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x45, 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x07, 0x52, 0x10, 0x6b, 0x65, 0x64, 0x61, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x42, 0x19, + 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x23, 0x0a, + 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0xaa, 0x02, 0x0a, 0x1f, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xbc, 0x02, 0x0a, - 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x18, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, - 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, - 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3e, 0x0a, 0x10, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x4e, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, - 0x8b, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb1, 0x01, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x75, 0x74, + 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x4c, 0x0a, 0x20, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x71, 0x0a, + 0x21, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x54, 0x0a, 0x20, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, + 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x4e, 0x0a, 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, + 0x22, 0x9f, 0x02, 0x0a, 0x1a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, - 0x64, 0x22, 0x46, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x19, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, + 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x22, 0xdc, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x12, 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x21, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x64, 0x62, 0x52, 0x75, 0x6c, + 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xee, 0x07, 0x0a, 0x10, 0x4d, 0x61, 0x6e, 0x75, 0x61, - 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, - 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, - 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, - 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, - 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, - 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, - 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, - 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, - 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, - 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, - 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, - 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, - 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, - 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, - 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0xaa, 0x02, 0x0a, 0x1f, 0x55, 0x70, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x61, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x21, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, + 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, - 0x6f, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, - 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, - 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x12, 0x32, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x20, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, - 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, - 0x6c, 0x65, 0x22, 0xef, 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x72, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1f, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, + 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, + 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x22, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, + 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, + 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0xa4, 0x02, 0x0a, 0x25, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, - 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, - 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x67, 0x69, 0x6e, - 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x21, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xa0, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xc5, + 0x01, 0x0a, 0x23, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x04, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x6f, 0x0a, 0x26, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x45, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x20, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, + 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, + 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x22, 0xa6, 0x03, 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x37, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x21, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0xc2, 0x01, 0x0a, 0x1f, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x17, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x26, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x37, 0x0a, 0x09, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0x9c, + 0x01, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, + 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0xbb, 0x01, + 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x22, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xa6, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x36, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x20, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x90, 0x01, 0x0a, + 0x21, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x65, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x65, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xdb, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x62, 0x0a, + 0x28, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, + 0x64, 0x22, 0xf7, 0x01, 0x0a, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0a, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x6d, 0x0a, 0x29, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x28, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x4a, 0x0a, 0x10, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, + 0x73, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, 0x75, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x63, 0x72, 0x69, 0x75, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x46, 0x72, 0x65, + 0x73, 0x68, 0x22, 0x63, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, + 0x12, 0x19, 0x0a, 0x05, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x00, 0x52, 0x05, 0x75, 0x70, 0x70, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x22, 0xa1, 0x02, 0x0a, 0x19, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x48, 0x00, 0x52, 0x0a, + 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, + 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x73, 0x48, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x6f, 0x6c, 0x6c, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x70, 0x6f, 0x6c, 0x6c, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xa6, + 0x02, 0x0a, 0x1a, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2e, 0x0a, + 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, + 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x48, 0x01, 0x52, 0x11, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x6e, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x6f, 0x6e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, + 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x8e, 0x06, 0x0a, 0x17, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, + 0x70, 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, + 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, + 0x1d, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x50, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x13, 0x6d, 0x61, 0x78, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, + 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x1a, + 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x06, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x50, 0x65, 0x72, 0x50, 0x6f, 0x64, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1f, 0x6d, + 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x62, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x70, 0x6f, 0x64, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, + 0x64, 0x5f, 0x6d, 0x62, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x62, 0x22, 0x89, 0x03, 0x0a, 0x20, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x72, + 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, + 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, + 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xe5, 0x02, 0x0a, 0x1a, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x6f, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, + 0x70, 0x68, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, + 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, + 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xd9, 0x02, 0x0a, + 0x20, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, - 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x21, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1f, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, + 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, + 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, + 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, + 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, + 0x68, 0x61, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xed, 0x03, 0x0a, 0x1b, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x18, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x12, 0x4f, 0x0a, 0x10, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x12, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x70, + 0x6f, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x03, 0x0a, 0x0e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, + 0x63, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xef, 0x04, 0x0a, + 0x16, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x22, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x41, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, - 0x26, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, - 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x15, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0xbb, 0x01, 0x0a, 0x14, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, + 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x6d, 0x61, + 0x78, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x6d, + 0x61, 0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6c, 0x67, + 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x68, 0x61, + 0x73, 0x68, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x54, 0x0a, 0x14, 0x70, + 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x50, 0x6f, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, + 0x6f, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xab, + 0x06, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x48, 0x01, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, + 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x05, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xba, 0x03, 0x0a, + 0x14, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3a, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc2, 0x03, 0x0a, 0x1c, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, + 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x1e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x22, 0x64, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x68, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x66, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x4e, 0x0a, 0x1c, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x53, 0x0a, 0x1b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x38, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x75, 0x0a, 0x22, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x22, 0x5d, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x99, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x21, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x72, + 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x5b, + 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x7c, 0x0a, 0x25, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3a, 0x0a, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x26, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, + 0x6c, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x78, 0x0a, + 0x24, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x76, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x5e, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x5b, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x24, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x85, + 0x01, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xa6, 0x01, 0x0a, 0x23, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x07, 0x68, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x2a, 0x79, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, - 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4f, 0x50, 0x10, - 0x00, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, - 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, - 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x5b, - 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x12, 0x16, - 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, - 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x01, - 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, - 0x4b, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x43, - 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x53, - 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, - 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, 0x0a, - 0x0f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x52, 0x55, 0x4e, - 0x10, 0x02, 0x2a, 0xd1, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x4f, 0x52, 0x50, 0x48, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x4c, 0x49, - 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x41, 0x43, 0x4b, - 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x4c, 0x49, 0x56, 0x45, - 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, - 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x47, 0x52, - 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x03, 0x2a, 0xe7, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x1d, 0x52, 0x45, 0x43, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x29, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x82, 0x01, + 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3c, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x63, + 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x49, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x21, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x22, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x18, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 0x64, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x34, 0x0a, 0x16, + 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x70, + 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x22, 0xb3, 0x01, 0x0a, 0x1b, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x77, 0x0a, 0x29, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x2a, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, + 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x15, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, + 0x6c, 0x61, 0x70, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x22, + 0xc6, 0x01, 0x0a, 0x31, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x2f, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0xb0, 0x01, 0x0a, 0x32, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, + 0x70, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x22, 0x88, 0x04, 0x0a, 0x18, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, 0x77, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0b, + 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, + 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb8, 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x04, 0x0a, 0x02, 0x62, + 0x79, 0x22, 0x7a, 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, + 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xc0, 0x01, + 0x0a, 0x33, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x04, 0x0a, 0x02, 0x62, 0x79, + 0x22, 0x82, 0x01, 0x0a, 0x34, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf9, 0x02, 0x0a, 0x12, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x75, 0x6e, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xfa, 0x01, 0x0a, 0x1c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 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, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x81, + 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, + 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x52, 0x07, 0x70, 0x72, 0x65, 0x72, 0x65, + 0x71, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0x85, 0x02, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x64, 0x0a, 0x2a, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, + 0x41, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, + 0x6d, 0x6c, 0x22, 0x6c, 0x0a, 0x32, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x22, 0x49, 0x0a, 0x33, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x22, 0x5e, 0x0a, 0x24, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x18, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, + 0x0f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x79, 0x0a, 0x0f, 0x52, 0x65, 0x63, + 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, + 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x43, 0x4f, 0x4e, + 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, + 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, + 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x5b, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x54, 0x61, 0x6b, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, + 0x02, 0x2a, 0x69, 0x0a, 0x0e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x54, 0x0a, 0x09, + 0x41, 0x72, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x52, 0x47, + 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x52, 0x47, 0x5f, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x52, + 0x47, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, + 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, + 0x11, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x4d, 0x4f, 0x4e, + 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, + 0x49, 0x4f, 0x44, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x02, 0x2a, 0x84, 0x02, 0x0a, 0x18, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x53, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, + 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, + 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, + 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, + 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x05, + 0x2a, 0x96, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x73, 0x69, 0x67, 0x68, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, + 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x54, + 0x45, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, + 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x4e, 0x4f, 0x4d, 0x41, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x45, 0x4e, 0x44, 0x10, 0x03, 0x12, 0x27, 0x0a, 0x23, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x49, 0x53, 0x4b, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, + 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x06, 0x2a, 0xd9, 0x04, 0x0a, 0x15, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2f, 0x0a, 0x2b, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, + 0x4e, 0x54, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, + 0x27, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, + 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x4c, 0x49, 0x43, 0x54, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x46, 0x4c, 0x4f, + 0x4f, 0x52, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x43, 0x45, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, + 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4c, 0x41, 0x54, + 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x4c, 0x4f, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x28, 0x0a, 0x24, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x41, 0x46, 0x45, 0x54, 0x59, 0x5f, 0x46, + 0x4c, 0x4f, 0x4f, 0x52, 0x10, 0x06, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, + 0x2d, 0x0a, 0x29, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, + 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x10, 0x08, 0x12, 0x28, + 0x0a, 0x24, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, + 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x29, 0x0a, 0x25, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x0a, 0x12, 0x2e, 0x0a, 0x2a, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x46, 0x4c, 0x4f, 0x4f, + 0x52, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x43, 0x45, 0x49, 0x4c, + 0x49, 0x4e, 0x47, 0x10, 0x0c, 0x2a, 0xd1, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x52, 0x50, 0x48, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x2c, 0x0a, + 0x28, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, + 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x4c, + 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, + 0x45, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x03, 0x2a, 0xe7, 0x04, 0x0a, 0x14, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x1a, 0x02, 0x08, 0x01, - 0x12, 0x24, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x50, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x43, + 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x1d, + 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x1a, + 0x02, 0x08, 0x01, 0x12, 0x24, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, 0x10, 0x05, 0x12, - 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, 0x56, - 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x28, 0x0a, 0x24, + 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, 0x56, 0x45, 0x44, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, - 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x15, 0x12, 0x32, 0x0a, - 0x2e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, - 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, - 0x16, 0x12, 0x34, 0x0a, 0x30, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, - 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x53, 0x55, - 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x1f, 0x12, 0x31, 0x0a, 0x2d, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, - 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x20, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, + 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, + 0x53, 0x41, 0x56, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, + 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, 0x56, + 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x52, 0x45, 0x43, + 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, + 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x15, + 0x12, 0x32, 0x0a, 0x2e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, + 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x10, 0x16, 0x12, 0x34, 0x0a, 0x30, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, + 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, + 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x1f, 0x12, 0x31, 0x0a, 0x2d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x29, 0x12, 0x21, 0x0a, + 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x20, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x2a, - 0x2a, 0xba, 0x01, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, - 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, - 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, - 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, - 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x04, 0x2a, 0x36, 0x0a, - 0x13, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x41, - 0x49, 0x44, 0x30, 0x10, 0x00, 0x2a, 0x8b, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, - 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, - 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, - 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, - 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x03, 0x2a, 0xa4, 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, - 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x43, 0x52, 0x45, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x45, 0x54, 0x45, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, - 0x4f, 0x44, 0x5f, 0x45, 0x56, 0x49, 0x43, 0x54, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x19, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x28, 0x4e, 0x4f, 0x44, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x44, 0x0a, 0x40, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, - 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x43, - 0x48, 0x45, 0x44, 0x55, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, - 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0xd2, 0x02, 0x0a, - 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, - 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, - 0x45, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x05, 0x12, 0x2b, - 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4d, - 0x4f, 0x56, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, 0x4e, - 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x53, 0x50, - 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x42, - 0x0a, 0x3e, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x49, 0x5a, - 0x45, 0x53, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, - 0x10, 0x14, 0x12, 0x3d, 0x0a, 0x39, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, - 0x5f, 0x49, 0x4e, 0x54, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x54, 0x45, 0x52, - 0x4e, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x49, 0x45, 0x53, 0x10, - 0x19, 0x2a, 0xa5, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x29, + 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, + 0x44, 0x10, 0x2a, 0x2a, 0xba, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, + 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2e, 0x0a, + 0x2a, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x44, 0x5a, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3b, 0x0a, + 0x37, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x5a, 0x5f, + 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, + 0x5f, 0x4e, 0x4f, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4e, + 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, + 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x2a, 0xb5, 0x01, 0x0a, 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x53, 0x45, 0x54, + 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x27, 0x0a, 0x23, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x5f, 0x50, + 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0xb7, 0x02, 0x0a, 0x0f, 0x53, 0x75, 0x67, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x1c, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, + 0x0a, 0x1b, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, + 0x55, 0x50, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, + 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, + 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x43, 0x49, 0x54, 0x59, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x5a, 0x4f, 0x4e, 0x45, 0x53, + 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x53, 0x10, 0x05, 0x12, + 0x1e, 0x0a, 0x1a, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x06, 0x12, + 0x22, 0x0a, 0x1e, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, + 0x59, 0x10, 0x07, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, + 0x10, 0x08, 0x2a, 0x81, 0x02, 0x0a, 0x10, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, + 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, + 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, + 0x43, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x4c, 0x49, + 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, + 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x50, + 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, + 0x52, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, + 0x52, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x50, 0x52, 0x41, 0x43, 0x54, 0x49, 0x43, 0x45, 0x10, + 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x10, 0x06, 0x2a, 0x9c, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x23, 0x0a, + 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x01, + 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x52, + 0x4f, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x64, 0x0a, 0x0d, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, + 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, + 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, + 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, + 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x02, 0x2a, 0xba, 0x01, 0x0a, 0x10, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, + 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, + 0x50, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, + 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, + 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x41, + 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x04, 0x2a, 0x36, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x1f, 0x0a, 0x1b, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, + 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x41, 0x49, 0x44, 0x30, 0x10, 0x00, + 0x2a, 0x8b, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, + 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, + 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, + 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, + 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, + 0x1b, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, + 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa4, + 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, + 0x0a, 0x1e, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, + 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x45, 0x56, + 0x49, 0x43, 0x54, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x28, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, + 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, + 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x44, 0x0a, 0x40, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, + 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, + 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, + 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0xd2, 0x02, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, + 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, + 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, + 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4e, + 0x4f, 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, + 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x42, 0x0a, 0x3e, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x49, + 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x53, 0x5f, 0x57, 0x49, + 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x10, 0x14, 0x12, 0x3d, 0x0a, + 0x39, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x54, 0x52, + 0x4f, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x49, 0x45, 0x53, 0x10, 0x19, 0x2a, 0xa5, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, - 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, - 0x45, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x45, - 0x52, 0x56, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x2a, 0xc3, 0x02, 0x0a, 0x12, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, - 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, - 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, + 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, + 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, + 0x45, 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x24, + 0x0a, 0x20, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x52, 0x56, 0x41, 0x54, 0x49, + 0x56, 0x45, 0x10, 0x03, 0x2a, 0xe9, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x03, 0x12, 0x28, 0x0a, - 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x56, 0x43, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x05, 0x12, 0x25, 0x0a, 0x21, - 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, - 0x45, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, - 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x07, 0x2a, - 0xc7, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, + 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x56, 0x43, 0x5f, 0x53, 0x54, + 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x05, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, + 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, + 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x06, 0x12, 0x2a, + 0x0a, 0x26, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, + 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, + 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x08, + 0x12, 0x2d, 0x0a, 0x29, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x4e, 0x53, 0x49, 0x43, + 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x09, 0x12, + 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x50, 0x41, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x43, + 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x0b, + 0x2a, 0xc7, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, + 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x50, 0x55, 0x10, + 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x2a, 0x74, 0x0a, 0x10, 0x50, 0x76, + 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, + 0x0a, 0x1e, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, - 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, - 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x50, 0x55, 0x10, 0x03, - 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x47, 0x52, - 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, - 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x5f, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x2a, 0x74, 0x0a, 0x10, 0x50, 0x76, 0x63, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, - 0x1e, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x10, 0x01, - 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x52, 0x49, 0x4e, 0x4b, 0x10, 0x02, 0x2a, - 0xe8, 0x02, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x57, - 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, - 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, + 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x10, + 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x52, 0x49, 0x4e, 0x4b, 0x10, 0x02, + 0x2a, 0x9c, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, + 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x12, 0x20, 0x0a, + 0x1c, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, + 0xbe, 0x03, 0x0a, 0x25, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x35, 0x57, 0x4f, 0x52, + 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x36, 0x0a, 0x32, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, + 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x4a, 0x0a, 0x46, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, + 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, + 0x59, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x48, 0x49, 0x53, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x45, 0x0a, 0x41, 0x57, 0x4f, 0x52, 0x4b, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, + 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x03, 0x12, + 0x42, 0x0a, 0x3e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, + 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, + 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, + 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x43, 0x52, + 0x44, 0x10, 0x04, 0x12, 0x4b, 0x0a, 0x47, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, + 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, + 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, + 0x59, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x05, + 0x2a, 0xa8, 0x01, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x55, 0x6e, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, + 0x26, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, + 0x4c, 0x54, 0x48, 0x59, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2d, 0x0a, 0x29, 0x53, 0x43, 0x48, + 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5a, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x31, 0x0a, 0x2d, 0x53, 0x43, 0x48, 0x45, + 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, + 0x4f, 0x44, 0x53, 0x5f, 0x53, 0x54, 0x55, 0x43, 0x4b, 0x10, 0x02, 0x2a, 0xe8, 0x02, 0x0a, 0x12, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x50, 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x05, - 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, - 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, - 0x41, 0x55, 0x54, 0x4f, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x45, 0x52, 0x52, 0x41, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, - 0x07, 0x12, 0x27, 0x0a, 0x23, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, - 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, 0x46, - 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x08, 0x32, 0xaa, 0x69, 0x0a, 0x18, 0x4b, - 0x38, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, + 0x5f, 0x43, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x57, 0x4f, 0x52, 0x4b, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, + 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x55, + 0x41, 0x4c, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, + 0x55, 0x4d, 0x49, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, 0x41, 0x55, 0x54, 0x4f, + 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, + 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x07, 0x12, 0x27, 0x0a, + 0x23, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, 0x46, 0x4f, 0x52, 0x4d, 0x5f, + 0x41, 0x55, 0x54, 0x4f, 0x10, 0x08, 0x2a, 0x91, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, + 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, + 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4e, 0x4f, 0x44, 0x45, + 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, + 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, + 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x2a, 0xa1, 0x01, 0x0a, 0x1a, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x4f, 0x52, + 0x45, 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, + 0x48, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x4f, 0x52, 0x45, + 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, + 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, + 0x12, 0x2c, 0x0a, 0x28, 0x46, 0x4f, 0x52, 0x45, 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, + 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x02, 0x32, 0xe1, + 0xa5, 0x01, 0x0a, 0x18, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x82, - 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, + 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x93, 0x01, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8a, 0x01, 0x0a, + 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8b, 0x01, 0x0a, - 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x4c, 0x69, + 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x93, 0x01, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x79, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8b, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, + 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, - 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, + 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, + 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x2d, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xac, + 0x01, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, + 0x12, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, + 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x7b, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x12, 0x72, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x72, 0x0a, 0x18, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, - 0x12, 0x78, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x29, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x78, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x7b, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0xb4, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0xb4, 0x01, 0x0a, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, - 0x01, 0x12, 0x74, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x90, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x47, 0x65, - 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, - 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, - 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, - 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, - 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, - 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, - 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, - 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1d, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x74, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x90, 0x01, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x7e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, + 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x61, 0x0a, - 0x14, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x61, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x64, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, + 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, - 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, - 0x13, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x18, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, - 0x21, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x6e, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, - 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, - 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, + 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, + 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x2b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x73, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, 0x0a, + 0x25, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, + 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, + 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6a, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x67, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x61, 0x70, + 0x65, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, - 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, - 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x12, - 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, - 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, + 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x52, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, + 0x55, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, + 0x01, 0x0a, 0x24, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, - 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, - 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, + 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, + 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, - 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x28, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, - 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, - 0x01, 0x0a, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x76, + 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, - 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, - 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, + 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, - 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x85, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9a, 0x01, + 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x28, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x85, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x28, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7c, 0x0a, 0x1d, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, - 0x0a, 0x13, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, - 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x12, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, + 0x79, 0x49, 0x44, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x91, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, - 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, - 0x61, 0x6b, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, - 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, - 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, + 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x70, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, + 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x67, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x61, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, + 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x73, 0x0a, 0x1a, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x29, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa9, 0x01, 0x0a, 0x2c, + 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x3b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9a, 0x01, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x2b, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x42, 0x91, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x42, 0x13, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, + 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 0x72, 0x2f, + 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, + 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, + 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -34774,1157 +55504,1768 @@ func file_api_v1_recommendation_proto_rawDescGZIP() []byte { return file_api_v1_recommendation_proto_rawDescData } -var file_api_v1_recommendation_proto_enumTypes = make([]protoimpl.EnumInfo, 16) -var file_api_v1_recommendation_proto_msgTypes = make([]protoimpl.MessageInfo, 390) +var file_api_v1_recommendation_proto_enumTypes = make([]protoimpl.EnumInfo, 35) +var file_api_v1_recommendation_proto_msgTypes = make([]protoimpl.MessageInfo, 602) var file_api_v1_recommendation_proto_goTypes = []interface{}{ (ReconcileStatus)(0), // 0: api.v1.ReconcileStatus (ActionToTake)(0), // 1: api.v1.ActionToTake - (CostPeriod)(0), // 2: api.v1.CostPeriod - (LiveMigDeletionPropagation)(0), // 3: api.v1.LiveMigDeletionPropagation - (RecommendationStatus)(0), // 4: api.v1.RecommendationStatus - (TargetFilterType)(0), // 5: api.v1.TargetFilterType - (InstanceStorePolicy)(0), // 6: api.v1.InstanceStorePolicy - (ActionTrigger)(0), // 7: api.v1.ActionTrigger - (WorkloadDetectionTrigger)(0), // 8: api.v1.WorkloadDetectionTrigger - (NodeGroupDetectionTrigger)(0), // 9: api.v1.NodeGroupDetectionTrigger - (NodeGroupActionsAllowed)(0), // 10: api.v1.NodeGroupActionsAllowed - (RecommendationMode)(0), // 11: api.v1.RecommendationMode - (RecommendationType)(0), // 12: api.v1.RecommendationType - (HPAMetricType)(0), // 13: api.v1.HPAMetricType - (PvcOperationType)(0), // 14: api.v1.PvcOperationType - (WorkloadRuleSource)(0), // 15: api.v1.WorkloadRuleSource - (*GetRecommendationsRequest)(nil), // 16: api.v1.GetRecommendationsRequest - (*GetRecommendationsResponse)(nil), // 17: api.v1.GetRecommendationsResponse - (*GetRecommendationsForWorkloadRequest)(nil), // 18: api.v1.GetRecommendationsForWorkloadRequest - (*GetRecommendationsForWorkloadResponse)(nil), // 19: api.v1.GetRecommendationsForWorkloadResponse - (*GetNodeGroupStatsRequest)(nil), // 20: api.v1.GetNodeGroupStatsRequest - (*GetNodeGroupStatsResponse)(nil), // 21: api.v1.GetNodeGroupStatsResponse - (*GetOptimalInstanceTypeForNodeGroupRequest)(nil), // 22: api.v1.GetOptimalInstanceTypeForNodeGroupRequest - (*GetOptimalInstanceTypeForNodeGroupResponse)(nil), // 23: api.v1.GetOptimalInstanceTypeForNodeGroupResponse - (*GetLatestNodeGroupRecommendationRequest)(nil), // 24: api.v1.GetLatestNodeGroupRecommendationRequest - (*GetLatestNodeGroupRecommendationResponse)(nil), // 25: api.v1.GetLatestNodeGroupRecommendationResponse - (*GetLatestWorkloadRecommendationRequest)(nil), // 26: api.v1.GetLatestWorkloadRecommendationRequest - (*GetLatestWorkloadRecommendationResponse)(nil), // 27: api.v1.GetLatestWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationRequest)(nil), // 28: api.v1.GetPreviewWorkloadRecommendationRequest - (*GetPreviewWorkloadRecommendationResponse)(nil), // 29: api.v1.GetPreviewWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationsRequest)(nil), // 30: api.v1.GetPreviewWorkloadRecommendationsRequest - (*WorkloadIdentifier)(nil), // 31: api.v1.WorkloadIdentifier - (*GetPreviewWorkloadRecommendationsResponse)(nil), // 32: api.v1.GetPreviewWorkloadRecommendationsResponse - (*CreateClusterRecommendationPolicyRequest)(nil), // 33: api.v1.CreateClusterRecommendationPolicyRequest - (*CreateClusterRecommendationPolicyResponse)(nil), // 34: api.v1.CreateClusterRecommendationPolicyResponse - (*GetClusterRecommendationPolicyRequest)(nil), // 35: api.v1.GetClusterRecommendationPolicyRequest - (*GetClusterRecommendationPolicyResponse)(nil), // 36: api.v1.GetClusterRecommendationPolicyResponse - (*ListClusterRecommendationPoliciesRequest)(nil), // 37: api.v1.ListClusterRecommendationPoliciesRequest - (*ListClusterRecommendationPoliciesResponse)(nil), // 38: api.v1.ListClusterRecommendationPoliciesResponse - (*UpdateClusterRecommendationPolicyRequest)(nil), // 39: api.v1.UpdateClusterRecommendationPolicyRequest - (*UpdateClusterRecommendationPolicyResponse)(nil), // 40: api.v1.UpdateClusterRecommendationPolicyResponse - (*DeleteClusterRecommendationPolicyRequest)(nil), // 41: api.v1.DeleteClusterRecommendationPolicyRequest - (*DeleteClusterRecommendationPolicyResponse)(nil), // 42: api.v1.DeleteClusterRecommendationPolicyResponse - (*AttachClusterRecommendationPolicyRequest)(nil), // 43: api.v1.AttachClusterRecommendationPolicyRequest - (*AttachClusterRecommendationPolicyResponse)(nil), // 44: api.v1.AttachClusterRecommendationPolicyResponse - (*GetWorkloadsWithAttachedPolicyTargetsRequest)(nil), // 45: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - (*GetWorkloadsWithAttachedPolicyTargetsResponse)(nil), // 46: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - (*TargetIdList)(nil), // 47: api.v1.TargetIdList - (*CreateNodeGroupRecommendationPolicyRequest)(nil), // 48: api.v1.CreateNodeGroupRecommendationPolicyRequest - (*CreateNodeGroupRecommendationPolicyResponse)(nil), // 49: api.v1.CreateNodeGroupRecommendationPolicyResponse - (*GetNodeGroupRecommendationPolicyRequest)(nil), // 50: api.v1.GetNodeGroupRecommendationPolicyRequest - (*GetNodeGroupRecommendationPolicyResponse)(nil), // 51: api.v1.GetNodeGroupRecommendationPolicyResponse - (*ListNodeGroupRecommendationPoliciesRequest)(nil), // 52: api.v1.ListNodeGroupRecommendationPoliciesRequest - (*ListNodeGroupRecommendationPoliciesResponse)(nil), // 53: api.v1.ListNodeGroupRecommendationPoliciesResponse - (*UpdateNodeGroupRecommendationPolicyRequest)(nil), // 54: api.v1.UpdateNodeGroupRecommendationPolicyRequest - (*UpdateNodeGroupRecommendationPolicyResponse)(nil), // 55: api.v1.UpdateNodeGroupRecommendationPolicyResponse - (*DeleteNodeGroupRecommendationPolicyRequest)(nil), // 56: api.v1.DeleteNodeGroupRecommendationPolicyRequest - (*DeleteNodeGroupRecommendationPolicyResponse)(nil), // 57: api.v1.DeleteNodeGroupRecommendationPolicyResponse - (*AttachNodeGroupRecommendationPolicyRequest)(nil), // 58: api.v1.AttachNodeGroupRecommendationPolicyRequest - (*AttachNodeGroupRecommendationPolicyResponse)(nil), // 59: api.v1.AttachNodeGroupRecommendationPolicyResponse - (*CreateWorkloadRecommendationPolicyRequest)(nil), // 60: api.v1.CreateWorkloadRecommendationPolicyRequest - (*CreateWorkloadRecommendationPolicyResponse)(nil), // 61: api.v1.CreateWorkloadRecommendationPolicyResponse - (*GetWorkloadRecommendationPolicyRequest)(nil), // 62: api.v1.GetWorkloadRecommendationPolicyRequest - (*GetWorkloadRecommendationPolicyResponse)(nil), // 63: api.v1.GetWorkloadRecommendationPolicyResponse - (*ListWorkloadRecommendationPoliciesRequest)(nil), // 64: api.v1.ListWorkloadRecommendationPoliciesRequest - (*ListWorkloadRecommendationPoliciesResponse)(nil), // 65: api.v1.ListWorkloadRecommendationPoliciesResponse - (*UpdateWorkloadRecommendationPolicyRequest)(nil), // 66: api.v1.UpdateWorkloadRecommendationPolicyRequest - (*UpdateWorkloadRecommendationPolicyResponse)(nil), // 67: api.v1.UpdateWorkloadRecommendationPolicyResponse - (*DeleteWorkloadRecommendationPolicyRequest)(nil), // 68: api.v1.DeleteWorkloadRecommendationPolicyRequest - (*DeleteWorkloadRecommendationPolicyResponse)(nil), // 69: api.v1.DeleteWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPolicyRequest)(nil), // 70: api.v1.AttachWorkloadRecommendationPolicyRequest - (*AttachWorkloadRecommendationPolicyResponse)(nil), // 71: api.v1.AttachWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPoliciesRequest)(nil), // 72: api.v1.AttachWorkloadRecommendationPoliciesRequest - (*AttachWorkloadRecommendationPoliciesResponse)(nil), // 73: api.v1.AttachWorkloadRecommendationPoliciesResponse - (*WorkloadPolicyAttachment)(nil), // 74: api.v1.WorkloadPolicyAttachment - (*WorkloadPolicyTarget)(nil), // 75: api.v1.WorkloadPolicyTarget - (*CreateWorkloadPolicyTargetRequest)(nil), // 76: api.v1.CreateWorkloadPolicyTargetRequest - (*CreateWorkloadPolicyTargetResponse)(nil), // 77: api.v1.CreateWorkloadPolicyTargetResponse - (*GetWorkloadPolicyTargetRequest)(nil), // 78: api.v1.GetWorkloadPolicyTargetRequest - (*GetWorkloadPolicyTargetResponse)(nil), // 79: api.v1.GetWorkloadPolicyTargetResponse - (*ListWorkloadPolicyTargetsRequest)(nil), // 80: api.v1.ListWorkloadPolicyTargetsRequest - (*ListWorkloadPolicyTargetsResponse)(nil), // 81: api.v1.ListWorkloadPolicyTargetsResponse - (*UpdateWorkloadPolicyTargetRequest)(nil), // 82: api.v1.UpdateWorkloadPolicyTargetRequest - (*UpdateWorkloadPolicyTargetResponse)(nil), // 83: api.v1.UpdateWorkloadPolicyTargetResponse - (*DeleteWorkloadPolicyTargetRequest)(nil), // 84: api.v1.DeleteWorkloadPolicyTargetRequest - (*ToggleWorkloadPolicyTargetsRequest)(nil), // 85: api.v1.ToggleWorkloadPolicyTargetsRequest - (*ToggleWorkloadPolicyTargetsResponse)(nil), // 86: api.v1.ToggleWorkloadPolicyTargetsResponse - (*DeleteWorkloadPolicyTargetResponse)(nil), // 87: api.v1.DeleteWorkloadPolicyTargetResponse - (*RemoveClusterOptimizationsRequest)(nil), // 88: api.v1.RemoveClusterOptimizationsRequest - (*RemoveClusterOptimizationsResponse)(nil), // 89: api.v1.RemoveClusterOptimizationsResponse - (*PreviewWorkloadPolicyTargetMatchesRequest)(nil), // 90: api.v1.PreviewWorkloadPolicyTargetMatchesRequest - (*PreviewWorkloadPolicyTargetMatchesResponse)(nil), // 91: api.v1.PreviewWorkloadPolicyTargetMatchesResponse - (*GetPreviewWorkloadPolicyTargetRecommendationsRequest)(nil), // 92: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - (*GetPreviewWorkloadPolicyTargetRecommendationsResponse)(nil), // 93: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - (*WorkloadPercentileSummary)(nil), // 94: api.v1.WorkloadPercentileSummary - (*NodeGroupPolicyTarget)(nil), // 95: api.v1.NodeGroupPolicyTarget - (*CreateNodeGroupPolicyTargetRequest)(nil), // 96: api.v1.CreateNodeGroupPolicyTargetRequest - (*CreateNodeGroupPolicyTargetResponse)(nil), // 97: api.v1.CreateNodeGroupPolicyTargetResponse - (*GetNodeGroupPolicyTargetRequest)(nil), // 98: api.v1.GetNodeGroupPolicyTargetRequest - (*GetNodeGroupPolicyTargetResponse)(nil), // 99: api.v1.GetNodeGroupPolicyTargetResponse - (*ListNodeGroupPolicyTargetsRequest)(nil), // 100: api.v1.ListNodeGroupPolicyTargetsRequest - (*ListNodeGroupPolicyTargetsResponse)(nil), // 101: api.v1.ListNodeGroupPolicyTargetsResponse - (*UpdateNodeGroupPolicyTargetRequest)(nil), // 102: api.v1.UpdateNodeGroupPolicyTargetRequest - (*UpdateNodeGroupPolicyTargetResponse)(nil), // 103: api.v1.UpdateNodeGroupPolicyTargetResponse - (*DeleteNodeGroupPolicyTargetRequest)(nil), // 104: api.v1.DeleteNodeGroupPolicyTargetRequest - (*ToggleNodeGroupPolicyTargetsRequest)(nil), // 105: api.v1.ToggleNodeGroupPolicyTargetsRequest - (*ToggleNodeGroupPolicyTargetsResponse)(nil), // 106: api.v1.ToggleNodeGroupPolicyTargetsResponse - (*DeleteNodeGroupPolicyTargetResponse)(nil), // 107: api.v1.DeleteNodeGroupPolicyTargetResponse - (*PreviewNodeGroupPolicyTargetMatchesRequest)(nil), // 108: api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - (*PreviewNodeGroupPolicyTargetMatchesResponse)(nil), // 109: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest)(nil), // 110: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse)(nil), // 111: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - (*BalanceGetRecommendationsRequest)(nil), // 112: api.v1.BalanceGetRecommendationsRequest - (*BalanceGetRecommendationsResponse)(nil), // 113: api.v1.BalanceGetRecommendationsResponse - (*BatchNodeGroupRecommendations)(nil), // 114: api.v1.BatchNodeGroupRecommendations - (*BatchWorkloadRecommendations)(nil), // 115: api.v1.BatchWorkloadRecommendations - (*WorkloadRule)(nil), // 116: api.v1.WorkloadRule - (*ResourceRuleConfig)(nil), // 117: api.v1.ResourceRuleConfig - (*HPAMetricTrigger)(nil), // 118: api.v1.HPAMetricTrigger - (*HPAFallback)(nil), // 119: api.v1.HPAFallback - (*ContainerResourceConfig)(nil), // 120: api.v1.ContainerResourceConfig - (*ContainerResourceRuleConfig)(nil), // 121: api.v1.ContainerResourceRuleConfig - (*HPARuleConfig)(nil), // 122: api.v1.HPARuleConfig - (*EmergencyResponseConfig)(nil), // 123: api.v1.EmergencyResponseConfig - (*PercentileValues)(nil), // 124: api.v1.PercentileValues - (*ResourcePercentiles)(nil), // 125: api.v1.ResourcePercentiles - (*BurstinessRatios)(nil), // 126: api.v1.BurstinessRatios - (*WorkloadClassification)(nil), // 127: api.v1.WorkloadClassification - (*BatchWorkloadRules)(nil), // 128: api.v1.BatchWorkloadRules - (*WorkloadWithActiveRecommendations)(nil), // 129: api.v1.WorkloadWithActiveRecommendations - (*GenericResourceRecommendation)(nil), // 130: api.v1.GenericResourceRecommendation - (*BatchGenericResourceRecommendations)(nil), // 131: api.v1.BatchGenericResourceRecommendations - (*BatchPvcStorageRecommendations)(nil), // 132: api.v1.BatchPvcStorageRecommendations - (*GeneratePodDisruptionBudgetRequest)(nil), // 133: api.v1.GeneratePodDisruptionBudgetRequest - (*GeneratePodDisruptionBudgetResponse)(nil), // 134: api.v1.GeneratePodDisruptionBudgetResponse - (*GenerateAndCreatePodDisruptionBudgetRequest)(nil), // 135: api.v1.GenerateAndCreatePodDisruptionBudgetRequest - (*GenerateAndCreatePodDisruptionBudgetResponse)(nil), // 136: api.v1.GenerateAndCreatePodDisruptionBudgetResponse - (*CreatePodDisruptionBudgetRequest)(nil), // 137: api.v1.CreatePodDisruptionBudgetRequest - (*CreatePodDisruptionBudgetResponse)(nil), // 138: api.v1.CreatePodDisruptionBudgetResponse - (*GetPDBRecommendationForWorkloadRequest)(nil), // 139: api.v1.GetPDBRecommendationForWorkloadRequest - (*GetPDBRecommendationForWorkloadResponse)(nil), // 140: api.v1.GetPDBRecommendationForWorkloadResponse - (*ReconcileWorkload)(nil), // 141: api.v1.ReconcileWorkload - (*ReconcileResponse)(nil), // 142: api.v1.ReconcileResponse - (*OperatorHealth)(nil), // 143: api.v1.OperatorHealth - (*AgentHealth)(nil), // 144: api.v1.AgentHealth - (*AgentHealthMeta)(nil), // 145: api.v1.AgentHealthMeta - (*HealthReport)(nil), // 146: api.v1.HealthReport - (*NodeStats)(nil), // 147: api.v1.NodeStats - (*NodeMetric)(nil), // 148: api.v1.NodeMetric - (*ContainerStats)(nil), // 149: api.v1.ContainerStats - (*ContainerMetric)(nil), // 150: api.v1.ContainerMetric - (*ContainerSummarizedMetric)(nil), // 151: api.v1.ContainerSummarizedMetric - (*Metric)(nil), // 152: api.v1.Metric - (*ContainerRecommendation)(nil), // 153: api.v1.ContainerRecommendation - (*KedaScaledObjectRecommendation)(nil), // 154: api.v1.KedaScaledObjectRecommendation - (*ResourceRecommendation)(nil), // 155: api.v1.ResourceRecommendation - (*Toleration)(nil), // 156: api.v1.Toleration - (*ClusterRecommendationPolicy)(nil), // 157: api.v1.ClusterRecommendationPolicy - (*NodeGroupRecommendationPolicy)(nil), // 158: api.v1.NodeGroupRecommendationPolicy - (*VerticalScalingOptimizationTarget)(nil), // 159: api.v1.VerticalScalingOptimizationTarget - (*HorizontalScalingOptimizationTarget)(nil), // 160: api.v1.HorizontalScalingOptimizationTarget - (*WorkloadRecommendationPolicy)(nil), // 161: api.v1.WorkloadRecommendationPolicy - (*GetPolicyRecommendedDefaultsRequest)(nil), // 162: api.v1.GetPolicyRecommendedDefaultsRequest - (*GetPolicyRecommendedDefaultsResponse)(nil), // 163: api.v1.GetPolicyRecommendedDefaultsResponse - (*BalanceRegisterRequest)(nil), // 164: api.v1.BalanceRegisterRequest - (*BalanceFeatures)(nil), // 165: api.v1.BalanceFeatures - (*BalanceApplyRecommendationResponse)(nil), // 166: api.v1.BalanceApplyRecommendationResponse - (*LiveMigrationResult)(nil), // 167: api.v1.LiveMigrationResult - (*NodeGroupReference)(nil), // 168: api.v1.NodeGroupReference - (*NodeGroupRecommendation)(nil), // 169: api.v1.NodeGroupRecommendation - (*CostImpact)(nil), // 170: api.v1.CostImpact - (*WorkloadRecommendation)(nil), // 171: api.v1.WorkloadRecommendation - (*GetAttachedNodeGroupPoliciesRequest)(nil), // 172: api.v1.GetAttachedNodeGroupPoliciesRequest - (*GetAttachedNodeGroupPoliciesResponse)(nil), // 173: api.v1.GetAttachedNodeGroupPoliciesResponse - (*GetAttachedWorkloadPoliciesRequest)(nil), // 174: api.v1.GetAttachedWorkloadPoliciesRequest - (*GetAttachedWorkloadPoliciesResponse)(nil), // 175: api.v1.GetAttachedWorkloadPoliciesResponse - (*WorkloadRecommendationPolicyGroup)(nil), // 176: api.v1.WorkloadRecommendationPolicyGroup - (*WorkloadPolicyTargetGroup)(nil), // 177: api.v1.WorkloadPolicyTargetGroup - (*WorkloadIdentifiers)(nil), // 178: api.v1.WorkloadIdentifiers - (*WorkloadPolicies)(nil), // 179: api.v1.WorkloadPolicies - (*ListAttachedWorkloadPoliciesRequest)(nil), // 180: api.v1.ListAttachedWorkloadPoliciesRequest - (*ListAttachedWorkloadPoliciesResponse)(nil), // 181: api.v1.ListAttachedWorkloadPoliciesResponse - (*ListAttachedNodeGroupPoliciesRequest)(nil), // 182: api.v1.ListAttachedNodeGroupPoliciesRequest - (*ListAttachedNodeGroupPoliciesResponse)(nil), // 183: api.v1.ListAttachedNodeGroupPoliciesResponse - (*NodeGroupItem)(nil), // 184: api.v1.NodeGroupItem - (*RecommendationAppliedRequest)(nil), // 185: api.v1.RecommendationAppliedRequest - (*RecommendationAppliedResponse)(nil), // 186: api.v1.RecommendationAppliedResponse - (*ApplyRecommendationRequest)(nil), // 187: api.v1.ApplyRecommendationRequest - (*ApplyRecommendationResponse)(nil), // 188: api.v1.ApplyRecommendationResponse - (*RecommendationEventsRequest)(nil), // 189: api.v1.RecommendationEventsRequest - (*RecommendationEventsResponse)(nil), // 190: api.v1.RecommendationEventsResponse - (*RetrieveSavingsForWorkloadRequest)(nil), // 191: api.v1.RetrieveSavingsForWorkloadRequest - (*RetrieveSavingsForWorkloadResponse)(nil), // 192: api.v1.RetrieveSavingsForWorkloadResponse - (*CreateNodePoliciesRequest)(nil), // 193: api.v1.CreateNodePoliciesRequest - (*CreateNodePoliciesResponse)(nil), // 194: api.v1.CreateNodePoliciesResponse - (*SuggestedNodePolicyRequest)(nil), // 195: api.v1.SuggestedNodePolicyRequest - (*SuggestedNodePolicyResponse)(nil), // 196: api.v1.SuggestedNodePolicyResponse - (*GenerateNodePoliciesFromKarpenterRequest)(nil), // 197: api.v1.GenerateNodePoliciesFromKarpenterRequest - (*GenerateNodePoliciesFromKarpenterResponse)(nil), // 198: api.v1.GenerateNodePoliciesFromKarpenterResponse - (*GenerateNodePoliciesFromNodeGroupsRequest)(nil), // 199: api.v1.GenerateNodePoliciesFromNodeGroupsRequest - (*GenerateNodePoliciesFromNodeGroupsResponse)(nil), // 200: api.v1.GenerateNodePoliciesFromNodeGroupsResponse - (*GetNodeAnnotationReadinessRequest)(nil), // 201: api.v1.GetNodeAnnotationReadinessRequest - (*GetNodeAnnotationReadinessResponse)(nil), // 202: api.v1.GetNodeAnnotationReadinessResponse - (*GetMigrationStateRequest)(nil), // 203: api.v1.GetMigrationStateRequest - (*GetMigrationStateResponse)(nil), // 204: api.v1.GetMigrationStateResponse - (*UpdateMigrationStateRequest)(nil), // 205: api.v1.UpdateMigrationStateRequest - (*UpdateMigrationStateResponse)(nil), // 206: api.v1.UpdateMigrationStateResponse - (*ReportNodePoolValidationRequest)(nil), // 207: api.v1.ReportNodePoolValidationRequest - (*ReportNodePoolValidationResponse)(nil), // 208: api.v1.ReportNodePoolValidationResponse - (*GetNodePoolValidationsRequest)(nil), // 209: api.v1.GetNodePoolValidationsRequest - (*NodePoolValidationReport)(nil), // 210: api.v1.NodePoolValidationReport - (*GetNodePoolValidationsResponse)(nil), // 211: api.v1.GetNodePoolValidationsResponse - (*WorkloadCompatibilityWarning)(nil), // 212: api.v1.WorkloadCompatibilityWarning - (*ListNodePoliciesRequest)(nil), // 213: api.v1.ListNodePoliciesRequest - (*ListNodePoliciesResponse)(nil), // 214: api.v1.ListNodePoliciesResponse - (*UpdateNodePolicyRequest)(nil), // 215: api.v1.UpdateNodePolicyRequest - (*UpdateNodePolicyResponse)(nil), // 216: api.v1.UpdateNodePolicyResponse - (*DeleteNodePolicyRequest)(nil), // 217: api.v1.DeleteNodePolicyRequest - (*DeleteNodePolicyResponse)(nil), // 218: api.v1.DeleteNodePolicyResponse - (*NodePolicy)(nil), // 219: api.v1.NodePolicy - (*PreviewNodeRecommendationConfigRequest)(nil), // 220: api.v1.PreviewNodeRecommendationConfigRequest - (*PreviewNodeRecommendationConfigResponse)(nil), // 221: api.v1.PreviewNodeRecommendationConfigResponse - (*NodeRecommendationConfig)(nil), // 222: api.v1.NodeRecommendationConfig - (*SuggestedKarpenterConfigRequest)(nil), // 223: api.v1.SuggestedKarpenterConfigRequest - (*SuggestedKarpenterConfigResponse)(nil), // 224: api.v1.SuggestedKarpenterConfigResponse - (*GetAvailableKindsByTargetingFiltersRequest)(nil), // 225: api.v1.GetAvailableKindsByTargetingFiltersRequest - (*SearchResourcesByTargetingFiltersRequest)(nil), // 226: api.v1.SearchResourcesByTargetingFiltersRequest - (*TargetFilters)(nil), // 227: api.v1.TargetFilters - (*GetAvailableKindsByTargetingFiltersResponse)(nil), // 228: api.v1.GetAvailableKindsByTargetingFiltersResponse - (*SearchResourcesByTargetingFiltersResponse)(nil), // 229: api.v1.SearchResourcesByTargetingFiltersResponse - (*NamespaceSearchResult)(nil), // 230: api.v1.NamespaceSearchResult - (*WorkloadSearchResult)(nil), // 231: api.v1.WorkloadSearchResult - (*NodeGroupSearchResult)(nil), // 232: api.v1.NodeGroupSearchResult - (*LabelSearchResult)(nil), // 233: api.v1.LabelSearchResult - (*CreateNodePolicyTargetsRequest)(nil), // 234: api.v1.CreateNodePolicyTargetsRequest - (*CreateNodePolicyTargetsResponse)(nil), // 235: api.v1.CreateNodePolicyTargetsResponse - (*ListNodePolicyTargetsRequest)(nil), // 236: api.v1.ListNodePolicyTargetsRequest - (*ListNodePolicyTargetsResponse)(nil), // 237: api.v1.ListNodePolicyTargetsResponse - (*UpdateNodePolicyTargetRequest)(nil), // 238: api.v1.UpdateNodePolicyTargetRequest - (*UpdateNodePolicyTargetResponse)(nil), // 239: api.v1.UpdateNodePolicyTargetResponse - (*NodePolicyTarget)(nil), // 240: api.v1.NodePolicyTarget - (*NodePolicyCondition)(nil), // 241: api.v1.NodePolicyCondition - (*NodePolicyTargetStatus)(nil), // 242: api.v1.NodePolicyTargetStatus - (*ZonalShiftConfig)(nil), // 243: api.v1.ZonalShiftConfig - (*Taint)(nil), // 244: api.v1.Taint - (*DisruptionBudget)(nil), // 245: api.v1.DisruptionBudget - (*DisruptionPolicy)(nil), // 246: api.v1.DisruptionPolicy - (*ResourceLimits)(nil), // 247: api.v1.ResourceLimits - (*AWSNodeClassSpec)(nil), // 248: api.v1.AWSNodeClassSpec - (*GetInstanceFamiliesRequest)(nil), // 249: api.v1.GetInstanceFamiliesRequest - (*GetInstanceFamiliesResponse)(nil), // 250: api.v1.GetInstanceFamiliesResponse - (*GetInstanceSizesRequest)(nil), // 251: api.v1.GetInstanceSizesRequest - (*GetInstanceSizesResponse)(nil), // 252: api.v1.GetInstanceSizesResponse - (*InstanceFamily)(nil), // 253: api.v1.InstanceFamily - (*InstanceSize)(nil), // 254: api.v1.InstanceSize - (*InstanceCategory)(nil), // 255: api.v1.InstanceCategory - (*InstanceCPU)(nil), // 256: api.v1.InstanceCPU - (*InstanceTypeName)(nil), // 257: api.v1.InstanceTypeName - (*GetInstanceCategoriesRequest)(nil), // 258: api.v1.GetInstanceCategoriesRequest - (*GetInstanceCategoriesResponse)(nil), // 259: api.v1.GetInstanceCategoriesResponse - (*GetInstanceCPUsRequest)(nil), // 260: api.v1.GetInstanceCPUsRequest - (*GetInstanceCPUsResponse)(nil), // 261: api.v1.GetInstanceCPUsResponse - (*GetInstanceTypeNamesRequest)(nil), // 262: api.v1.GetInstanceTypeNamesRequest - (*GetInstanceTypeNamesResponse)(nil), // 263: api.v1.GetInstanceTypeNamesResponse - (*SubnetSelectorTerm)(nil), // 264: api.v1.SubnetSelectorTerm - (*SecurityGroupSelectorTerm)(nil), // 265: api.v1.SecurityGroupSelectorTerm - (*CapacityReservationSelectorTerm)(nil), // 266: api.v1.CapacityReservationSelectorTerm - (*AMISelectorTerm)(nil), // 267: api.v1.AMISelectorTerm - (*KubeletConfiguration)(nil), // 268: api.v1.KubeletConfiguration - (*BlockDeviceMapping)(nil), // 269: api.v1.BlockDeviceMapping - (*BlockDevice)(nil), // 270: api.v1.BlockDevice - (*MetadataOptions)(nil), // 271: api.v1.MetadataOptions - (*GCPNodeClassSpec)(nil), // 272: api.v1.GCPNodeClassSpec - (*GCPImageSelectorTerm)(nil), // 273: api.v1.GCPImageSelectorTerm - (*GCPDisk)(nil), // 274: api.v1.GCPDisk - (*AzureNodeClassSpec)(nil), // 275: api.v1.AzureNodeClassSpec - (*AzureKubeletConfiguration)(nil), // 276: api.v1.AzureKubeletConfiguration - (*OCIImageSelectorTerm)(nil), // 277: api.v1.OCIImageSelectorTerm - (*OCISubnetSelectorTerm)(nil), // 278: api.v1.OCISubnetSelectorTerm - (*OCISecurityGroupSelectorTerm)(nil), // 279: api.v1.OCISecurityGroupSelectorTerm - (*OCIBootConfig)(nil), // 280: api.v1.OCIBootConfig - (*OCILaunchOptions)(nil), // 281: api.v1.OCILaunchOptions - (*OCIVolumeAttributes)(nil), // 282: api.v1.OCIVolumeAttributes - (*OCINodeClassSpec)(nil), // 283: api.v1.OCINodeClassSpec - (*KarpenterSettingsRecommendation)(nil), // 284: api.v1.KarpenterSettingsRecommendation - (*RawKarpenterSpec)(nil), // 285: api.v1.RawKarpenterSpec - (*NodeRecommendation)(nil), // 286: api.v1.NodeRecommendation - (*AWSKarpenterSpec)(nil), // 287: api.v1.AWSKarpenterSpec - (*AKSKarpenterSpec)(nil), // 288: api.v1.AKSKarpenterSpec - (*NodePool)(nil), // 289: api.v1.NodePool - (*EC2NodeClass)(nil), // 290: api.v1.EC2NodeClass - (*AKSNodeClass)(nil), // 291: api.v1.AKSNodeClass - (*GCPKarpenterSpec)(nil), // 292: api.v1.GCPKarpenterSpec - (*GCENodeClass)(nil), // 293: api.v1.GCENodeClass - (*OCIKarpenterSpec)(nil), // 294: api.v1.OCIKarpenterSpec - (*OCINodeClass)(nil), // 295: api.v1.OCINodeClass - (*StorageRecommendationPolicy)(nil), // 296: api.v1.StorageRecommendationPolicy - (*CreateStorageRecommendationPolicyRequest)(nil), // 297: api.v1.CreateStorageRecommendationPolicyRequest - (*CreateStorageRecommendationPolicyResponse)(nil), // 298: api.v1.CreateStorageRecommendationPolicyResponse - (*GetStorageRecommendationPolicyRequest)(nil), // 299: api.v1.GetStorageRecommendationPolicyRequest - (*GetStorageRecommendationPolicyResponse)(nil), // 300: api.v1.GetStorageRecommendationPolicyResponse - (*ListStorageRecommendationPoliciesRequest)(nil), // 301: api.v1.ListStorageRecommendationPoliciesRequest - (*ListStorageRecommendationPoliciesResponse)(nil), // 302: api.v1.ListStorageRecommendationPoliciesResponse - (*UpdateStorageRecommendationPolicyRequest)(nil), // 303: api.v1.UpdateStorageRecommendationPolicyRequest - (*UpdateStorageRecommendationPolicyResponse)(nil), // 304: api.v1.UpdateStorageRecommendationPolicyResponse - (*DeleteStorageRecommendationPolicyRequest)(nil), // 305: api.v1.DeleteStorageRecommendationPolicyRequest - (*DeleteStorageRecommendationPolicyResponse)(nil), // 306: api.v1.DeleteStorageRecommendationPolicyResponse - (*StoragePolicyTarget)(nil), // 307: api.v1.StoragePolicyTarget - (*CreateStoragePolicyTargetRequest)(nil), // 308: api.v1.CreateStoragePolicyTargetRequest - (*CreateStoragePolicyTargetResponse)(nil), // 309: api.v1.CreateStoragePolicyTargetResponse - (*ListStoragePolicyTargetsRequest)(nil), // 310: api.v1.ListStoragePolicyTargetsRequest - (*ListStoragePolicyTargetsResponse)(nil), // 311: api.v1.ListStoragePolicyTargetsResponse - (*UpdateStoragePolicyTargetRequest)(nil), // 312: api.v1.UpdateStoragePolicyTargetRequest - (*UpdateStoragePolicyTargetResponse)(nil), // 313: api.v1.UpdateStoragePolicyTargetResponse - (*DeleteStoragePolicyTargetRequest)(nil), // 314: api.v1.DeleteStoragePolicyTargetRequest - (*DeleteStoragePolicyTargetResponse)(nil), // 315: api.v1.DeleteStoragePolicyTargetResponse - (*PvcStorageRecommendation)(nil), // 316: api.v1.PvcStorageRecommendation - (*GetPvcStorageRecommendationRequest)(nil), // 317: api.v1.GetPvcStorageRecommendationRequest - (*GetPvcStorageRecommendationResponse)(nil), // 318: api.v1.GetPvcStorageRecommendationResponse - (*ListPvcStorageRecommendationsRequest)(nil), // 319: api.v1.ListPvcStorageRecommendationsRequest - (*ListPvcStorageRecommendationsResponse)(nil), // 320: api.v1.ListPvcStorageRecommendationsResponse - (*GeneratePvcStorageRecommendationRequest)(nil), // 321: api.v1.GeneratePvcStorageRecommendationRequest - (*GeneratePvcStorageRecommendationResponse)(nil), // 322: api.v1.GeneratePvcStorageRecommendationResponse - (*PreviewPvcStorageRecommendationRequest)(nil), // 323: api.v1.PreviewPvcStorageRecommendationRequest - (*PreviewPvcStorageRecommendationResponse)(nil), // 324: api.v1.PreviewPvcStorageRecommendationResponse - (*WorkloadRuleOOMEvent)(nil), // 325: api.v1.WorkloadRuleOOMEvent - (*ListWorkloadRuleOOMEventsRequest)(nil), // 326: api.v1.ListWorkloadRuleOOMEventsRequest - (*ListWorkloadRuleOOMEventsResponse)(nil), // 327: api.v1.ListWorkloadRuleOOMEventsResponse - (*ListWorkloadOOMEventsRequest)(nil), // 328: api.v1.ListWorkloadOOMEventsRequest - (*ListWorkloadOOMEventsResponse)(nil), // 329: api.v1.ListWorkloadOOMEventsResponse - (*WorkloadRuleCPUThrottleEvent)(nil), // 330: api.v1.WorkloadRuleCPUThrottleEvent - (*ListWorkloadRuleCPUThrottleEventsRequest)(nil), // 331: api.v1.ListWorkloadRuleCPUThrottleEventsRequest - (*ListWorkloadRuleCPUThrottleEventsResponse)(nil), // 332: api.v1.ListWorkloadRuleCPUThrottleEventsResponse - (*ListWorkloadCPUThrottleEventsRequest)(nil), // 333: api.v1.ListWorkloadCPUThrottleEventsRequest - (*ListWorkloadCPUThrottleEventsResponse)(nil), // 334: api.v1.ListWorkloadCPUThrottleEventsResponse - (*WorkloadOptimizationPolicyProto)(nil), // 335: api.v1.WorkloadOptimizationPolicyProto - (*CreateWorkloadOptimizationPolicyRequest)(nil), // 336: api.v1.CreateWorkloadOptimizationPolicyRequest - (*CreateWorkloadOptimizationPolicyResponse)(nil), // 337: api.v1.CreateWorkloadOptimizationPolicyResponse - (*ListWorkloadOptimizationPoliciesRequest)(nil), // 338: api.v1.ListWorkloadOptimizationPoliciesRequest - (*ListWorkloadOptimizationPoliciesResponse)(nil), // 339: api.v1.ListWorkloadOptimizationPoliciesResponse - (*GetWorkloadOptimizationPolicyRequest)(nil), // 340: api.v1.GetWorkloadOptimizationPolicyRequest - (*GetWorkloadOptimizationPolicyResponse)(nil), // 341: api.v1.GetWorkloadOptimizationPolicyResponse - (*UpdateWorkloadOptimizationPolicyRequest)(nil), // 342: api.v1.UpdateWorkloadOptimizationPolicyRequest - (*UpdateWorkloadOptimizationPolicyResponse)(nil), // 343: api.v1.UpdateWorkloadOptimizationPolicyResponse - (*DeleteWorkloadOptimizationPolicyRequest)(nil), // 344: api.v1.DeleteWorkloadOptimizationPolicyRequest - (*DeleteWorkloadOptimizationPolicyResponse)(nil), // 345: api.v1.DeleteWorkloadOptimizationPolicyResponse - (*GetWorkloadRulesByPolicyRequest)(nil), // 346: api.v1.GetWorkloadRulesByPolicyRequest - (*GetWorkloadRulesByPolicyResponse)(nil), // 347: api.v1.GetWorkloadRulesByPolicyResponse - (*ListWorkloadRulesRequest)(nil), // 348: api.v1.ListWorkloadRulesRequest - (*ListWorkloadRulesResponse)(nil), // 349: api.v1.ListWorkloadRulesResponse - (*GetWorkloadRuleByIDRequest)(nil), // 350: api.v1.GetWorkloadRuleByIDRequest - (*GetWorkloadRuleByIDResponse)(nil), // 351: api.v1.GetWorkloadRuleByIDResponse - (*GetWorkloadRuleByWorkloadRequest)(nil), // 352: api.v1.GetWorkloadRuleByWorkloadRequest - (*GetWorkloadRuleByWorkloadResponse)(nil), // 353: api.v1.GetWorkloadRuleByWorkloadResponse - (*GetWorkloadByWorkloadRuleRequest)(nil), // 354: api.v1.GetWorkloadByWorkloadRuleRequest - (*GetWorkloadByWorkloadRuleResponse)(nil), // 355: api.v1.GetWorkloadByWorkloadRuleResponse - (*DeleteWorkloadRuleRequest)(nil), // 356: api.v1.DeleteWorkloadRuleRequest - (*DeleteWorkloadRuleResponse)(nil), // 357: api.v1.DeleteWorkloadRuleResponse - (*ManualRuleFields)(nil), // 358: api.v1.ManualRuleFields - (*UpsertManualWorkloadRuleRequest)(nil), // 359: api.v1.UpsertManualWorkloadRuleRequest - (*UpsertManualWorkloadRuleResponse)(nil), // 360: api.v1.UpsertManualWorkloadRuleResponse - (*PreviewWorkloadRuleRequest)(nil), // 361: api.v1.PreviewWorkloadRuleRequest - (*PreviewWorkloadRuleResponse)(nil), // 362: api.v1.PreviewWorkloadRuleResponse - (*GetWorkloadContainerNamesRequest)(nil), // 363: api.v1.GetWorkloadContainerNamesRequest - (*GetWorkloadContainerNamesResponse)(nil), // 364: api.v1.GetWorkloadContainerNamesResponse - (*BatchAutoOptimizeWorkload)(nil), // 365: api.v1.BatchAutoOptimizeWorkload - (*BatchAutoOptimizeWorkloadsRequest)(nil), // 366: api.v1.BatchAutoOptimizeWorkloadsRequest - (*BatchAutoOptimizeWorkloadResult)(nil), // 367: api.v1.BatchAutoOptimizeWorkloadResult - (*BatchAutoOptimizeWorkloadsResponse)(nil), // 368: api.v1.BatchAutoOptimizeWorkloadsResponse - (*WorkloadProfileManifest)(nil), // 369: api.v1.WorkloadProfileManifest - (*BatchWorkloadProfiles)(nil), // 370: api.v1.BatchWorkloadProfiles - (*NodeConfigApplyEvent)(nil), // 371: api.v1.NodeConfigApplyEvent - (*GetNodeRecommendationStatusRequest)(nil), // 372: api.v1.GetNodeRecommendationStatusRequest - (*GetNodeRecommendationStatusResponse)(nil), // 373: api.v1.GetNodeRecommendationStatusResponse - nil, // 374: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - nil, // 375: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - nil, // 376: api.v1.HPAMetricTrigger.MetadataEntry - nil, // 377: api.v1.AgentHealth.NodeNameToAgentEntry - nil, // 378: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - nil, // 379: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - nil, // 380: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - nil, // 381: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - nil, // 382: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - nil, // 383: api.v1.NodePolicy.LabelsEntry - nil, // 384: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - nil, // 385: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - nil, // 386: api.v1.AWSNodeClassSpec.TagsEntry - nil, // 387: api.v1.SubnetSelectorTerm.TagsEntry - nil, // 388: api.v1.SecurityGroupSelectorTerm.TagsEntry - nil, // 389: api.v1.CapacityReservationSelectorTerm.TagsEntry - nil, // 390: api.v1.AMISelectorTerm.TagsEntry - nil, // 391: api.v1.KubeletConfiguration.SystemReservedEntry - nil, // 392: api.v1.KubeletConfiguration.KubeReservedEntry - nil, // 393: api.v1.KubeletConfiguration.EvictionHardEntry - nil, // 394: api.v1.KubeletConfiguration.EvictionSoftEntry - nil, // 395: api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - nil, // 396: api.v1.GCPNodeClassSpec.LabelsEntry - nil, // 397: api.v1.GCPNodeClassSpec.MetadataEntry - nil, // 398: api.v1.AzureNodeClassSpec.TagsEntry - nil, // 399: api.v1.OCINodeClassSpec.MetaDataEntry - nil, // 400: api.v1.OCINodeClassSpec.TagsEntry - nil, // 401: api.v1.OCINodeClassSpec.FreeFormTagsEntry - nil, // 402: api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - nil, // 403: api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - nil, // 404: api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - nil, // 405: api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - (*timestamppb.Timestamp)(nil), // 406: google.protobuf.Timestamp - (*WorkloadFilters)(nil), // 407: api.v1.WorkloadFilters - (*Pagination)(nil), // 408: api.v1.Pagination - (K8SObjectKind)(0), // 409: api.v1.K8sObjectKind - (*durationpb.Duration)(nil), // 410: google.protobuf.Duration - (*LabelSelector)(nil), // 411: api.v1.LabelSelector - (*RegexPattern)(nil), // 412: api.v1.RegexPattern - (*WorkloadItem)(nil), // 413: api.v1.WorkloadItem - (*MetricPercentiles)(nil), // 414: api.v1.MetricPercentiles - (*NodeGroup)(nil), // 415: api.v1.NodeGroup - (*HPABehavior)(nil), // 416: api.v1.HPABehavior - (*money.Money)(nil), // 417: google.type.Money - (*SavingsTimeSeries)(nil), // 418: api.v1.SavingsTimeSeries - (*GetWorkloadResponse)(nil), // 419: api.v1.GetWorkloadResponse - (*CloudProvider)(nil), // 420: api.v1.CloudProvider - (*WorkloadProfileResult)(nil), // 421: api.v1.WorkloadProfileResult - (ProfileWindow)(0), // 422: api.v1.ProfileWindow - (*ProfileKey)(nil), // 423: api.v1.ProfileKey - (*WorkloadProfileSnapshot)(nil), // 424: api.v1.WorkloadProfileSnapshot + (MutationAction)(0), // 2: api.v1.MutationAction + (ArgTarget)(0), // 3: api.v1.ArgTarget + (CostPeriod)(0), // 4: api.v1.CostPeriod + (ReasoningInsightSeverity)(0), // 5: api.v1.ReasoningInsightSeverity + (ReasoningInsightType)(0), // 6: api.v1.ReasoningInsightType + (ReasoningDecisionKind)(0), // 7: api.v1.ReasoningDecisionKind + (LiveMigDeletionPropagation)(0), // 8: api.v1.LiveMigDeletionPropagation + (RecommendationStatus)(0), // 9: api.v1.RecommendationStatus + (NodeGroupCheckpointState)(0), // 10: api.v1.NodeGroupCheckpointState + (CheckpointReason)(0), // 11: api.v1.CheckpointReason + (SuggestionGroup)(0), // 12: api.v1.SuggestionGroup + (SuggestionFlavor)(0), // 13: api.v1.SuggestionFlavor + (SuggestionSeverity)(0), // 14: api.v1.SuggestionSeverity + (EvidenceScope)(0), // 15: api.v1.EvidenceScope + (TargetFilterType)(0), // 16: api.v1.TargetFilterType + (InstanceStorePolicy)(0), // 17: api.v1.InstanceStorePolicy + (ActionTrigger)(0), // 18: api.v1.ActionTrigger + (WorkloadDetectionTrigger)(0), // 19: api.v1.WorkloadDetectionTrigger + (NodeGroupDetectionTrigger)(0), // 20: api.v1.NodeGroupDetectionTrigger + (NodeGroupActionsAllowed)(0), // 21: api.v1.NodeGroupActionsAllowed + (RecommendationMode)(0), // 22: api.v1.RecommendationMode + (RecommendationType)(0), // 23: api.v1.RecommendationType + (HPAMetricType)(0), // 24: api.v1.HPAMetricType + (PvcOperationType)(0), // 25: api.v1.PvcOperationType + (WorkloadRuleAction)(0), // 26: api.v1.WorkloadRuleAction + (WorkloadOptimizationPolicyMatchStatus)(0), // 27: api.v1.WorkloadOptimizationPolicyMatchStatus + (SchedulerUnhealthyReason)(0), // 28: api.v1.SchedulerUnhealthyReason + (WorkloadRuleSource)(0), // 29: api.v1.WorkloadRuleSource + (NodeCheckpointLabelState)(0), // 30: api.v1.NodeCheckpointLabelState + (ForensicPostSnapshotAction)(0), // 31: api.v1.ForensicPostSnapshotAction + (DeleteSchedulerPolicyResponse_Outcome)(0), // 32: api.v1.DeleteSchedulerPolicyResponse.Outcome + (SchedulerPolicyTargetMatch_Status)(0), // 33: api.v1.SchedulerPolicyTargetMatch.Status + (SchedulerPolicyEnrollment_State)(0), // 34: api.v1.SchedulerPolicyEnrollment.State + (*GetRecommendationsRequest)(nil), // 35: api.v1.GetRecommendationsRequest + (*GetRecommendationsResponse)(nil), // 36: api.v1.GetRecommendationsResponse + (*GetRecommendationsForWorkloadRequest)(nil), // 37: api.v1.GetRecommendationsForWorkloadRequest + (*GetRecommendationsForWorkloadResponse)(nil), // 38: api.v1.GetRecommendationsForWorkloadResponse + (*GetNodeGroupStatsRequest)(nil), // 39: api.v1.GetNodeGroupStatsRequest + (*GetNodeGroupStatsResponse)(nil), // 40: api.v1.GetNodeGroupStatsResponse + (*GetOptimalInstanceTypeForNodeGroupRequest)(nil), // 41: api.v1.GetOptimalInstanceTypeForNodeGroupRequest + (*GetOptimalInstanceTypeForNodeGroupResponse)(nil), // 42: api.v1.GetOptimalInstanceTypeForNodeGroupResponse + (*GetLatestNodeGroupRecommendationRequest)(nil), // 43: api.v1.GetLatestNodeGroupRecommendationRequest + (*GetLatestNodeGroupRecommendationResponse)(nil), // 44: api.v1.GetLatestNodeGroupRecommendationResponse + (*GetLatestWorkloadRecommendationRequest)(nil), // 45: api.v1.GetLatestWorkloadRecommendationRequest + (*GetLatestWorkloadRecommendationResponse)(nil), // 46: api.v1.GetLatestWorkloadRecommendationResponse + (*GetPreviewWorkloadRecommendationRequest)(nil), // 47: api.v1.GetPreviewWorkloadRecommendationRequest + (*GetPreviewWorkloadRecommendationResponse)(nil), // 48: api.v1.GetPreviewWorkloadRecommendationResponse + (*GetPreviewWorkloadRecommendationsRequest)(nil), // 49: api.v1.GetPreviewWorkloadRecommendationsRequest + (*WorkloadIdentifier)(nil), // 50: api.v1.WorkloadIdentifier + (*GetPreviewWorkloadRecommendationsResponse)(nil), // 51: api.v1.GetPreviewWorkloadRecommendationsResponse + (*CreateClusterRecommendationPolicyRequest)(nil), // 52: api.v1.CreateClusterRecommendationPolicyRequest + (*CreateClusterRecommendationPolicyResponse)(nil), // 53: api.v1.CreateClusterRecommendationPolicyResponse + (*GetClusterRecommendationPolicyRequest)(nil), // 54: api.v1.GetClusterRecommendationPolicyRequest + (*GetClusterRecommendationPolicyResponse)(nil), // 55: api.v1.GetClusterRecommendationPolicyResponse + (*ListClusterRecommendationPoliciesRequest)(nil), // 56: api.v1.ListClusterRecommendationPoliciesRequest + (*ListClusterRecommendationPoliciesResponse)(nil), // 57: api.v1.ListClusterRecommendationPoliciesResponse + (*UpdateClusterRecommendationPolicyRequest)(nil), // 58: api.v1.UpdateClusterRecommendationPolicyRequest + (*UpdateClusterRecommendationPolicyResponse)(nil), // 59: api.v1.UpdateClusterRecommendationPolicyResponse + (*DeleteClusterRecommendationPolicyRequest)(nil), // 60: api.v1.DeleteClusterRecommendationPolicyRequest + (*DeleteClusterRecommendationPolicyResponse)(nil), // 61: api.v1.DeleteClusterRecommendationPolicyResponse + (*AttachClusterRecommendationPolicyRequest)(nil), // 62: api.v1.AttachClusterRecommendationPolicyRequest + (*AttachClusterRecommendationPolicyResponse)(nil), // 63: api.v1.AttachClusterRecommendationPolicyResponse + (*GetWorkloadsWithAttachedPolicyTargetsRequest)(nil), // 64: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest + (*GetWorkloadsWithAttachedPolicyTargetsResponse)(nil), // 65: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse + (*TargetIdList)(nil), // 66: api.v1.TargetIdList + (*CreateNodeGroupRecommendationPolicyRequest)(nil), // 67: api.v1.CreateNodeGroupRecommendationPolicyRequest + (*CreateNodeGroupRecommendationPolicyResponse)(nil), // 68: api.v1.CreateNodeGroupRecommendationPolicyResponse + (*GetNodeGroupRecommendationPolicyRequest)(nil), // 69: api.v1.GetNodeGroupRecommendationPolicyRequest + (*GetNodeGroupRecommendationPolicyResponse)(nil), // 70: api.v1.GetNodeGroupRecommendationPolicyResponse + (*ListNodeGroupRecommendationPoliciesRequest)(nil), // 71: api.v1.ListNodeGroupRecommendationPoliciesRequest + (*ListNodeGroupRecommendationPoliciesResponse)(nil), // 72: api.v1.ListNodeGroupRecommendationPoliciesResponse + (*UpdateNodeGroupRecommendationPolicyRequest)(nil), // 73: api.v1.UpdateNodeGroupRecommendationPolicyRequest + (*UpdateNodeGroupRecommendationPolicyResponse)(nil), // 74: api.v1.UpdateNodeGroupRecommendationPolicyResponse + (*DeleteNodeGroupRecommendationPolicyRequest)(nil), // 75: api.v1.DeleteNodeGroupRecommendationPolicyRequest + (*DeleteNodeGroupRecommendationPolicyResponse)(nil), // 76: api.v1.DeleteNodeGroupRecommendationPolicyResponse + (*AttachNodeGroupRecommendationPolicyRequest)(nil), // 77: api.v1.AttachNodeGroupRecommendationPolicyRequest + (*AttachNodeGroupRecommendationPolicyResponse)(nil), // 78: api.v1.AttachNodeGroupRecommendationPolicyResponse + (*CreateWorkloadRecommendationPolicyRequest)(nil), // 79: api.v1.CreateWorkloadRecommendationPolicyRequest + (*CreateWorkloadRecommendationPolicyResponse)(nil), // 80: api.v1.CreateWorkloadRecommendationPolicyResponse + (*GetWorkloadRecommendationPolicyRequest)(nil), // 81: api.v1.GetWorkloadRecommendationPolicyRequest + (*GetWorkloadRecommendationPolicyResponse)(nil), // 82: api.v1.GetWorkloadRecommendationPolicyResponse + (*ListWorkloadRecommendationPoliciesRequest)(nil), // 83: api.v1.ListWorkloadRecommendationPoliciesRequest + (*ListWorkloadRecommendationPoliciesResponse)(nil), // 84: api.v1.ListWorkloadRecommendationPoliciesResponse + (*UpdateWorkloadRecommendationPolicyRequest)(nil), // 85: api.v1.UpdateWorkloadRecommendationPolicyRequest + (*UpdateWorkloadRecommendationPolicyResponse)(nil), // 86: api.v1.UpdateWorkloadRecommendationPolicyResponse + (*DeleteWorkloadRecommendationPolicyRequest)(nil), // 87: api.v1.DeleteWorkloadRecommendationPolicyRequest + (*DeleteWorkloadRecommendationPolicyResponse)(nil), // 88: api.v1.DeleteWorkloadRecommendationPolicyResponse + (*AttachWorkloadRecommendationPolicyRequest)(nil), // 89: api.v1.AttachWorkloadRecommendationPolicyRequest + (*AttachWorkloadRecommendationPolicyResponse)(nil), // 90: api.v1.AttachWorkloadRecommendationPolicyResponse + (*AttachWorkloadRecommendationPoliciesRequest)(nil), // 91: api.v1.AttachWorkloadRecommendationPoliciesRequest + (*AttachWorkloadRecommendationPoliciesResponse)(nil), // 92: api.v1.AttachWorkloadRecommendationPoliciesResponse + (*WorkloadPolicyAttachment)(nil), // 93: api.v1.WorkloadPolicyAttachment + (*WorkloadPolicyTarget)(nil), // 94: api.v1.WorkloadPolicyTarget + (*CreateWorkloadPolicyTargetRequest)(nil), // 95: api.v1.CreateWorkloadPolicyTargetRequest + (*CreateWorkloadPolicyTargetResponse)(nil), // 96: api.v1.CreateWorkloadPolicyTargetResponse + (*GetWorkloadPolicyTargetRequest)(nil), // 97: api.v1.GetWorkloadPolicyTargetRequest + (*GetWorkloadPolicyTargetResponse)(nil), // 98: api.v1.GetWorkloadPolicyTargetResponse + (*ListWorkloadPolicyTargetsRequest)(nil), // 99: api.v1.ListWorkloadPolicyTargetsRequest + (*ListWorkloadPolicyTargetsResponse)(nil), // 100: api.v1.ListWorkloadPolicyTargetsResponse + (*UpdateWorkloadPolicyTargetRequest)(nil), // 101: api.v1.UpdateWorkloadPolicyTargetRequest + (*UpdateWorkloadPolicyTargetResponse)(nil), // 102: api.v1.UpdateWorkloadPolicyTargetResponse + (*DeleteWorkloadPolicyTargetRequest)(nil), // 103: api.v1.DeleteWorkloadPolicyTargetRequest + (*ToggleWorkloadPolicyTargetsRequest)(nil), // 104: api.v1.ToggleWorkloadPolicyTargetsRequest + (*ToggleWorkloadPolicyTargetsResponse)(nil), // 105: api.v1.ToggleWorkloadPolicyTargetsResponse + (*DeleteWorkloadPolicyTargetResponse)(nil), // 106: api.v1.DeleteWorkloadPolicyTargetResponse + (*RemoveClusterOptimizationsRequest)(nil), // 107: api.v1.RemoveClusterOptimizationsRequest + (*RemoveClusterOptimizationsResponse)(nil), // 108: api.v1.RemoveClusterOptimizationsResponse + (*PreviewWorkloadPolicyTargetMatchesRequest)(nil), // 109: api.v1.PreviewWorkloadPolicyTargetMatchesRequest + (*PreviewWorkloadPolicyTargetMatchesResponse)(nil), // 110: api.v1.PreviewWorkloadPolicyTargetMatchesResponse + (*GetPreviewWorkloadPolicyTargetRecommendationsRequest)(nil), // 111: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest + (*WorkloadCollisionInfo)(nil), // 112: api.v1.WorkloadCollisionInfo + (*GetPreviewWorkloadPolicyTargetRecommendationsResponse)(nil), // 113: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse + (*WorkloadPercentileSummary)(nil), // 114: api.v1.WorkloadPercentileSummary + (*NodeGroupPolicyTarget)(nil), // 115: api.v1.NodeGroupPolicyTarget + (*CreateNodeGroupPolicyTargetRequest)(nil), // 116: api.v1.CreateNodeGroupPolicyTargetRequest + (*CreateNodeGroupPolicyTargetResponse)(nil), // 117: api.v1.CreateNodeGroupPolicyTargetResponse + (*GetNodeGroupPolicyTargetRequest)(nil), // 118: api.v1.GetNodeGroupPolicyTargetRequest + (*GetNodeGroupPolicyTargetResponse)(nil), // 119: api.v1.GetNodeGroupPolicyTargetResponse + (*ListNodeGroupPolicyTargetsRequest)(nil), // 120: api.v1.ListNodeGroupPolicyTargetsRequest + (*ListNodeGroupPolicyTargetsResponse)(nil), // 121: api.v1.ListNodeGroupPolicyTargetsResponse + (*UpdateNodeGroupPolicyTargetRequest)(nil), // 122: api.v1.UpdateNodeGroupPolicyTargetRequest + (*UpdateNodeGroupPolicyTargetResponse)(nil), // 123: api.v1.UpdateNodeGroupPolicyTargetResponse + (*DeleteNodeGroupPolicyTargetRequest)(nil), // 124: api.v1.DeleteNodeGroupPolicyTargetRequest + (*ToggleNodeGroupPolicyTargetsRequest)(nil), // 125: api.v1.ToggleNodeGroupPolicyTargetsRequest + (*ToggleNodeGroupPolicyTargetsResponse)(nil), // 126: api.v1.ToggleNodeGroupPolicyTargetsResponse + (*DeleteNodeGroupPolicyTargetResponse)(nil), // 127: api.v1.DeleteNodeGroupPolicyTargetResponse + (*PreviewNodeGroupPolicyTargetMatchesRequest)(nil), // 128: api.v1.PreviewNodeGroupPolicyTargetMatchesRequest + (*PreviewNodeGroupPolicyTargetMatchesResponse)(nil), // 129: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse + (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest)(nil), // 130: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest + (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse)(nil), // 131: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse + (*BalanceGetRecommendationsRequest)(nil), // 132: api.v1.BalanceGetRecommendationsRequest + (*BalanceGetRecommendationsResponse)(nil), // 133: api.v1.BalanceGetRecommendationsResponse + (*BatchNodeGroupRecommendations)(nil), // 134: api.v1.BatchNodeGroupRecommendations + (*BatchWorkloadRecommendations)(nil), // 135: api.v1.BatchWorkloadRecommendations + (*WorkloadRule)(nil), // 136: api.v1.WorkloadRule + (*ResourceRuleConfig)(nil), // 137: api.v1.ResourceRuleConfig + (*HPAMetricTrigger)(nil), // 138: api.v1.HPAMetricTrigger + (*HPAFallback)(nil), // 139: api.v1.HPAFallback + (*ContainerResourceConfig)(nil), // 140: api.v1.ContainerResourceConfig + (*ContainerResourceRuleConfig)(nil), // 141: api.v1.ContainerResourceRuleConfig + (*JVMHeapRuleConfig)(nil), // 142: api.v1.JVMHeapRuleConfig + (*HPARuleConfig)(nil), // 143: api.v1.HPARuleConfig + (*EmergencyResponseConfig)(nil), // 144: api.v1.EmergencyResponseConfig + (*KEDAScaledObjectTemplate)(nil), // 145: api.v1.KEDAScaledObjectTemplate + (*KEDATrigger)(nil), // 146: api.v1.KEDATrigger + (*KEDAAuthenticationRef)(nil), // 147: api.v1.KEDAAuthenticationRef + (*KEDAFallback)(nil), // 148: api.v1.KEDAFallback + (*KEDAAdvanced)(nil), // 149: api.v1.KEDAAdvanced + (*PercentileValues)(nil), // 150: api.v1.PercentileValues + (*ResourcePercentiles)(nil), // 151: api.v1.ResourcePercentiles + (*BurstinessRatios)(nil), // 152: api.v1.BurstinessRatios + (*WorkloadClassification)(nil), // 153: api.v1.WorkloadClassification + (*BatchWorkloadRules)(nil), // 154: api.v1.BatchWorkloadRules + (*BatchHPAConnectors)(nil), // 155: api.v1.BatchHPAConnectors + (*WorkloadWithActiveRecommendations)(nil), // 156: api.v1.WorkloadWithActiveRecommendations + (*GenericResourceRecommendation)(nil), // 157: api.v1.GenericResourceRecommendation + (*BatchGenericResourceRecommendations)(nil), // 158: api.v1.BatchGenericResourceRecommendations + (*BatchPvcStorageRecommendations)(nil), // 159: api.v1.BatchPvcStorageRecommendations + (*GeneratePodDisruptionBudgetRequest)(nil), // 160: api.v1.GeneratePodDisruptionBudgetRequest + (*GeneratePodDisruptionBudgetResponse)(nil), // 161: api.v1.GeneratePodDisruptionBudgetResponse + (*GenerateAndCreatePodDisruptionBudgetRequest)(nil), // 162: api.v1.GenerateAndCreatePodDisruptionBudgetRequest + (*GenerateAndCreatePodDisruptionBudgetResponse)(nil), // 163: api.v1.GenerateAndCreatePodDisruptionBudgetResponse + (*CreatePodDisruptionBudgetRequest)(nil), // 164: api.v1.CreatePodDisruptionBudgetRequest + (*CreatePodDisruptionBudgetResponse)(nil), // 165: api.v1.CreatePodDisruptionBudgetResponse + (*GetPDBRecommendationForWorkloadRequest)(nil), // 166: api.v1.GetPDBRecommendationForWorkloadRequest + (*GetPDBRecommendationForWorkloadResponse)(nil), // 167: api.v1.GetPDBRecommendationForWorkloadResponse + (*StructuralHealthFinding)(nil), // 168: api.v1.StructuralHealthFinding + (*WorkloadStructuralHealth)(nil), // 169: api.v1.WorkloadStructuralHealth + (*ListWorkloadStructuralHealthRequest)(nil), // 170: api.v1.ListWorkloadStructuralHealthRequest + (*ListWorkloadStructuralHealthResponse)(nil), // 171: api.v1.ListWorkloadStructuralHealthResponse + (*ReconcileWorkload)(nil), // 172: api.v1.ReconcileWorkload + (*ReconcileResponse)(nil), // 173: api.v1.ReconcileResponse + (*OperatorHealth)(nil), // 174: api.v1.OperatorHealth + (*AgentHealth)(nil), // 175: api.v1.AgentHealth + (*AgentHealthMeta)(nil), // 176: api.v1.AgentHealthMeta + (*HealthReport)(nil), // 177: api.v1.HealthReport + (*NodeStats)(nil), // 178: api.v1.NodeStats + (*NodeMetric)(nil), // 179: api.v1.NodeMetric + (*ContainerStats)(nil), // 180: api.v1.ContainerStats + (*ContainerMetric)(nil), // 181: api.v1.ContainerMetric + (*ContainerSummarizedMetric)(nil), // 182: api.v1.ContainerSummarizedMetric + (*Metric)(nil), // 183: api.v1.Metric + (*ContainerRecommendation)(nil), // 184: api.v1.ContainerRecommendation + (*KedaScaledObjectRecommendation)(nil), // 185: api.v1.KedaScaledObjectRecommendation + (*ResourceRecommendation)(nil), // 186: api.v1.ResourceRecommendation + (*EnvVarMutation)(nil), // 187: api.v1.EnvVarMutation + (*CommandArgMutation)(nil), // 188: api.v1.CommandArgMutation + (*NodeSelectorMutation)(nil), // 189: api.v1.NodeSelectorMutation + (*TolerationMutation)(nil), // 190: api.v1.TolerationMutation + (*Toleration)(nil), // 191: api.v1.Toleration + (*ClusterRecommendationPolicy)(nil), // 192: api.v1.ClusterRecommendationPolicy + (*NodeGroupRecommendationPolicy)(nil), // 193: api.v1.NodeGroupRecommendationPolicy + (*VerticalScalingOptimizationTarget)(nil), // 194: api.v1.VerticalScalingOptimizationTarget + (*HorizontalScalingOptimizationTarget)(nil), // 195: api.v1.HorizontalScalingOptimizationTarget + (*WorkloadRecommendationPolicy)(nil), // 196: api.v1.WorkloadRecommendationPolicy + (*GetPolicyRecommendedDefaultsRequest)(nil), // 197: api.v1.GetPolicyRecommendedDefaultsRequest + (*GetPolicyRecommendedDefaultsResponse)(nil), // 198: api.v1.GetPolicyRecommendedDefaultsResponse + (*BalanceRegisterRequest)(nil), // 199: api.v1.BalanceRegisterRequest + (*BalanceFeatures)(nil), // 200: api.v1.BalanceFeatures + (*BalanceApplyRecommendationResponse)(nil), // 201: api.v1.BalanceApplyRecommendationResponse + (*LiveMigrationResult)(nil), // 202: api.v1.LiveMigrationResult + (*NodeGroupReference)(nil), // 203: api.v1.NodeGroupReference + (*NodeGroupRecommendation)(nil), // 204: api.v1.NodeGroupRecommendation + (*CostImpact)(nil), // 205: api.v1.CostImpact + (*WorkloadRecommendation)(nil), // 206: api.v1.WorkloadRecommendation + (*ReasoningDetails)(nil), // 207: api.v1.ReasoningDetails + (*ReasoningEvidence)(nil), // 208: api.v1.ReasoningEvidence + (*ReasoningInsight)(nil), // 209: api.v1.ReasoningInsight + (*ReasoningResourceEdge)(nil), // 210: api.v1.ReasoningResourceEdge + (*ReasoningContainerChange)(nil), // 211: api.v1.ReasoningContainerChange + (*ReasoningUtilization)(nil), // 212: api.v1.ReasoningUtilization + (*ReasoningHistoricalPattern)(nil), // 213: api.v1.ReasoningHistoricalPattern + (*ReasoningReplicas)(nil), // 214: api.v1.ReasoningReplicas + (*ReasoningDecision)(nil), // 215: api.v1.ReasoningDecision + (*GetAttachedNodeGroupPoliciesRequest)(nil), // 216: api.v1.GetAttachedNodeGroupPoliciesRequest + (*GetAttachedNodeGroupPoliciesResponse)(nil), // 217: api.v1.GetAttachedNodeGroupPoliciesResponse + (*GetAttachedWorkloadPoliciesRequest)(nil), // 218: api.v1.GetAttachedWorkloadPoliciesRequest + (*GetAttachedWorkloadPoliciesResponse)(nil), // 219: api.v1.GetAttachedWorkloadPoliciesResponse + (*WorkloadRecommendationPolicyGroup)(nil), // 220: api.v1.WorkloadRecommendationPolicyGroup + (*WorkloadPolicyTargetGroup)(nil), // 221: api.v1.WorkloadPolicyTargetGroup + (*WorkloadIdentifiers)(nil), // 222: api.v1.WorkloadIdentifiers + (*WorkloadPolicies)(nil), // 223: api.v1.WorkloadPolicies + (*ListAttachedWorkloadPoliciesRequest)(nil), // 224: api.v1.ListAttachedWorkloadPoliciesRequest + (*ListAttachedWorkloadPoliciesResponse)(nil), // 225: api.v1.ListAttachedWorkloadPoliciesResponse + (*ListAttachedNodeGroupPoliciesRequest)(nil), // 226: api.v1.ListAttachedNodeGroupPoliciesRequest + (*ListAttachedNodeGroupPoliciesResponse)(nil), // 227: api.v1.ListAttachedNodeGroupPoliciesResponse + (*NodeGroupItem)(nil), // 228: api.v1.NodeGroupItem + (*RecommendationAppliedRequest)(nil), // 229: api.v1.RecommendationAppliedRequest + (*RecommendationAppliedResponse)(nil), // 230: api.v1.RecommendationAppliedResponse + (*ApplyRecommendationRequest)(nil), // 231: api.v1.ApplyRecommendationRequest + (*ApplyRecommendationResponse)(nil), // 232: api.v1.ApplyRecommendationResponse + (*RecommendationEventsRequest)(nil), // 233: api.v1.RecommendationEventsRequest + (*RecommendationEventsResponse)(nil), // 234: api.v1.RecommendationEventsResponse + (*RetrieveSavingsForWorkloadRequest)(nil), // 235: api.v1.RetrieveSavingsForWorkloadRequest + (*RetrieveSavingsForWorkloadResponse)(nil), // 236: api.v1.RetrieveSavingsForWorkloadResponse + (*CreateNodePoliciesRequest)(nil), // 237: api.v1.CreateNodePoliciesRequest + (*CreateNodePoliciesResponse)(nil), // 238: api.v1.CreateNodePoliciesResponse + (*SuggestedNodePolicyRequest)(nil), // 239: api.v1.SuggestedNodePolicyRequest + (*SuggestedNodePolicyResponse)(nil), // 240: api.v1.SuggestedNodePolicyResponse + (*GenerateNodePoliciesFromKarpenterRequest)(nil), // 241: api.v1.GenerateNodePoliciesFromKarpenterRequest + (*GenerateNodePoliciesFromKarpenterResponse)(nil), // 242: api.v1.GenerateNodePoliciesFromKarpenterResponse + (*GenerateNodePoliciesFromNodeGroupsRequest)(nil), // 243: api.v1.GenerateNodePoliciesFromNodeGroupsRequest + (*GenerateNodePoliciesFromNodeGroupsResponse)(nil), // 244: api.v1.GenerateNodePoliciesFromNodeGroupsResponse + (*NodeGroupMigrationEligibility)(nil), // 245: api.v1.NodeGroupMigrationEligibility + (*GetNodeAnnotationReadinessRequest)(nil), // 246: api.v1.GetNodeAnnotationReadinessRequest + (*GetNodeAnnotationReadinessResponse)(nil), // 247: api.v1.GetNodeAnnotationReadinessResponse + (*DetectClusterAutoscalerRequest)(nil), // 248: api.v1.DetectClusterAutoscalerRequest + (*DetectClusterAutoscalerResponse)(nil), // 249: api.v1.DetectClusterAutoscalerResponse + (*GetMigrationStateRequest)(nil), // 250: api.v1.GetMigrationStateRequest + (*GetMigrationStateResponse)(nil), // 251: api.v1.GetMigrationStateResponse + (*UpdateMigrationStateRequest)(nil), // 252: api.v1.UpdateMigrationStateRequest + (*UpdateMigrationStateResponse)(nil), // 253: api.v1.UpdateMigrationStateResponse + (*GetKarpenterMigrationStateRequest)(nil), // 254: api.v1.GetKarpenterMigrationStateRequest + (*GetKarpenterMigrationStateResponse)(nil), // 255: api.v1.GetKarpenterMigrationStateResponse + (*UpdateKarpenterMigrationStateRequest)(nil), // 256: api.v1.UpdateKarpenterMigrationStateRequest + (*UpdateKarpenterMigrationStateResponse)(nil), // 257: api.v1.UpdateKarpenterMigrationStateResponse + (*KarpenterOwnershipConflict)(nil), // 258: api.v1.KarpenterOwnershipConflict + (*DetectKarpenterOwnershipConflictsRequest)(nil), // 259: api.v1.DetectKarpenterOwnershipConflictsRequest + (*DetectKarpenterOwnershipConflictsResponse)(nil), // 260: api.v1.DetectKarpenterOwnershipConflictsResponse + (*AcknowledgeKarpenterOwnershipConflictRequest)(nil), // 261: api.v1.AcknowledgeKarpenterOwnershipConflictRequest + (*AcknowledgeKarpenterOwnershipConflictResponse)(nil), // 262: api.v1.AcknowledgeKarpenterOwnershipConflictResponse + (*KarpenterSourceResource)(nil), // 263: api.v1.KarpenterSourceResource + (*GetKarpenterSourceResourcesRequest)(nil), // 264: api.v1.GetKarpenterSourceResourcesRequest + (*GetKarpenterSourceResourcesResponse)(nil), // 265: api.v1.GetKarpenterSourceResourcesResponse + (*NodePoolAdoptionStatus)(nil), // 266: api.v1.NodePoolAdoptionStatus + (*GetKarpenterAdoptionStatusRequest)(nil), // 267: api.v1.GetKarpenterAdoptionStatusRequest + (*GetKarpenterAdoptionStatusResponse)(nil), // 268: api.v1.GetKarpenterAdoptionStatusResponse + (*ReportNodePoolValidationRequest)(nil), // 269: api.v1.ReportNodePoolValidationRequest + (*ReportNodePoolValidationResponse)(nil), // 270: api.v1.ReportNodePoolValidationResponse + (*GetNodePoolValidationsRequest)(nil), // 271: api.v1.GetNodePoolValidationsRequest + (*NodePoolValidationReport)(nil), // 272: api.v1.NodePoolValidationReport + (*GetNodePoolValidationsResponse)(nil), // 273: api.v1.GetNodePoolValidationsResponse + (*WorkloadCompatibilityWarning)(nil), // 274: api.v1.WorkloadCompatibilityWarning + (*ListNodePoliciesRequest)(nil), // 275: api.v1.ListNodePoliciesRequest + (*ListNodePoliciesResponse)(nil), // 276: api.v1.ListNodePoliciesResponse + (*UpdateNodePolicyRequest)(nil), // 277: api.v1.UpdateNodePolicyRequest + (*UpdateNodePolicyResponse)(nil), // 278: api.v1.UpdateNodePolicyResponse + (*NodeGroupCheckpointStatus)(nil), // 279: api.v1.NodeGroupCheckpointStatus + (*GetNodeGroupsCheckpointStatusRequest)(nil), // 280: api.v1.GetNodeGroupsCheckpointStatusRequest + (*GetNodeGroupsCheckpointStatusResponse)(nil), // 281: api.v1.GetNodeGroupsCheckpointStatusResponse + (*SetNodePolicyCheckpointLabelRequest)(nil), // 282: api.v1.SetNodePolicyCheckpointLabelRequest + (*SetNodePolicyCheckpointLabelResponse)(nil), // 283: api.v1.SetNodePolicyCheckpointLabelResponse + (*DeleteNodePolicyRequest)(nil), // 284: api.v1.DeleteNodePolicyRequest + (*DeleteNodePolicyResponse)(nil), // 285: api.v1.DeleteNodePolicyResponse + (*NodePolicy)(nil), // 286: api.v1.NodePolicy + (*PreviewNodeRecommendationConfigRequest)(nil), // 287: api.v1.PreviewNodeRecommendationConfigRequest + (*PreviewNodeRecommendationConfigResponse)(nil), // 288: api.v1.PreviewNodeRecommendationConfigResponse + (*NodeRecommendationConfig)(nil), // 289: api.v1.NodeRecommendationConfig + (*SuggestedKarpenterConfigRequest)(nil), // 290: api.v1.SuggestedKarpenterConfigRequest + (*SuggestedKarpenterConfigResponse)(nil), // 291: api.v1.SuggestedKarpenterConfigResponse + (*SuggestNodePolicyImprovementsRequest)(nil), // 292: api.v1.SuggestNodePolicyImprovementsRequest + (*SuggestNodePolicyImprovementsResponse)(nil), // 293: api.v1.SuggestNodePolicyImprovementsResponse + (*ListClusterNodePolicySuggestionsRequest)(nil), // 294: api.v1.ListClusterNodePolicySuggestionsRequest + (*ListClusterNodePolicySuggestionsResponse)(nil), // 295: api.v1.ListClusterNodePolicySuggestionsResponse + (*NodePolicySuggestionsForPolicy)(nil), // 296: api.v1.NodePolicySuggestionsForPolicy + (*NodePolicySuggestion)(nil), // 297: api.v1.NodePolicySuggestion + (*SuggestionFieldChange)(nil), // 298: api.v1.SuggestionFieldChange + (*SuggestionEvidence)(nil), // 299: api.v1.SuggestionEvidence + (*SuggestionWorkloadRef)(nil), // 300: api.v1.SuggestionWorkloadRef + (*SuggestionContext)(nil), // 301: api.v1.SuggestionContext + (*GetAvailableKindsByTargetingFiltersRequest)(nil), // 302: api.v1.GetAvailableKindsByTargetingFiltersRequest + (*SearchResourcesByTargetingFiltersRequest)(nil), // 303: api.v1.SearchResourcesByTargetingFiltersRequest + (*TargetFilters)(nil), // 304: api.v1.TargetFilters + (*GetAvailableKindsByTargetingFiltersResponse)(nil), // 305: api.v1.GetAvailableKindsByTargetingFiltersResponse + (*SearchResourcesByTargetingFiltersResponse)(nil), // 306: api.v1.SearchResourcesByTargetingFiltersResponse + (*NamespaceSearchResult)(nil), // 307: api.v1.NamespaceSearchResult + (*WorkloadSearchResult)(nil), // 308: api.v1.WorkloadSearchResult + (*NodeGroupSearchResult)(nil), // 309: api.v1.NodeGroupSearchResult + (*LabelSearchResult)(nil), // 310: api.v1.LabelSearchResult + (*CreateNodePolicyTargetsRequest)(nil), // 311: api.v1.CreateNodePolicyTargetsRequest + (*CreateNodePolicyTargetsResponse)(nil), // 312: api.v1.CreateNodePolicyTargetsResponse + (*ListNodePolicyTargetsRequest)(nil), // 313: api.v1.ListNodePolicyTargetsRequest + (*ListNodePolicyTargetsResponse)(nil), // 314: api.v1.ListNodePolicyTargetsResponse + (*UpdateNodePolicyTargetRequest)(nil), // 315: api.v1.UpdateNodePolicyTargetRequest + (*UpdateNodePolicyTargetResponse)(nil), // 316: api.v1.UpdateNodePolicyTargetResponse + (*NodePolicyTarget)(nil), // 317: api.v1.NodePolicyTarget + (*NodePolicyCondition)(nil), // 318: api.v1.NodePolicyCondition + (*NodePolicyTargetStatus)(nil), // 319: api.v1.NodePolicyTargetStatus + (*ZonalShiftConfig)(nil), // 320: api.v1.ZonalShiftConfig + (*Taint)(nil), // 321: api.v1.Taint + (*DisruptionBudget)(nil), // 322: api.v1.DisruptionBudget + (*DisruptionPolicy)(nil), // 323: api.v1.DisruptionPolicy + (*ResourceLimits)(nil), // 324: api.v1.ResourceLimits + (*AWSNodeClassSpec)(nil), // 325: api.v1.AWSNodeClassSpec + (*GetInstanceFamiliesRequest)(nil), // 326: api.v1.GetInstanceFamiliesRequest + (*GetInstanceFamiliesResponse)(nil), // 327: api.v1.GetInstanceFamiliesResponse + (*GetInstanceSizesRequest)(nil), // 328: api.v1.GetInstanceSizesRequest + (*GetInstanceSizesResponse)(nil), // 329: api.v1.GetInstanceSizesResponse + (*GetInstanceShapesRequest)(nil), // 330: api.v1.GetInstanceShapesRequest + (*GetInstanceShapesResponse)(nil), // 331: api.v1.GetInstanceShapesResponse + (*InstanceFamily)(nil), // 332: api.v1.InstanceFamily + (*InstanceShape)(nil), // 333: api.v1.InstanceShape + (*InstanceSize)(nil), // 334: api.v1.InstanceSize + (*InstanceCategory)(nil), // 335: api.v1.InstanceCategory + (*InstanceCPU)(nil), // 336: api.v1.InstanceCPU + (*InstanceTypeName)(nil), // 337: api.v1.InstanceTypeName + (*GetInstanceCategoriesRequest)(nil), // 338: api.v1.GetInstanceCategoriesRequest + (*GetInstanceCategoriesResponse)(nil), // 339: api.v1.GetInstanceCategoriesResponse + (*GetInstanceCPUsRequest)(nil), // 340: api.v1.GetInstanceCPUsRequest + (*GetInstanceCPUsResponse)(nil), // 341: api.v1.GetInstanceCPUsResponse + (*GetInstanceTypeNamesRequest)(nil), // 342: api.v1.GetInstanceTypeNamesRequest + (*GetInstanceTypeNamesResponse)(nil), // 343: api.v1.GetInstanceTypeNamesResponse + (*SubnetSelectorTerm)(nil), // 344: api.v1.SubnetSelectorTerm + (*SecurityGroupSelectorTerm)(nil), // 345: api.v1.SecurityGroupSelectorTerm + (*CapacityReservationSelectorTerm)(nil), // 346: api.v1.CapacityReservationSelectorTerm + (*AMISelectorTerm)(nil), // 347: api.v1.AMISelectorTerm + (*KubeletConfiguration)(nil), // 348: api.v1.KubeletConfiguration + (*BlockDeviceMapping)(nil), // 349: api.v1.BlockDeviceMapping + (*BlockDevice)(nil), // 350: api.v1.BlockDevice + (*MetadataOptions)(nil), // 351: api.v1.MetadataOptions + (*GCPNodeClassSpec)(nil), // 352: api.v1.GCPNodeClassSpec + (*GCPImageSelectorTerm)(nil), // 353: api.v1.GCPImageSelectorTerm + (*GCPDisk)(nil), // 354: api.v1.GCPDisk + (*AzureNodeClassSpec)(nil), // 355: api.v1.AzureNodeClassSpec + (*AzureKubeletConfiguration)(nil), // 356: api.v1.AzureKubeletConfiguration + (*OCIImageSelectorTerm)(nil), // 357: api.v1.OCIImageSelectorTerm + (*OCISubnetSelectorTerm)(nil), // 358: api.v1.OCISubnetSelectorTerm + (*OCISecurityGroupSelectorTerm)(nil), // 359: api.v1.OCISecurityGroupSelectorTerm + (*OCIBootConfig)(nil), // 360: api.v1.OCIBootConfig + (*OCILaunchOptions)(nil), // 361: api.v1.OCILaunchOptions + (*OCIVolumeAttributes)(nil), // 362: api.v1.OCIVolumeAttributes + (*OCINodeClassSpec)(nil), // 363: api.v1.OCINodeClassSpec + (*KarpenterSettingsRecommendation)(nil), // 364: api.v1.KarpenterSettingsRecommendation + (*RawKarpenterSpec)(nil), // 365: api.v1.RawKarpenterSpec + (*SnapshotRecommendation)(nil), // 366: api.v1.SnapshotRecommendation + (*ForensicSnapshotRecommendation)(nil), // 367: api.v1.ForensicSnapshotRecommendation + (*SnapshotCRStatusReport)(nil), // 368: api.v1.SnapshotCRStatusReport + (*SnapshotCRStatus)(nil), // 369: api.v1.SnapshotCRStatus + (*SnapshotCRRuntimeStatus)(nil), // 370: api.v1.SnapshotCRRuntimeStatus + (*SnapshotPolicyTargetStatus)(nil), // 371: api.v1.SnapshotPolicyTargetStatus + (*SnapshotPrereqs)(nil), // 372: api.v1.SnapshotPrereqs + (*NodeRecommendation)(nil), // 373: api.v1.NodeRecommendation + (*AWSKarpenterSpec)(nil), // 374: api.v1.AWSKarpenterSpec + (*AKSKarpenterSpec)(nil), // 375: api.v1.AKSKarpenterSpec + (*NodePool)(nil), // 376: api.v1.NodePool + (*EC2NodeClass)(nil), // 377: api.v1.EC2NodeClass + (*AKSNodeClass)(nil), // 378: api.v1.AKSNodeClass + (*GCPKarpenterSpec)(nil), // 379: api.v1.GCPKarpenterSpec + (*GCENodeClass)(nil), // 380: api.v1.GCENodeClass + (*OCIKarpenterSpec)(nil), // 381: api.v1.OCIKarpenterSpec + (*OCINodeClass)(nil), // 382: api.v1.OCINodeClass + (*StorageRecommendationPolicy)(nil), // 383: api.v1.StorageRecommendationPolicy + (*CreateStorageRecommendationPolicyRequest)(nil), // 384: api.v1.CreateStorageRecommendationPolicyRequest + (*CreateStorageRecommendationPolicyResponse)(nil), // 385: api.v1.CreateStorageRecommendationPolicyResponse + (*GetStorageRecommendationPolicyRequest)(nil), // 386: api.v1.GetStorageRecommendationPolicyRequest + (*GetStorageRecommendationPolicyResponse)(nil), // 387: api.v1.GetStorageRecommendationPolicyResponse + (*ListStorageRecommendationPoliciesRequest)(nil), // 388: api.v1.ListStorageRecommendationPoliciesRequest + (*ListStorageRecommendationPoliciesResponse)(nil), // 389: api.v1.ListStorageRecommendationPoliciesResponse + (*UpdateStorageRecommendationPolicyRequest)(nil), // 390: api.v1.UpdateStorageRecommendationPolicyRequest + (*UpdateStorageRecommendationPolicyResponse)(nil), // 391: api.v1.UpdateStorageRecommendationPolicyResponse + (*DeleteStorageRecommendationPolicyRequest)(nil), // 392: api.v1.DeleteStorageRecommendationPolicyRequest + (*DeleteStorageRecommendationPolicyResponse)(nil), // 393: api.v1.DeleteStorageRecommendationPolicyResponse + (*StoragePolicyTarget)(nil), // 394: api.v1.StoragePolicyTarget + (*CreateStoragePolicyTargetRequest)(nil), // 395: api.v1.CreateStoragePolicyTargetRequest + (*CreateStoragePolicyTargetResponse)(nil), // 396: api.v1.CreateStoragePolicyTargetResponse + (*ListStoragePolicyTargetsRequest)(nil), // 397: api.v1.ListStoragePolicyTargetsRequest + (*ListStoragePolicyTargetsResponse)(nil), // 398: api.v1.ListStoragePolicyTargetsResponse + (*UpdateStoragePolicyTargetRequest)(nil), // 399: api.v1.UpdateStoragePolicyTargetRequest + (*UpdateStoragePolicyTargetResponse)(nil), // 400: api.v1.UpdateStoragePolicyTargetResponse + (*DeleteStoragePolicyTargetRequest)(nil), // 401: api.v1.DeleteStoragePolicyTargetRequest + (*DeleteStoragePolicyTargetResponse)(nil), // 402: api.v1.DeleteStoragePolicyTargetResponse + (*PvcStorageRecommendation)(nil), // 403: api.v1.PvcStorageRecommendation + (*GetPvcStorageRecommendationRequest)(nil), // 404: api.v1.GetPvcStorageRecommendationRequest + (*GetPvcStorageRecommendationResponse)(nil), // 405: api.v1.GetPvcStorageRecommendationResponse + (*ListPvcStorageRecommendationsRequest)(nil), // 406: api.v1.ListPvcStorageRecommendationsRequest + (*ListPvcStorageRecommendationsResponse)(nil), // 407: api.v1.ListPvcStorageRecommendationsResponse + (*GeneratePvcStorageRecommendationRequest)(nil), // 408: api.v1.GeneratePvcStorageRecommendationRequest + (*GeneratePvcStorageRecommendationResponse)(nil), // 409: api.v1.GeneratePvcStorageRecommendationResponse + (*PreviewPvcStorageRecommendationRequest)(nil), // 410: api.v1.PreviewPvcStorageRecommendationRequest + (*PreviewPvcStorageRecommendationResponse)(nil), // 411: api.v1.PreviewPvcStorageRecommendationResponse + (*WorkloadRuleOOMEvent)(nil), // 412: api.v1.WorkloadRuleOOMEvent + (*ListWorkloadRuleOOMEventsRequest)(nil), // 413: api.v1.ListWorkloadRuleOOMEventsRequest + (*ListWorkloadRuleOOMEventsResponse)(nil), // 414: api.v1.ListWorkloadRuleOOMEventsResponse + (*ListWorkloadOOMEventsRequest)(nil), // 415: api.v1.ListWorkloadOOMEventsRequest + (*ListWorkloadOOMEventsResponse)(nil), // 416: api.v1.ListWorkloadOOMEventsResponse + (*WorkloadRuleCPUThrottleEvent)(nil), // 417: api.v1.WorkloadRuleCPUThrottleEvent + (*ListWorkloadRuleCPUThrottleEventsRequest)(nil), // 418: api.v1.ListWorkloadRuleCPUThrottleEventsRequest + (*ListWorkloadRuleCPUThrottleEventsResponse)(nil), // 419: api.v1.ListWorkloadRuleCPUThrottleEventsResponse + (*ListWorkloadCPUThrottleEventsRequest)(nil), // 420: api.v1.ListWorkloadCPUThrottleEventsRequest + (*ListWorkloadCPUThrottleEventsResponse)(nil), // 421: api.v1.ListWorkloadCPUThrottleEventsResponse + (*StringSetSelector)(nil), // 422: api.v1.StringSetSelector + (*WorkloadOptimizationPolicyProto)(nil), // 423: api.v1.WorkloadOptimizationPolicyProto + (*GenericOptimizationSettings)(nil), // 424: api.v1.GenericOptimizationSettings + (*CreateWorkloadOptimizationPolicyRequest)(nil), // 425: api.v1.CreateWorkloadOptimizationPolicyRequest + (*CreateWorkloadOptimizationPolicyResponse)(nil), // 426: api.v1.CreateWorkloadOptimizationPolicyResponse + (*ListWorkloadOptimizationPoliciesRequest)(nil), // 427: api.v1.ListWorkloadOptimizationPoliciesRequest + (*ListWorkloadOptimizationPoliciesResponse)(nil), // 428: api.v1.ListWorkloadOptimizationPoliciesResponse + (*GetWorkloadOptimizationPolicyRequest)(nil), // 429: api.v1.GetWorkloadOptimizationPolicyRequest + (*GetWorkloadOptimizationPolicyResponse)(nil), // 430: api.v1.GetWorkloadOptimizationPolicyResponse + (*GetWorkloadOptimizationPolicyByWorkloadRequest)(nil), // 431: api.v1.GetWorkloadOptimizationPolicyByWorkloadRequest + (*GetWorkloadOptimizationPolicyByWorkloadResponse)(nil), // 432: api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse + (*UpdateWorkloadOptimizationPolicyRequest)(nil), // 433: api.v1.UpdateWorkloadOptimizationPolicyRequest + (*ToggleWorkloadOptimizationPolicyDisabledRequest)(nil), // 434: api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest + (*ToggleWorkloadOptimizationPolicyDisabledResponse)(nil), // 435: api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse + (*UpdateWorkloadOptimizationPolicyResponse)(nil), // 436: api.v1.UpdateWorkloadOptimizationPolicyResponse + (*DeleteWorkloadOptimizationPolicyRequest)(nil), // 437: api.v1.DeleteWorkloadOptimizationPolicyRequest + (*DeleteWorkloadOptimizationPolicyResponse)(nil), // 438: api.v1.DeleteWorkloadOptimizationPolicyResponse + (*PreviewWorkloadOptimizationPolicyMatchesRequest)(nil), // 439: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest + (*WorkloadOptimizationPolicyMatch)(nil), // 440: api.v1.WorkloadOptimizationPolicyMatch + (*PreviewWorkloadOptimizationPolicyMatchesResponse)(nil), // 441: api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse + (*SchedulerPolicyTargetProto)(nil), // 442: api.v1.SchedulerPolicyTargetProto + (*SchedulerPolicyProto)(nil), // 443: api.v1.SchedulerPolicyProto + (*CreateSchedulerPolicyRequest)(nil), // 444: api.v1.CreateSchedulerPolicyRequest + (*CreateSchedulerPolicyResponse)(nil), // 445: api.v1.CreateSchedulerPolicyResponse + (*ListSchedulerPoliciesRequest)(nil), // 446: api.v1.ListSchedulerPoliciesRequest + (*ListSchedulerPoliciesResponse)(nil), // 447: api.v1.ListSchedulerPoliciesResponse + (*UpdateSchedulerPolicyRequest)(nil), // 448: api.v1.UpdateSchedulerPolicyRequest + (*UpdateSchedulerPolicyResponse)(nil), // 449: api.v1.UpdateSchedulerPolicyResponse + (*ToggleSchedulerPolicyDisabledRequest)(nil), // 450: api.v1.ToggleSchedulerPolicyDisabledRequest + (*ToggleSchedulerPolicyDisabledResponse)(nil), // 451: api.v1.ToggleSchedulerPolicyDisabledResponse + (*DeleteSchedulerPolicyRequest)(nil), // 452: api.v1.DeleteSchedulerPolicyRequest + (*DeleteSchedulerPolicyResponse)(nil), // 453: api.v1.DeleteSchedulerPolicyResponse + (*PreviewSchedulerPolicyTargetsRequest)(nil), // 454: api.v1.PreviewSchedulerPolicyTargetsRequest + (*SchedulerPolicyTargetMatch)(nil), // 455: api.v1.SchedulerPolicyTargetMatch + (*PreviewSchedulerPolicyTargetsResponse)(nil), // 456: api.v1.PreviewSchedulerPolicyTargetsResponse + (*ListSchedulerPolicyEnrollmentsRequest)(nil), // 457: api.v1.ListSchedulerPolicyEnrollmentsRequest + (*SchedulerPolicyEnrollment)(nil), // 458: api.v1.SchedulerPolicyEnrollment + (*ListSchedulerPolicyEnrollmentsResponse)(nil), // 459: api.v1.ListSchedulerPolicyEnrollmentsResponse + (*SchedulerPolicySync)(nil), // 460: api.v1.SchedulerPolicySync + (*SchedulerConfigPayload)(nil), // 461: api.v1.SchedulerConfigPayload + (*SchedulerRevertInstruction)(nil), // 462: api.v1.SchedulerRevertInstruction + (*SchedulerEnrollmentReport)(nil), // 463: api.v1.SchedulerEnrollmentReport + (*SchedulerRevertEventReport)(nil), // 464: api.v1.SchedulerRevertEventReport + (*GetWorkloadRulesByPolicyRequest)(nil), // 465: api.v1.GetWorkloadRulesByPolicyRequest + (*GetWorkloadRulesByPolicyResponse)(nil), // 466: api.v1.GetWorkloadRulesByPolicyResponse + (*ListWorkloadRulesRequest)(nil), // 467: api.v1.ListWorkloadRulesRequest + (*ListWorkloadRulesResponse)(nil), // 468: api.v1.ListWorkloadRulesResponse + (*GetWorkloadRuleByIDRequest)(nil), // 469: api.v1.GetWorkloadRuleByIDRequest + (*GetWorkloadRuleByIDResponse)(nil), // 470: api.v1.GetWorkloadRuleByIDResponse + (*GetWorkloadRuleByWorkloadRequest)(nil), // 471: api.v1.GetWorkloadRuleByWorkloadRequest + (*GetWorkloadRuleByWorkloadResponse)(nil), // 472: api.v1.GetWorkloadRuleByWorkloadResponse + (*GetWorkloadByWorkloadRuleRequest)(nil), // 473: api.v1.GetWorkloadByWorkloadRuleRequest + (*GetWorkloadByWorkloadRuleResponse)(nil), // 474: api.v1.GetWorkloadByWorkloadRuleResponse + (*DeleteWorkloadRuleRequest)(nil), // 475: api.v1.DeleteWorkloadRuleRequest + (*DeleteWorkloadRuleResponse)(nil), // 476: api.v1.DeleteWorkloadRuleResponse + (*DeleteAllWorkloadRulesRequest)(nil), // 477: api.v1.DeleteAllWorkloadRulesRequest + (*DeleteAllWorkloadRulesResponse)(nil), // 478: api.v1.DeleteAllWorkloadRulesResponse + (*BulkDeleteWorkloadRulesRequest)(nil), // 479: api.v1.BulkDeleteWorkloadRulesRequest + (*BulkDeleteWorkloadRulesResponse)(nil), // 480: api.v1.BulkDeleteWorkloadRulesResponse + (*BulkToggleWorkloadRulesDisabledRequest)(nil), // 481: api.v1.BulkToggleWorkloadRulesDisabledRequest + (*BulkToggleWorkloadRulesDisabledResponse)(nil), // 482: api.v1.BulkToggleWorkloadRulesDisabledResponse + (*DeleteRuleAndApplyRecommendationRequest)(nil), // 483: api.v1.DeleteRuleAndApplyRecommendationRequest + (*DeleteRuleAndApplyRecommendationResponse)(nil), // 484: api.v1.DeleteRuleAndApplyRecommendationResponse + (*ManualRuleFields)(nil), // 485: api.v1.ManualRuleFields + (*UpsertManualWorkloadRuleRequest)(nil), // 486: api.v1.UpsertManualWorkloadRuleRequest + (*UpsertManualWorkloadRuleResponse)(nil), // 487: api.v1.UpsertManualWorkloadRuleResponse + (*ToggleWorkloadRuleDisabledRequest)(nil), // 488: api.v1.ToggleWorkloadRuleDisabledRequest + (*ToggleWorkloadRuleDisabledResponse)(nil), // 489: api.v1.ToggleWorkloadRuleDisabledResponse + (*PreviewWorkloadRuleRequest)(nil), // 490: api.v1.PreviewWorkloadRuleRequest + (*PreviewWorkloadRuleResponse)(nil), // 491: api.v1.PreviewWorkloadRuleResponse + (*GetWorkloadContainerNamesRequest)(nil), // 492: api.v1.GetWorkloadContainerNamesRequest + (*GetWorkloadContainerNamesResponse)(nil), // 493: api.v1.GetWorkloadContainerNamesResponse + (*BatchAutoOptimizeWorkload)(nil), // 494: api.v1.BatchAutoOptimizeWorkload + (*BatchAutoOptimizeWorkloadsRequest)(nil), // 495: api.v1.BatchAutoOptimizeWorkloadsRequest + (*BatchAutoOptimizeWorkloadResult)(nil), // 496: api.v1.BatchAutoOptimizeWorkloadResult + (*BatchAutoOptimizeWorkloadsResponse)(nil), // 497: api.v1.BatchAutoOptimizeWorkloadsResponse + (*BatchWorkloadEntry)(nil), // 498: api.v1.BatchWorkloadEntry + (*BatchUpsertManualWorkloadRulesRequest)(nil), // 499: api.v1.BatchUpsertManualWorkloadRulesRequest + (*BatchUpsertManualWorkloadRuleResult)(nil), // 500: api.v1.BatchUpsertManualWorkloadRuleResult + (*BatchUpsertManualWorkloadRulesResponse)(nil), // 501: api.v1.BatchUpsertManualWorkloadRulesResponse + (*BatchPreviewWorkloadRulesRequest)(nil), // 502: api.v1.BatchPreviewWorkloadRulesRequest + (*BatchPreviewWorkloadRuleResult)(nil), // 503: api.v1.BatchPreviewWorkloadRuleResult + (*BatchPreviewWorkloadRulesResponse)(nil), // 504: api.v1.BatchPreviewWorkloadRulesResponse + (*ApplyOneTimeOptimizationRequest)(nil), // 505: api.v1.ApplyOneTimeOptimizationRequest + (*ApplyOneTimeOptimizationResponse)(nil), // 506: api.v1.ApplyOneTimeOptimizationResponse + (*WorkloadProfileManifest)(nil), // 507: api.v1.WorkloadProfileManifest + (*BatchWorkloadProfiles)(nil), // 508: api.v1.BatchWorkloadProfiles + (*NodeConfigApplyEvent)(nil), // 509: api.v1.NodeConfigApplyEvent + (*GetNodeRecommendationStatusRequest)(nil), // 510: api.v1.GetNodeRecommendationStatusRequest + (*GetNodeRecommendationStatusResponse)(nil), // 511: api.v1.GetNodeRecommendationStatusResponse + (*EnableCheckpointForPolicyRequest)(nil), // 512: api.v1.EnableCheckpointForPolicyRequest + (*EnableCheckpointForPolicyResponse)(nil), // 513: api.v1.EnableCheckpointForPolicyResponse + (*GetCheckpointApplyStatusRequest)(nil), // 514: api.v1.GetCheckpointApplyStatusRequest + (*GetCheckpointApplyStatusResponse)(nil), // 515: api.v1.GetCheckpointApplyStatusResponse + (*NodeApplyFailure)(nil), // 516: api.v1.NodeApplyFailure + (*GetClusterCheckpointLabelCoverageRequest)(nil), // 517: api.v1.GetClusterCheckpointLabelCoverageRequest + (*NodeGroupCheckpointLabelCoverage)(nil), // 518: api.v1.NodeGroupCheckpointLabelCoverage + (*GetClusterCheckpointLabelCoverageResponse)(nil), // 519: api.v1.GetClusterCheckpointLabelCoverageResponse + (*ListNodeGroupCheckpointLabelStateRequest)(nil), // 520: api.v1.ListNodeGroupCheckpointLabelStateRequest + (*NodeCheckpointLabelEntry)(nil), // 521: api.v1.NodeCheckpointLabelEntry + (*ListNodeGroupCheckpointLabelStateResponse)(nil), // 522: api.v1.ListNodeGroupCheckpointLabelStateResponse + (*SnapshotPercentBounds)(nil), // 523: api.v1.SnapshotPercentBounds + (*SnapshotResourceThreshold)(nil), // 524: api.v1.SnapshotResourceThreshold + (*SnapshotSchedulePolicySpec)(nil), // 525: api.v1.SnapshotSchedulePolicySpec + (*SnapshotGlobalRetention)(nil), // 526: api.v1.SnapshotGlobalRetention + (*SnapshotContainerRetentionPolicy)(nil), // 527: api.v1.SnapshotContainerRetentionPolicy + (*SnapshotPodRetentionPolicy)(nil), // 528: api.v1.SnapshotPodRetentionPolicy + (*SnapshotNamespaceRetentionPolicy)(nil), // 529: api.v1.SnapshotNamespaceRetentionPolicy + (*SnapshotRetentionPolicySpec)(nil), // 530: api.v1.SnapshotRetentionPolicySpec + (*SnapshotPolicy)(nil), // 531: api.v1.SnapshotPolicy + (*ForensicSnapshotPolicy)(nil), // 532: api.v1.ForensicSnapshotPolicy + (*SnapshotTargetScope)(nil), // 533: api.v1.SnapshotTargetScope + (*SnapshotPolicyTarget)(nil), // 534: api.v1.SnapshotPolicyTarget + (*ForensicSnapshotPolicyTarget)(nil), // 535: api.v1.ForensicSnapshotPolicyTarget + (*CreateSnapshotPoliciesRequest)(nil), // 536: api.v1.CreateSnapshotPoliciesRequest + (*CreateSnapshotPoliciesResponse)(nil), // 537: api.v1.CreateSnapshotPoliciesResponse + (*ListSnapshotPoliciesRequest)(nil), // 538: api.v1.ListSnapshotPoliciesRequest + (*ListSnapshotPoliciesResponse)(nil), // 539: api.v1.ListSnapshotPoliciesResponse + (*UpdateSnapshotPolicyRequest)(nil), // 540: api.v1.UpdateSnapshotPolicyRequest + (*UpdateSnapshotPolicyResponse)(nil), // 541: api.v1.UpdateSnapshotPolicyResponse + (*DeleteSnapshotPolicyRequest)(nil), // 542: api.v1.DeleteSnapshotPolicyRequest + (*DeleteSnapshotPolicyResponse)(nil), // 543: api.v1.DeleteSnapshotPolicyResponse + (*CreateSnapshotPolicyTargetsRequest)(nil), // 544: api.v1.CreateSnapshotPolicyTargetsRequest + (*CreateSnapshotPolicyTargetsResponse)(nil), // 545: api.v1.CreateSnapshotPolicyTargetsResponse + (*ListSnapshotPolicyTargetsRequest)(nil), // 546: api.v1.ListSnapshotPolicyTargetsRequest + (*ListSnapshotPolicyTargetsResponse)(nil), // 547: api.v1.ListSnapshotPolicyTargetsResponse + (*UpdateSnapshotPolicyTargetRequest)(nil), // 548: api.v1.UpdateSnapshotPolicyTargetRequest + (*UpdateSnapshotPolicyTargetResponse)(nil), // 549: api.v1.UpdateSnapshotPolicyTargetResponse + (*DeleteSnapshotPolicyTargetRequest)(nil), // 550: api.v1.DeleteSnapshotPolicyTargetRequest + (*DeleteSnapshotPolicyTargetResponse)(nil), // 551: api.v1.DeleteSnapshotPolicyTargetResponse + (*CreateForensicSnapshotPoliciesRequest)(nil), // 552: api.v1.CreateForensicSnapshotPoliciesRequest + (*CreateForensicSnapshotPoliciesResponse)(nil), // 553: api.v1.CreateForensicSnapshotPoliciesResponse + (*ListForensicSnapshotPoliciesRequest)(nil), // 554: api.v1.ListForensicSnapshotPoliciesRequest + (*ListForensicSnapshotPoliciesResponse)(nil), // 555: api.v1.ListForensicSnapshotPoliciesResponse + (*UpdateForensicSnapshotPolicyRequest)(nil), // 556: api.v1.UpdateForensicSnapshotPolicyRequest + (*UpdateForensicSnapshotPolicyResponse)(nil), // 557: api.v1.UpdateForensicSnapshotPolicyResponse + (*DeleteForensicSnapshotPolicyRequest)(nil), // 558: api.v1.DeleteForensicSnapshotPolicyRequest + (*DeleteForensicSnapshotPolicyResponse)(nil), // 559: api.v1.DeleteForensicSnapshotPolicyResponse + (*CreateForensicSnapshotPolicyTargetsRequest)(nil), // 560: api.v1.CreateForensicSnapshotPolicyTargetsRequest + (*CreateForensicSnapshotPolicyTargetsResponse)(nil), // 561: api.v1.CreateForensicSnapshotPolicyTargetsResponse + (*ListForensicSnapshotPolicyTargetsRequest)(nil), // 562: api.v1.ListForensicSnapshotPolicyTargetsRequest + (*ListForensicSnapshotPolicyTargetsResponse)(nil), // 563: api.v1.ListForensicSnapshotPolicyTargetsResponse + (*UpdateForensicSnapshotPolicyTargetRequest)(nil), // 564: api.v1.UpdateForensicSnapshotPolicyTargetRequest + (*UpdateForensicSnapshotPolicyTargetResponse)(nil), // 565: api.v1.UpdateForensicSnapshotPolicyTargetResponse + (*DeleteForensicSnapshotPolicyTargetRequest)(nil), // 566: api.v1.DeleteForensicSnapshotPolicyTargetRequest + (*DeleteForensicSnapshotPolicyTargetResponse)(nil), // 567: api.v1.DeleteForensicSnapshotPolicyTargetResponse + (*TriggerForensicSnapshotRunRequest)(nil), // 568: api.v1.TriggerForensicSnapshotRunRequest + (*TriggerForensicSnapshotRunResponse)(nil), // 569: api.v1.TriggerForensicSnapshotRunResponse + (*SnapshotResolvedWorkload)(nil), // 570: api.v1.SnapshotResolvedWorkload + (*SnapshotResolvedNamespace)(nil), // 571: api.v1.SnapshotResolvedNamespace + (*SnapshotClusterScopePreview)(nil), // 572: api.v1.SnapshotClusterScopePreview + (*PreviewSnapshotPolicyTargetMatchesRequest)(nil), // 573: api.v1.PreviewSnapshotPolicyTargetMatchesRequest + (*PreviewSnapshotPolicyTargetMatchesResponse)(nil), // 574: api.v1.PreviewSnapshotPolicyTargetMatchesResponse + (*ForensicTargetOverlap)(nil), // 575: api.v1.ForensicTargetOverlap + (*PreviewForensicSnapshotPolicyTargetMatchesRequest)(nil), // 576: api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest + (*PreviewForensicSnapshotPolicyTargetMatchesResponse)(nil), // 577: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse + (*SnapshotRenderedScopeRow)(nil), // 578: api.v1.SnapshotRenderedScopeRow + (*GetSnapshotPolicyTargetRenderedScopeRequest)(nil), // 579: api.v1.GetSnapshotPolicyTargetRenderedScopeRequest + (*GetSnapshotPolicyTargetRenderedScopeResponse)(nil), // 580: api.v1.GetSnapshotPolicyTargetRenderedScopeResponse + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest)(nil), // 581: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest + (*GetForensicSnapshotPolicyTargetRenderedScopeResponse)(nil), // 582: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse + (*SnapshotConfigInfo)(nil), // 583: api.v1.SnapshotConfigInfo + (*SnapshotConfigApplyEventInfo)(nil), // 584: api.v1.SnapshotConfigApplyEventInfo + (*GetSnapshotRecommendationStatusRequest)(nil), // 585: api.v1.GetSnapshotRecommendationStatusRequest + (*GetSnapshotRecommendationStatusResponse)(nil), // 586: api.v1.GetSnapshotRecommendationStatusResponse + (*GetForensicSnapshotRecommendationStatusRequest)(nil), // 587: api.v1.GetForensicSnapshotRecommendationStatusRequest + (*GetForensicSnapshotRecommendationStatusResponse)(nil), // 588: api.v1.GetForensicSnapshotRecommendationStatusResponse + (*PreviewSnapshotRecommendationConfigRequest)(nil), // 589: api.v1.PreviewSnapshotRecommendationConfigRequest + (*PreviewSnapshotRecommendationConfigResponse)(nil), // 590: api.v1.PreviewSnapshotRecommendationConfigResponse + (*PreviewForensicSnapshotRecommendationConfigRequest)(nil), // 591: api.v1.PreviewForensicSnapshotRecommendationConfigRequest + (*PreviewForensicSnapshotRecommendationConfigResponse)(nil), // 592: api.v1.PreviewForensicSnapshotRecommendationConfigResponse + (*ListReferencedAuthenticationsRequest)(nil), // 593: api.v1.ListReferencedAuthenticationsRequest + (*ReferencedAuthentication)(nil), // 594: api.v1.ReferencedAuthentication + (*ListReferencedAuthenticationsResponse)(nil), // 595: api.v1.ListReferencedAuthenticationsResponse + nil, // 596: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry + nil, // 597: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry + nil, // 598: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry + nil, // 599: api.v1.HPAMetricTrigger.MetadataEntry + nil, // 600: api.v1.KEDATrigger.MetadataEntry + nil, // 601: api.v1.AgentHealth.NodeNameToAgentEntry + nil, // 602: api.v1.WorkloadRecommendation.SourceImagesEntry + nil, // 603: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry + nil, // 604: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry + nil, // 605: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry + nil, // 606: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry + nil, // 607: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry + nil, // 608: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry + nil, // 609: api.v1.NodePolicy.LabelsEntry + nil, // 610: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry + nil, // 611: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry + nil, // 612: api.v1.AWSNodeClassSpec.TagsEntry + nil, // 613: api.v1.SubnetSelectorTerm.TagsEntry + nil, // 614: api.v1.SecurityGroupSelectorTerm.TagsEntry + nil, // 615: api.v1.CapacityReservationSelectorTerm.TagsEntry + nil, // 616: api.v1.AMISelectorTerm.TagsEntry + nil, // 617: api.v1.KubeletConfiguration.SystemReservedEntry + nil, // 618: api.v1.KubeletConfiguration.KubeReservedEntry + nil, // 619: api.v1.KubeletConfiguration.EvictionHardEntry + nil, // 620: api.v1.KubeletConfiguration.EvictionSoftEntry + nil, // 621: api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry + nil, // 622: api.v1.GCPNodeClassSpec.LabelsEntry + nil, // 623: api.v1.GCPNodeClassSpec.MetadataEntry + nil, // 624: api.v1.AzureNodeClassSpec.TagsEntry + nil, // 625: api.v1.OCINodeClassSpec.MetaDataEntry + nil, // 626: api.v1.OCINodeClassSpec.TagsEntry + nil, // 627: api.v1.OCINodeClassSpec.FreeFormTagsEntry + nil, // 628: api.v1.SnapshotCRStatus.AnnotationsEntry + nil, // 629: api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry + nil, // 630: api.v1.SchedulerPolicyProto.ClusterNamesEntry + nil, // 631: api.v1.ListSchedulerPolicyEnrollmentsResponse.ClusterNamesEntry + (*SchedulerEnrollmentReport_Observation)(nil), // 632: api.v1.SchedulerEnrollmentReport.Observation + (*SchedulerRevertEventReport_Event)(nil), // 633: api.v1.SchedulerRevertEventReport.Event + nil, // 634: api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry + nil, // 635: api.v1.ListWorkloadRulesResponse.ClusterNamesEntry + nil, // 636: api.v1.ListWorkloadRulesResponse.PolicyNamesEntry + (*timestamppb.Timestamp)(nil), // 637: google.protobuf.Timestamp + (*WorkloadFilters)(nil), // 638: api.v1.WorkloadFilters + (*Pagination)(nil), // 639: api.v1.Pagination + (K8SObjectKind)(0), // 640: api.v1.K8sObjectKind + (*LabelSelector)(nil), // 641: api.v1.LabelSelector + (*RegexPattern)(nil), // 642: api.v1.RegexPattern + (*WorkloadItem)(nil), // 643: api.v1.WorkloadItem + (*MetricPercentiles)(nil), // 644: api.v1.MetricPercentiles + (*NodeGroup)(nil), // 645: api.v1.NodeGroup + (*HPABehavior)(nil), // 646: api.v1.HPABehavior + (*HPAConnector)(nil), // 647: api.v1.HPAConnector + (*money.Money)(nil), // 648: google.type.Money + (*SavingsTimeSeries)(nil), // 649: api.v1.SavingsTimeSeries + (*GetWorkloadResponse)(nil), // 650: api.v1.GetWorkloadResponse + (*CloudProvider)(nil), // 651: api.v1.CloudProvider + (ProfileWindow)(0), // 652: api.v1.ProfileWindow + (*WorkloadProfileResult)(nil), // 653: api.v1.WorkloadProfileResult + (*ProfileKey)(nil), // 654: api.v1.ProfileKey + (*WorkloadProfileSnapshot)(nil), // 655: api.v1.WorkloadProfileSnapshot } var file_api_v1_recommendation_proto_depIdxs = []int32{ - 406, // 0: api.v1.GetRecommendationsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 1: api.v1.GetRecommendationsRequest.end_time:type_name -> google.protobuf.Timestamp - 407, // 2: api.v1.GetRecommendationsRequest.filters:type_name -> api.v1.WorkloadFilters - 408, // 3: api.v1.GetRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 171, // 4: api.v1.GetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 408, // 5: api.v1.GetRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 406, // 6: api.v1.GetRecommendationsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 7: api.v1.GetRecommendationsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 171, // 8: api.v1.GetRecommendationsForWorkloadResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 406, // 9: api.v1.GetNodeGroupStatsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 10: api.v1.GetNodeGroupStatsRequest.end_time:type_name -> google.protobuf.Timestamp - 147, // 11: api.v1.GetNodeGroupStatsResponse.node_stats:type_name -> api.v1.NodeStats - 406, // 12: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 13: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp - 11, // 14: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.mode:type_name -> api.v1.RecommendationMode - 409, // 15: api.v1.GetLatestWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 409, // 16: api.v1.GetLatestWorkloadRecommendationResponse.kind:type_name -> api.v1.K8sObjectKind - 153, // 17: api.v1.GetLatestWorkloadRecommendationResponse.container_recommendations:type_name -> api.v1.ContainerRecommendation - 156, // 18: api.v1.GetLatestWorkloadRecommendationResponse.current_tolerations:type_name -> api.v1.Toleration - 156, // 19: api.v1.GetLatestWorkloadRecommendationResponse.recommended_tolerations:type_name -> api.v1.Toleration - 409, // 20: api.v1.GetPreviewWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 406, // 21: api.v1.GetPreviewWorkloadRecommendationRequest.timestamp:type_name -> google.protobuf.Timestamp - 410, // 22: api.v1.GetPreviewWorkloadRecommendationRequest.vpa_lookback:type_name -> google.protobuf.Duration - 410, // 23: api.v1.GetPreviewWorkloadRecommendationRequest.hpa_lookback:type_name -> google.protobuf.Duration - 171, // 24: api.v1.GetPreviewWorkloadRecommendationResponse.rec:type_name -> api.v1.WorkloadRecommendation - 31, // 25: api.v1.GetPreviewWorkloadRecommendationsRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 406, // 26: api.v1.GetPreviewWorkloadRecommendationsRequest.timestamp:type_name -> google.protobuf.Timestamp - 410, // 27: api.v1.GetPreviewWorkloadRecommendationsRequest.vpa_lookback:type_name -> google.protobuf.Duration - 410, // 28: api.v1.GetPreviewWorkloadRecommendationsRequest.hpa_lookback:type_name -> google.protobuf.Duration - 409, // 29: api.v1.WorkloadIdentifier.kind:type_name -> api.v1.K8sObjectKind - 29, // 30: api.v1.GetPreviewWorkloadRecommendationsResponse.recommendations:type_name -> api.v1.GetPreviewWorkloadRecommendationResponse - 11, // 31: api.v1.CreateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 32: api.v1.CreateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 157, // 33: api.v1.CreateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 157, // 34: api.v1.GetClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 157, // 35: api.v1.ListClusterRecommendationPoliciesResponse.policies:type_name -> api.v1.ClusterRecommendationPolicy - 11, // 36: api.v1.UpdateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 37: api.v1.UpdateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 157, // 38: api.v1.UpdateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 406, // 39: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 40: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.end_time:type_name -> google.protobuf.Timestamp - 31, // 41: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workloads:type_name -> api.v1.WorkloadIdentifier - 374, // 42: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workload_target_map:type_name -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - 9, // 43: api.v1.CreateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 44: api.v1.CreateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 45: api.v1.CreateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 46: api.v1.CreateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 47: api.v1.CreateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 158, // 48: api.v1.GetNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 158, // 49: api.v1.ListNodeGroupRecommendationPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 9, // 50: api.v1.UpdateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 51: api.v1.UpdateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 52: api.v1.UpdateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 53: api.v1.UpdateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 54: api.v1.UpdateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 161, // 55: api.v1.CreateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 56: api.v1.CreateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 57: api.v1.GetWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 58: api.v1.ListWorkloadRecommendationPoliciesResponse.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 59: api.v1.UpdateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 60: api.v1.UpdateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 409, // 61: api.v1.AttachWorkloadRecommendationPolicyRequest.kind:type_name -> api.v1.K8sObjectKind - 31, // 62: api.v1.AttachWorkloadRecommendationPoliciesRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 74, // 63: api.v1.AttachWorkloadRecommendationPoliciesResponse.attachments:type_name -> api.v1.WorkloadPolicyAttachment - 409, // 64: api.v1.WorkloadPolicyAttachment.kind:type_name -> api.v1.K8sObjectKind - 406, // 65: api.v1.WorkloadPolicyAttachment.created_at:type_name -> google.protobuf.Timestamp - 406, // 66: api.v1.WorkloadPolicyAttachment.updated_at:type_name -> google.protobuf.Timestamp - 411, // 67: api.v1.WorkloadPolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 68: api.v1.WorkloadPolicyTarget.workload_selector:type_name -> api.v1.LabelSelector - 409, // 69: api.v1.WorkloadPolicyTarget.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 70: api.v1.WorkloadPolicyTarget.name_pattern:type_name -> api.v1.RegexPattern - 411, // 71: api.v1.WorkloadPolicyTarget.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 72: api.v1.WorkloadPolicyTarget.namespace_pattern:type_name -> api.v1.RegexPattern - 406, // 73: api.v1.WorkloadPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 74: api.v1.WorkloadPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 411, // 75: api.v1.CreateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 76: api.v1.CreateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 77: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 78: api.v1.CreateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 79: api.v1.CreateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 80: api.v1.CreateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 75, // 81: api.v1.CreateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 75, // 82: api.v1.GetWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 75, // 83: api.v1.ListWorkloadPolicyTargetsResponse.targets:type_name -> api.v1.WorkloadPolicyTarget - 411, // 84: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 85: api.v1.UpdateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 86: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 87: api.v1.UpdateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 88: api.v1.UpdateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 89: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 75, // 90: api.v1.UpdateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 411, // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 92: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 93: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 94: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 95: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 96: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 413, // 97: api.v1.PreviewWorkloadPolicyTargetMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadItem - 411, // 98: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 99: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 100: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 101: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 102: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 103: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 171, // 104: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 413, // 105: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_items:type_name -> api.v1.WorkloadItem - 375, // 106: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_percentiles:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - 414, // 107: api.v1.WorkloadPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles - 414, // 108: api.v1.WorkloadPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles - 414, // 109: api.v1.WorkloadPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles - 414, // 110: api.v1.WorkloadPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles - 414, // 111: api.v1.WorkloadPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles - 406, // 112: api.v1.NodeGroupPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 113: api.v1.NodeGroupPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 95, // 114: api.v1.CreateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 115: api.v1.GetNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 116: api.v1.ListNodeGroupPolicyTargetsResponse.targets:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 117: api.v1.UpdateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 415, // 118: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse.matched_node_groups:type_name -> api.v1.NodeGroup - 169, // 119: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.NodeGroupRecommendation - 164, // 120: api.v1.BalanceGetRecommendationsRequest.register:type_name -> api.v1.BalanceRegisterRequest - 166, // 121: api.v1.BalanceGetRecommendationsRequest.apply:type_name -> api.v1.BalanceApplyRecommendationResponse - 141, // 122: api.v1.BalanceGetRecommendationsRequest.workload_meta:type_name -> api.v1.ReconcileWorkload - 171, // 123: api.v1.BalanceGetRecommendationsRequest.in_cluster_recommendation:type_name -> api.v1.WorkloadRecommendation - 143, // 124: api.v1.BalanceGetRecommendationsRequest.operator_health:type_name -> api.v1.OperatorHealth - 144, // 125: api.v1.BalanceGetRecommendationsRequest.agent_health:type_name -> api.v1.AgentHealth - 169, // 126: api.v1.BalanceGetRecommendationsResponse.node_group_recommendation:type_name -> api.v1.NodeGroupRecommendation - 171, // 127: api.v1.BalanceGetRecommendationsResponse.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 286, // 128: api.v1.BalanceGetRecommendationsResponse.node_recommendation:type_name -> api.v1.NodeRecommendation - 114, // 129: api.v1.BalanceGetRecommendationsResponse.batch_node_group_recommendations:type_name -> api.v1.BatchNodeGroupRecommendations - 115, // 130: api.v1.BalanceGetRecommendationsResponse.batch_workload_recommendations:type_name -> api.v1.BatchWorkloadRecommendations - 129, // 131: api.v1.BalanceGetRecommendationsResponse.kind_to_namespace_to_workloads:type_name -> api.v1.WorkloadWithActiveRecommendations - 142, // 132: api.v1.BalanceGetRecommendationsResponse.workload_reconcile_response:type_name -> api.v1.ReconcileResponse - 369, // 133: api.v1.BalanceGetRecommendationsResponse.workload_profile_manifest:type_name -> api.v1.WorkloadProfileManifest - 370, // 134: api.v1.BalanceGetRecommendationsResponse.batch_workload_profiles:type_name -> api.v1.BatchWorkloadProfiles - 146, // 135: api.v1.BalanceGetRecommendationsResponse.health_update_requested:type_name -> api.v1.HealthReport - 131, // 136: api.v1.BalanceGetRecommendationsResponse.batch_generic_resource_recommendations:type_name -> api.v1.BatchGenericResourceRecommendations - 132, // 137: api.v1.BalanceGetRecommendationsResponse.batch_pvc_storage_recommendations:type_name -> api.v1.BatchPvcStorageRecommendations - 128, // 138: api.v1.BalanceGetRecommendationsResponse.batch_workload_rules:type_name -> api.v1.BatchWorkloadRules - 284, // 139: api.v1.BalanceGetRecommendationsResponse.karpenter_settings:type_name -> api.v1.KarpenterSettingsRecommendation - 169, // 140: api.v1.BatchNodeGroupRecommendations.recommendations:type_name -> api.v1.NodeGroupRecommendation - 171, // 141: api.v1.BatchWorkloadRecommendations.recommendations:type_name -> api.v1.WorkloadRecommendation - 117, // 142: api.v1.WorkloadRule.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 143: api.v1.WorkloadRule.memory_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 144: api.v1.WorkloadRule.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 122, // 145: api.v1.WorkloadRule.hpa_rule:type_name -> api.v1.HPARuleConfig - 7, // 146: api.v1.WorkloadRule.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 147: api.v1.WorkloadRule.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 123, // 148: api.v1.WorkloadRule.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 125, // 149: api.v1.WorkloadRule.percentiles:type_name -> api.v1.ResourcePercentiles - 127, // 150: api.v1.WorkloadRule.classification:type_name -> api.v1.WorkloadClassification - 406, // 151: api.v1.WorkloadRule.created_at:type_name -> google.protobuf.Timestamp - 406, // 152: api.v1.WorkloadRule.updated_at:type_name -> google.protobuf.Timestamp - 121, // 153: api.v1.WorkloadRule.containers:type_name -> api.v1.ContainerResourceRuleConfig - 376, // 154: api.v1.HPAMetricTrigger.metadata:type_name -> api.v1.HPAMetricTrigger.MetadataEntry - 120, // 155: api.v1.ContainerResourceRuleConfig.cpu_rule:type_name -> api.v1.ContainerResourceConfig - 120, // 156: api.v1.ContainerResourceRuleConfig.memory_rule:type_name -> api.v1.ContainerResourceConfig - 120, // 157: api.v1.ContainerResourceRuleConfig.gpu_rule:type_name -> api.v1.ContainerResourceConfig - 13, // 158: api.v1.HPARuleConfig.primary_metric:type_name -> api.v1.HPAMetricType - 118, // 159: api.v1.HPARuleConfig.metrics:type_name -> api.v1.HPAMetricTrigger - 416, // 160: api.v1.HPARuleConfig.behavior:type_name -> api.v1.HPABehavior - 119, // 161: api.v1.HPARuleConfig.fallback:type_name -> api.v1.HPAFallback - 124, // 162: api.v1.ResourcePercentiles.cpu:type_name -> api.v1.PercentileValues - 124, // 163: api.v1.ResourcePercentiles.memory:type_name -> api.v1.PercentileValues - 124, // 164: api.v1.ResourcePercentiles.network:type_name -> api.v1.PercentileValues - 124, // 165: api.v1.ResourcePercentiles.disk:type_name -> api.v1.PercentileValues - 126, // 166: api.v1.WorkloadClassification.burstiness:type_name -> api.v1.BurstinessRatios - 116, // 167: api.v1.BatchWorkloadRules.rules:type_name -> api.v1.WorkloadRule - 31, // 168: api.v1.WorkloadWithActiveRecommendations.workloads:type_name -> api.v1.WorkloadIdentifier - 406, // 169: api.v1.GenericResourceRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 4, // 170: api.v1.GenericResourceRecommendation.status:type_name -> api.v1.RecommendationStatus - 406, // 171: api.v1.GenericResourceRecommendation.created_at:type_name -> google.protobuf.Timestamp - 406, // 172: api.v1.GenericResourceRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 130, // 173: api.v1.BatchGenericResourceRecommendations.recommendations:type_name -> api.v1.GenericResourceRecommendation - 316, // 174: api.v1.BatchPvcStorageRecommendations.recommendations:type_name -> api.v1.PvcStorageRecommendation - 31, // 175: api.v1.GeneratePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 176: api.v1.GeneratePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 31, // 177: api.v1.GenerateAndCreatePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 178: api.v1.GenerateAndCreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 130, // 179: api.v1.CreatePodDisruptionBudgetRequest.recommendation:type_name -> api.v1.GenericResourceRecommendation - 130, // 180: api.v1.CreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 31, // 181: api.v1.GetPDBRecommendationForWorkloadRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 182: api.v1.GetPDBRecommendationForWorkloadResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 409, // 183: api.v1.ReconcileWorkload.kind:type_name -> api.v1.K8sObjectKind - 0, // 184: api.v1.ReconcileResponse.status:type_name -> api.v1.ReconcileStatus - 171, // 185: api.v1.ReconcileResponse.updated_recommendation:type_name -> api.v1.WorkloadRecommendation - 377, // 186: api.v1.AgentHealth.node_name_to_agent:type_name -> api.v1.AgentHealth.NodeNameToAgentEntry - 148, // 187: api.v1.NodeStats.metrics:type_name -> api.v1.NodeMetric - 406, // 188: api.v1.NodeMetric.timestamp:type_name -> google.protobuf.Timestamp - 409, // 189: api.v1.ContainerStats.kind:type_name -> api.v1.K8sObjectKind - 150, // 190: api.v1.ContainerStats.metrics:type_name -> api.v1.ContainerMetric - 151, // 191: api.v1.ContainerStats.summarized_metrics:type_name -> api.v1.ContainerSummarizedMetric - 406, // 192: api.v1.ContainerMetric.timestamp:type_name -> google.protobuf.Timestamp - 406, // 193: api.v1.ContainerSummarizedMetric.timestamp:type_name -> google.protobuf.Timestamp - 152, // 194: api.v1.ContainerSummarizedMetric.cpu:type_name -> api.v1.Metric - 152, // 195: api.v1.ContainerSummarizedMetric.memory:type_name -> api.v1.Metric - 152, // 196: api.v1.ContainerSummarizedMetric.gpu:type_name -> api.v1.Metric - 152, // 197: api.v1.ContainerSummarizedMetric.gpu_vram:type_name -> api.v1.Metric - 155, // 198: api.v1.ContainerRecommendation.current_request:type_name -> api.v1.ResourceRecommendation - 155, // 199: api.v1.ContainerRecommendation.recommended_request:type_name -> api.v1.ResourceRecommendation - 155, // 200: api.v1.ContainerRecommendation.current_limit:type_name -> api.v1.ResourceRecommendation - 155, // 201: api.v1.ContainerRecommendation.recommended_limit:type_name -> api.v1.ResourceRecommendation - 1, // 202: api.v1.ResourceRecommendation.cpu_action:type_name -> api.v1.ActionToTake - 1, // 203: api.v1.ResourceRecommendation.mem_action:type_name -> api.v1.ActionToTake - 1, // 204: api.v1.ResourceRecommendation.gpu_action:type_name -> api.v1.ActionToTake - 1, // 205: api.v1.ResourceRecommendation.gpu_vram_action:type_name -> api.v1.ActionToTake - 7, // 206: api.v1.ClusterRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 11, // 207: api.v1.ClusterRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 208: api.v1.ClusterRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 7, // 209: api.v1.NodeGroupRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 9, // 210: api.v1.NodeGroupRecommendationPolicy.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 211: api.v1.NodeGroupRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 212: api.v1.NodeGroupRecommendationPolicy.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 213: api.v1.NodeGroupRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 13, // 214: api.v1.HorizontalScalingOptimizationTarget.primary_metric:type_name -> api.v1.HPAMetricType - 7, // 215: api.v1.WorkloadRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 8, // 216: api.v1.WorkloadRecommendationPolicy.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 11, // 217: api.v1.WorkloadRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 159, // 218: api.v1.WorkloadRecommendationPolicy.cpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 219: api.v1.WorkloadRecommendationPolicy.memory_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 220: api.v1.WorkloadRecommendationPolicy.gpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 221: api.v1.WorkloadRecommendationPolicy.gpu_vram_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 160, // 222: api.v1.WorkloadRecommendationPolicy.horizontal_scaling:type_name -> api.v1.HorizontalScalingOptimizationTarget - 7, // 223: api.v1.WorkloadRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 123, // 224: api.v1.WorkloadRecommendationPolicy.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 406, // 225: api.v1.WorkloadRecommendationPolicy.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 226: api.v1.GetPolicyRecommendedDefaultsRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 161, // 227: api.v1.GetPolicyRecommendedDefaultsResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 165, // 228: api.v1.BalanceRegisterRequest.features:type_name -> api.v1.BalanceFeatures - 12, // 229: api.v1.BalanceApplyRecommendationResponse.type:type_name -> api.v1.RecommendationType - 167, // 230: api.v1.BalanceApplyRecommendationResponse.live_migration_result:type_name -> api.v1.LiveMigrationResult - 406, // 231: api.v1.NodeGroupRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 158, // 232: api.v1.NodeGroupRecommendation.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 417, // 233: api.v1.CostImpact.current_cost_per_month:type_name -> google.type.Money - 417, // 234: api.v1.CostImpact.recommended_cost_per_month:type_name -> google.type.Money - 417, // 235: api.v1.CostImpact.current_cpu_cost_per_month:type_name -> google.type.Money - 417, // 236: api.v1.CostImpact.current_memory_cost_per_month:type_name -> google.type.Money - 417, // 237: api.v1.CostImpact.recommended_cpu_cost_per_month:type_name -> google.type.Money - 417, // 238: api.v1.CostImpact.recommended_memory_cost_per_month:type_name -> google.type.Money - 417, // 239: api.v1.CostImpact.current_gpu_cost_per_month:type_name -> google.type.Money - 417, // 240: api.v1.CostImpact.recommended_gpu_cost_per_month:type_name -> google.type.Money - 2, // 241: api.v1.CostImpact.cost_period:type_name -> api.v1.CostPeriod - 409, // 242: api.v1.WorkloadRecommendation.kind:type_name -> api.v1.K8sObjectKind - 153, // 243: api.v1.WorkloadRecommendation.container_recommendations:type_name -> api.v1.ContainerRecommendation - 406, // 244: api.v1.WorkloadRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 154, // 245: api.v1.WorkloadRecommendation.keda_scaled_object_recommendation:type_name -> api.v1.KedaScaledObjectRecommendation - 411, // 246: api.v1.WorkloadRecommendation.label_selector:type_name -> api.v1.LabelSelector - 3, // 247: api.v1.WorkloadRecommendation.del_prop:type_name -> api.v1.LiveMigDeletionPropagation - 156, // 248: api.v1.WorkloadRecommendation.current_tolerations:type_name -> api.v1.Toleration - 156, // 249: api.v1.WorkloadRecommendation.recommended_tolerations:type_name -> api.v1.Toleration - 4, // 250: api.v1.WorkloadRecommendation.status:type_name -> api.v1.RecommendationStatus - 161, // 251: api.v1.WorkloadRecommendation.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 75, // 252: api.v1.WorkloadRecommendation.policy_target:type_name -> api.v1.WorkloadPolicyTarget - 1, // 253: api.v1.WorkloadRecommendation.replica_count_action:type_name -> api.v1.ActionToTake - 167, // 254: api.v1.WorkloadRecommendation.live_migration_result:type_name -> api.v1.LiveMigrationResult - 170, // 255: api.v1.WorkloadRecommendation.cost_impact:type_name -> api.v1.CostImpact - 158, // 256: api.v1.GetAttachedNodeGroupPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 409, // 257: api.v1.GetAttachedWorkloadPoliciesRequest.kind:type_name -> api.v1.K8sObjectKind - 176, // 258: api.v1.GetAttachedWorkloadPoliciesResponse.relevant_policies:type_name -> api.v1.WorkloadRecommendationPolicyGroup - 378, // 259: api.v1.GetAttachedWorkloadPoliciesResponse.policy_id_to_matched_targets:type_name -> api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - 161, // 260: api.v1.WorkloadRecommendationPolicyGroup.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 75, // 261: api.v1.WorkloadPolicyTargetGroup.targets:type_name -> api.v1.WorkloadPolicyTarget - 31, // 262: api.v1.WorkloadIdentifiers.workloads:type_name -> api.v1.WorkloadIdentifier - 31, // 263: api.v1.WorkloadPolicies.workload:type_name -> api.v1.WorkloadIdentifier - 161, // 264: api.v1.WorkloadPolicies.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 379, // 265: api.v1.ListAttachedWorkloadPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - 380, // 266: api.v1.ListAttachedWorkloadPoliciesResponse.workload_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - 381, // 267: api.v1.ListAttachedNodeGroupPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - 382, // 268: api.v1.ListAttachedNodeGroupPoliciesResponse.node_group_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - 409, // 269: api.v1.RecommendationAppliedRequest.kind:type_name -> api.v1.K8sObjectKind - 409, // 270: api.v1.ApplyRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 171, // 271: api.v1.ApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 406, // 272: api.v1.RetrieveSavingsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 273: api.v1.RetrieveSavingsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 418, // 274: api.v1.RetrieveSavingsForWorkloadResponse.savings:type_name -> api.v1.SavingsTimeSeries - 419, // 275: api.v1.RetrieveSavingsForWorkloadResponse.get_workload_resp:type_name -> api.v1.GetWorkloadResponse - 219, // 276: api.v1.CreateNodePoliciesRequest.policies:type_name -> api.v1.NodePolicy - 219, // 277: api.v1.CreateNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 219, // 278: api.v1.SuggestedNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 219, // 279: api.v1.GenerateNodePoliciesFromKarpenterResponse.policies:type_name -> api.v1.NodePolicy - 240, // 280: api.v1.GenerateNodePoliciesFromKarpenterResponse.targets:type_name -> api.v1.NodePolicyTarget - 219, // 281: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.policies:type_name -> api.v1.NodePolicy - 240, // 282: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.targets:type_name -> api.v1.NodePolicyTarget - 212, // 283: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.warnings:type_name -> api.v1.WorkloadCompatibilityWarning - 406, // 284: api.v1.GetMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp - 406, // 285: api.v1.GetMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp - 406, // 286: api.v1.NodePoolValidationReport.reported_at:type_name -> google.protobuf.Timestamp - 210, // 287: api.v1.GetNodePoolValidationsResponse.validations:type_name -> api.v1.NodePoolValidationReport - 219, // 288: api.v1.ListNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 219, // 289: api.v1.UpdateNodePolicyRequest.policy:type_name -> api.v1.NodePolicy - 219, // 290: api.v1.UpdateNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 411, // 291: api.v1.NodePolicy.instance_categories:type_name -> api.v1.LabelSelector - 411, // 292: api.v1.NodePolicy.instance_families:type_name -> api.v1.LabelSelector - 411, // 293: api.v1.NodePolicy.instance_cpus:type_name -> api.v1.LabelSelector - 411, // 294: api.v1.NodePolicy.instance_hypervisors:type_name -> api.v1.LabelSelector - 411, // 295: api.v1.NodePolicy.instance_generations:type_name -> api.v1.LabelSelector - 411, // 296: api.v1.NodePolicy.instance_sizes:type_name -> api.v1.LabelSelector - 411, // 297: api.v1.NodePolicy.instance_types:type_name -> api.v1.LabelSelector - 411, // 298: api.v1.NodePolicy.instance_local_nvme:type_name -> api.v1.LabelSelector - 411, // 299: api.v1.NodePolicy.zones:type_name -> api.v1.LabelSelector - 411, // 300: api.v1.NodePolicy.architectures:type_name -> api.v1.LabelSelector - 411, // 301: api.v1.NodePolicy.capacity_types:type_name -> api.v1.LabelSelector - 411, // 302: api.v1.NodePolicy.operating_systems:type_name -> api.v1.LabelSelector - 383, // 303: api.v1.NodePolicy.labels:type_name -> api.v1.NodePolicy.LabelsEntry - 244, // 304: api.v1.NodePolicy.taints:type_name -> api.v1.Taint - 246, // 305: api.v1.NodePolicy.disruption:type_name -> api.v1.DisruptionPolicy - 247, // 306: api.v1.NodePolicy.limits:type_name -> api.v1.ResourceLimits - 244, // 307: api.v1.NodePolicy.startup_taints:type_name -> api.v1.Taint - 248, // 308: api.v1.NodePolicy.aws:type_name -> api.v1.AWSNodeClassSpec - 272, // 309: api.v1.NodePolicy.gcp:type_name -> api.v1.GCPNodeClassSpec - 275, // 310: api.v1.NodePolicy.azure:type_name -> api.v1.AzureNodeClassSpec - 283, // 311: api.v1.NodePolicy.oci:type_name -> api.v1.OCINodeClassSpec - 420, // 312: api.v1.NodePolicy.cloud_provider:type_name -> api.v1.CloudProvider - 243, // 313: api.v1.NodePolicy.zonal_shift:type_name -> api.v1.ZonalShiftConfig - 285, // 314: api.v1.NodePolicy.raw:type_name -> api.v1.RawKarpenterSpec - 406, // 315: api.v1.NodePolicy.created_at:type_name -> google.protobuf.Timestamp - 406, // 316: api.v1.NodePolicy.updated_at:type_name -> google.protobuf.Timestamp - 406, // 317: api.v1.NodePolicy.deleted_at:type_name -> google.protobuf.Timestamp - 219, // 318: api.v1.PreviewNodeRecommendationConfigRequest.policies:type_name -> api.v1.NodePolicy - 222, // 319: api.v1.PreviewNodeRecommendationConfigResponse.nrc:type_name -> api.v1.NodeRecommendationConfig - 4, // 320: api.v1.NodeRecommendationConfig.status:type_name -> api.v1.RecommendationStatus - 406, // 321: api.v1.NodeRecommendationConfig.created_at:type_name -> google.protobuf.Timestamp - 406, // 322: api.v1.NodeRecommendationConfig.updated_at:type_name -> google.protobuf.Timestamp - 406, // 323: api.v1.NodeRecommendationConfig.deleted_at:type_name -> google.protobuf.Timestamp - 384, // 324: api.v1.SuggestedKarpenterConfigResponse.ng_to_original:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - 385, // 325: api.v1.SuggestedKarpenterConfigResponse.ng_to_suggested:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - 227, // 326: api.v1.GetAvailableKindsByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 5, // 327: api.v1.SearchResourcesByTargetingFiltersRequest.target_filter_type:type_name -> api.v1.TargetFilterType - 227, // 328: api.v1.SearchResourcesByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 409, // 329: api.v1.TargetFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 330: api.v1.TargetFilters.name_pattern:type_name -> api.v1.RegexPattern - 412, // 331: api.v1.TargetFilters.namespace_pattern:type_name -> api.v1.RegexPattern - 409, // 332: api.v1.GetAvailableKindsByTargetingFiltersResponse.kinds:type_name -> api.v1.K8sObjectKind - 230, // 333: api.v1.SearchResourcesByTargetingFiltersResponse.namespaces:type_name -> api.v1.NamespaceSearchResult - 231, // 334: api.v1.SearchResourcesByTargetingFiltersResponse.workloads:type_name -> api.v1.WorkloadSearchResult - 232, // 335: api.v1.SearchResourcesByTargetingFiltersResponse.node_groups:type_name -> api.v1.NodeGroupSearchResult - 233, // 336: api.v1.SearchResourcesByTargetingFiltersResponse.labels:type_name -> api.v1.LabelSearchResult - 240, // 337: api.v1.CreateNodePolicyTargetsRequest.targets:type_name -> api.v1.NodePolicyTarget - 240, // 338: api.v1.CreateNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 240, // 339: api.v1.ListNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 240, // 340: api.v1.UpdateNodePolicyTargetRequest.target:type_name -> api.v1.NodePolicyTarget - 240, // 341: api.v1.UpdateNodePolicyTargetResponse.target:type_name -> api.v1.NodePolicyTarget - 406, // 342: api.v1.NodePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 343: api.v1.NodePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 406, // 344: api.v1.NodePolicyTarget.deleted_at:type_name -> google.protobuf.Timestamp - 242, // 345: api.v1.NodePolicyTarget.status:type_name -> api.v1.NodePolicyTargetStatus - 406, // 346: api.v1.NodePolicyCondition.last_transition_time:type_name -> google.protobuf.Timestamp - 241, // 347: api.v1.NodePolicyTargetStatus.conditions:type_name -> api.v1.NodePolicyCondition - 245, // 348: api.v1.DisruptionPolicy.budgets:type_name -> api.v1.DisruptionBudget - 264, // 349: api.v1.AWSNodeClassSpec.subnet_selector_terms:type_name -> api.v1.SubnetSelectorTerm - 265, // 350: api.v1.AWSNodeClassSpec.security_group_selector_terms:type_name -> api.v1.SecurityGroupSelectorTerm - 266, // 351: api.v1.AWSNodeClassSpec.capacity_reservation_selector_terms:type_name -> api.v1.CapacityReservationSelectorTerm - 267, // 352: api.v1.AWSNodeClassSpec.ami_selector_terms:type_name -> api.v1.AMISelectorTerm - 386, // 353: api.v1.AWSNodeClassSpec.tags:type_name -> api.v1.AWSNodeClassSpec.TagsEntry - 268, // 354: api.v1.AWSNodeClassSpec.kubelet:type_name -> api.v1.KubeletConfiguration - 269, // 355: api.v1.AWSNodeClassSpec.block_device_mappings:type_name -> api.v1.BlockDeviceMapping - 6, // 356: api.v1.AWSNodeClassSpec.instance_store_policy:type_name -> api.v1.InstanceStorePolicy - 271, // 357: api.v1.AWSNodeClassSpec.metadata_options:type_name -> api.v1.MetadataOptions - 253, // 358: api.v1.GetInstanceFamiliesResponse.instance_families:type_name -> api.v1.InstanceFamily - 254, // 359: api.v1.GetInstanceSizesResponse.instance_sizes:type_name -> api.v1.InstanceSize - 255, // 360: api.v1.GetInstanceCategoriesResponse.instance_categories:type_name -> api.v1.InstanceCategory - 256, // 361: api.v1.GetInstanceCPUsResponse.instance_cpus:type_name -> api.v1.InstanceCPU - 257, // 362: api.v1.GetInstanceTypeNamesResponse.instance_types:type_name -> api.v1.InstanceTypeName - 387, // 363: api.v1.SubnetSelectorTerm.tags:type_name -> api.v1.SubnetSelectorTerm.TagsEntry - 388, // 364: api.v1.SecurityGroupSelectorTerm.tags:type_name -> api.v1.SecurityGroupSelectorTerm.TagsEntry - 389, // 365: api.v1.CapacityReservationSelectorTerm.tags:type_name -> api.v1.CapacityReservationSelectorTerm.TagsEntry - 390, // 366: api.v1.AMISelectorTerm.tags:type_name -> api.v1.AMISelectorTerm.TagsEntry - 391, // 367: api.v1.KubeletConfiguration.system_reserved:type_name -> api.v1.KubeletConfiguration.SystemReservedEntry - 392, // 368: api.v1.KubeletConfiguration.kube_reserved:type_name -> api.v1.KubeletConfiguration.KubeReservedEntry - 393, // 369: api.v1.KubeletConfiguration.eviction_hard:type_name -> api.v1.KubeletConfiguration.EvictionHardEntry - 394, // 370: api.v1.KubeletConfiguration.eviction_soft:type_name -> api.v1.KubeletConfiguration.EvictionSoftEntry - 395, // 371: api.v1.KubeletConfiguration.eviction_soft_grace_period:type_name -> api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - 270, // 372: api.v1.BlockDeviceMapping.ebs:type_name -> api.v1.BlockDevice - 273, // 373: api.v1.GCPNodeClassSpec.image_selector_terms:type_name -> api.v1.GCPImageSelectorTerm - 268, // 374: api.v1.GCPNodeClassSpec.kubelet_configuration:type_name -> api.v1.KubeletConfiguration - 396, // 375: api.v1.GCPNodeClassSpec.labels:type_name -> api.v1.GCPNodeClassSpec.LabelsEntry - 397, // 376: api.v1.GCPNodeClassSpec.metadata:type_name -> api.v1.GCPNodeClassSpec.MetadataEntry - 274, // 377: api.v1.GCPNodeClassSpec.disks:type_name -> api.v1.GCPDisk - 398, // 378: api.v1.AzureNodeClassSpec.tags:type_name -> api.v1.AzureNodeClassSpec.TagsEntry - 276, // 379: api.v1.AzureNodeClassSpec.kubelet:type_name -> api.v1.AzureKubeletConfiguration - 277, // 380: api.v1.OCINodeClassSpec.image_selector:type_name -> api.v1.OCIImageSelectorTerm - 278, // 381: api.v1.OCINodeClassSpec.subnet_selector:type_name -> api.v1.OCISubnetSelectorTerm - 279, // 382: api.v1.OCINodeClassSpec.security_group_selector:type_name -> api.v1.OCISecurityGroupSelectorTerm - 399, // 383: api.v1.OCINodeClassSpec.meta_data:type_name -> api.v1.OCINodeClassSpec.MetaDataEntry - 400, // 384: api.v1.OCINodeClassSpec.tags:type_name -> api.v1.OCINodeClassSpec.TagsEntry - 401, // 385: api.v1.OCINodeClassSpec.free_form_tags:type_name -> api.v1.OCINodeClassSpec.FreeFormTagsEntry - 280, // 386: api.v1.OCINodeClassSpec.boot_config:type_name -> api.v1.OCIBootConfig - 281, // 387: api.v1.OCINodeClassSpec.launch_options:type_name -> api.v1.OCILaunchOptions - 282, // 388: api.v1.OCINodeClassSpec.block_devices:type_name -> api.v1.OCIVolumeAttributes - 287, // 389: api.v1.NodeRecommendation.aws:type_name -> api.v1.AWSKarpenterSpec - 288, // 390: api.v1.NodeRecommendation.aks:type_name -> api.v1.AKSKarpenterSpec - 292, // 391: api.v1.NodeRecommendation.gcp:type_name -> api.v1.GCPKarpenterSpec - 294, // 392: api.v1.NodeRecommendation.oci:type_name -> api.v1.OCIKarpenterSpec - 289, // 393: api.v1.AWSKarpenterSpec.np:type_name -> api.v1.NodePool - 290, // 394: api.v1.AWSKarpenterSpec.ec2nc:type_name -> api.v1.EC2NodeClass - 289, // 395: api.v1.AKSKarpenterSpec.np:type_name -> api.v1.NodePool - 291, // 396: api.v1.AKSKarpenterSpec.aksnc:type_name -> api.v1.AKSNodeClass - 289, // 397: api.v1.GCPKarpenterSpec.np:type_name -> api.v1.NodePool - 293, // 398: api.v1.GCPKarpenterSpec.node_classes:type_name -> api.v1.GCENodeClass - 289, // 399: api.v1.OCIKarpenterSpec.np:type_name -> api.v1.NodePool - 295, // 400: api.v1.OCIKarpenterSpec.node_classes:type_name -> api.v1.OCINodeClass - 7, // 401: api.v1.StorageRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 7, // 402: api.v1.StorageRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 406, // 403: api.v1.StorageRecommendationPolicy.created_at:type_name -> google.protobuf.Timestamp - 406, // 404: api.v1.StorageRecommendationPolicy.updated_at:type_name -> google.protobuf.Timestamp - 7, // 405: api.v1.CreateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 296, // 406: api.v1.CreateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 296, // 407: api.v1.GetStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 296, // 408: api.v1.ListStorageRecommendationPoliciesResponse.policies:type_name -> api.v1.StorageRecommendationPolicy - 7, // 409: api.v1.UpdateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 296, // 410: api.v1.UpdateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 411, // 411: api.v1.StoragePolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 406, // 412: api.v1.StoragePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 413: api.v1.StoragePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 411, // 414: api.v1.CreateStoragePolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 307, // 415: api.v1.CreateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 307, // 416: api.v1.ListStoragePolicyTargetsResponse.targets:type_name -> api.v1.StoragePolicyTarget - 307, // 417: api.v1.UpdateStoragePolicyTargetRequest.target:type_name -> api.v1.StoragePolicyTarget - 307, // 418: api.v1.UpdateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 4, // 419: api.v1.PvcStorageRecommendation.status:type_name -> api.v1.RecommendationStatus - 406, // 420: api.v1.PvcStorageRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 406, // 421: api.v1.PvcStorageRecommendation.applied_at:type_name -> google.protobuf.Timestamp - 406, // 422: api.v1.PvcStorageRecommendation.created_at:type_name -> google.protobuf.Timestamp - 406, // 423: api.v1.PvcStorageRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 14, // 424: api.v1.PvcStorageRecommendation.operation_type:type_name -> api.v1.PvcOperationType - 316, // 425: api.v1.GetPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 408, // 426: api.v1.ListPvcStorageRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 316, // 427: api.v1.ListPvcStorageRecommendationsResponse.recommendations:type_name -> api.v1.PvcStorageRecommendation - 408, // 428: api.v1.ListPvcStorageRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 316, // 429: api.v1.GeneratePvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 316, // 430: api.v1.PreviewPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 406, // 431: api.v1.WorkloadRuleOOMEvent.timestamp:type_name -> google.protobuf.Timestamp - 406, // 432: api.v1.WorkloadRuleOOMEvent.created_at:type_name -> google.protobuf.Timestamp - 325, // 433: api.v1.ListWorkloadRuleOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 325, // 434: api.v1.ListWorkloadOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 406, // 435: api.v1.WorkloadRuleCPUThrottleEvent.timestamp:type_name -> google.protobuf.Timestamp - 406, // 436: api.v1.WorkloadRuleCPUThrottleEvent.created_at:type_name -> google.protobuf.Timestamp - 330, // 437: api.v1.ListWorkloadRuleCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 330, // 438: api.v1.ListWorkloadCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 406, // 439: api.v1.WorkloadOptimizationPolicyProto.created_at:type_name -> google.protobuf.Timestamp - 406, // 440: api.v1.WorkloadOptimizationPolicyProto.updated_at:type_name -> google.protobuf.Timestamp - 402, // 441: api.v1.WorkloadOptimizationPolicyProto.cluster_names:type_name -> api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - 7, // 442: api.v1.WorkloadOptimizationPolicyProto.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 443: api.v1.WorkloadOptimizationPolicyProto.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 7, // 444: api.v1.CreateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 445: api.v1.CreateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 335, // 446: api.v1.CreateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 335, // 447: api.v1.ListWorkloadOptimizationPoliciesResponse.policies:type_name -> api.v1.WorkloadOptimizationPolicyProto - 335, // 448: api.v1.GetWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 7, // 449: api.v1.UpdateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 450: api.v1.UpdateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 335, // 451: api.v1.UpdateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 116, // 452: api.v1.GetWorkloadRulesByPolicyResponse.managed_rules:type_name -> api.v1.WorkloadRule - 116, // 453: api.v1.GetWorkloadRulesByPolicyResponse.excluded_rules:type_name -> api.v1.WorkloadRule - 403, // 454: api.v1.GetWorkloadRulesByPolicyResponse.cluster_names:type_name -> api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - 116, // 455: api.v1.ListWorkloadRulesResponse.rules:type_name -> api.v1.WorkloadRule - 404, // 456: api.v1.ListWorkloadRulesResponse.cluster_names:type_name -> api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - 405, // 457: api.v1.ListWorkloadRulesResponse.policy_names:type_name -> api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - 116, // 458: api.v1.GetWorkloadRuleByIDResponse.rule:type_name -> api.v1.WorkloadRule - 116, // 459: api.v1.GetWorkloadRuleByWorkloadResponse.rule:type_name -> api.v1.WorkloadRule - 117, // 460: api.v1.ManualRuleFields.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 461: api.v1.ManualRuleFields.memory_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 462: api.v1.ManualRuleFields.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 122, // 463: api.v1.ManualRuleFields.hpa_rule:type_name -> api.v1.HPARuleConfig - 123, // 464: api.v1.ManualRuleFields.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 7, // 465: api.v1.ManualRuleFields.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 466: api.v1.ManualRuleFields.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 121, // 467: api.v1.ManualRuleFields.containers:type_name -> api.v1.ContainerResourceRuleConfig - 358, // 468: api.v1.UpsertManualWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 15, // 469: api.v1.UpsertManualWorkloadRuleRequest.source:type_name -> api.v1.WorkloadRuleSource - 116, // 470: api.v1.UpsertManualWorkloadRuleResponse.rule:type_name -> api.v1.WorkloadRule - 358, // 471: api.v1.PreviewWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 116, // 472: api.v1.PreviewWorkloadRuleResponse.materialized_rule:type_name -> api.v1.WorkloadRule - 116, // 473: api.v1.PreviewWorkloadRuleResponse.engine_projection:type_name -> api.v1.WorkloadRule - 421, // 474: api.v1.PreviewWorkloadRuleResponse.profile:type_name -> api.v1.WorkloadProfileResult - 365, // 475: api.v1.BatchAutoOptimizeWorkloadsRequest.workloads:type_name -> api.v1.BatchAutoOptimizeWorkload - 116, // 476: api.v1.BatchAutoOptimizeWorkloadResult.rule:type_name -> api.v1.WorkloadRule - 367, // 477: api.v1.BatchAutoOptimizeWorkloadsResponse.results:type_name -> api.v1.BatchAutoOptimizeWorkloadResult - 422, // 478: api.v1.WorkloadProfileManifest.window:type_name -> api.v1.ProfileWindow - 423, // 479: api.v1.WorkloadProfileManifest.keys:type_name -> api.v1.ProfileKey - 406, // 480: api.v1.WorkloadProfileManifest.issued_at:type_name -> google.protobuf.Timestamp - 422, // 481: api.v1.BatchWorkloadProfiles.window:type_name -> api.v1.ProfileWindow - 424, // 482: api.v1.BatchWorkloadProfiles.profiles:type_name -> api.v1.WorkloadProfileSnapshot - 406, // 483: api.v1.NodeConfigApplyEvent.applied_at:type_name -> google.protobuf.Timestamp - 222, // 484: api.v1.GetNodeRecommendationStatusResponse.current_config:type_name -> api.v1.NodeRecommendationConfig - 371, // 485: api.v1.GetNodeRecommendationStatusResponse.history:type_name -> api.v1.NodeConfigApplyEvent - 47, // 486: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry.value:type_name -> api.v1.TargetIdList - 94, // 487: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry.value:type_name -> api.v1.WorkloadPercentileSummary - 145, // 488: api.v1.AgentHealth.NodeNameToAgentEntry.value:type_name -> api.v1.AgentHealthMeta - 177, // 489: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry.value:type_name -> api.v1.WorkloadPolicyTargetGroup - 161, // 490: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.WorkloadRecommendationPolicy - 413, // 491: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry.value:type_name -> api.v1.WorkloadItem - 158, // 492: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.NodeGroupRecommendationPolicy - 184, // 493: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroupItem - 222, // 494: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry.value:type_name -> api.v1.NodeRecommendationConfig - 222, // 495: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry.value:type_name -> api.v1.NodeRecommendationConfig - 20, // 496: api.v1.K8sRecommendationService.GetNodeGroupStats:input_type -> api.v1.GetNodeGroupStatsRequest - 24, // 497: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:input_type -> api.v1.GetLatestNodeGroupRecommendationRequest - 26, // 498: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:input_type -> api.v1.GetLatestWorkloadRecommendationRequest - 28, // 499: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:input_type -> api.v1.GetPreviewWorkloadRecommendationRequest - 30, // 500: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:input_type -> api.v1.GetPreviewWorkloadRecommendationsRequest - 18, // 501: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:input_type -> api.v1.GetRecommendationsForWorkloadRequest - 16, // 502: api.v1.K8sRecommendationService.GetRecommendations:input_type -> api.v1.GetRecommendationsRequest - 48, // 503: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:input_type -> api.v1.CreateNodeGroupRecommendationPolicyRequest - 50, // 504: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:input_type -> api.v1.GetNodeGroupRecommendationPolicyRequest - 52, // 505: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:input_type -> api.v1.ListNodeGroupRecommendationPoliciesRequest - 54, // 506: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:input_type -> api.v1.UpdateNodeGroupRecommendationPolicyRequest - 56, // 507: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:input_type -> api.v1.DeleteNodeGroupRecommendationPolicyRequest - 58, // 508: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:input_type -> api.v1.AttachNodeGroupRecommendationPolicyRequest - 60, // 509: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:input_type -> api.v1.CreateWorkloadRecommendationPolicyRequest - 62, // 510: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:input_type -> api.v1.GetWorkloadRecommendationPolicyRequest - 162, // 511: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:input_type -> api.v1.GetPolicyRecommendedDefaultsRequest - 64, // 512: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:input_type -> api.v1.ListWorkloadRecommendationPoliciesRequest - 66, // 513: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:input_type -> api.v1.UpdateWorkloadRecommendationPolicyRequest - 68, // 514: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:input_type -> api.v1.DeleteWorkloadRecommendationPolicyRequest - 70, // 515: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:input_type -> api.v1.AttachWorkloadRecommendationPolicyRequest - 72, // 516: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:input_type -> api.v1.AttachWorkloadRecommendationPoliciesRequest - 76, // 517: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:input_type -> api.v1.CreateWorkloadPolicyTargetRequest - 78, // 518: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:input_type -> api.v1.GetWorkloadPolicyTargetRequest - 80, // 519: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:input_type -> api.v1.ListWorkloadPolicyTargetsRequest - 82, // 520: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:input_type -> api.v1.UpdateWorkloadPolicyTargetRequest - 84, // 521: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:input_type -> api.v1.DeleteWorkloadPolicyTargetRequest - 85, // 522: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:input_type -> api.v1.ToggleWorkloadPolicyTargetsRequest - 90, // 523: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:input_type -> api.v1.PreviewWorkloadPolicyTargetMatchesRequest - 92, // 524: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:input_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - 45, // 525: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:input_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - 96, // 526: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:input_type -> api.v1.CreateNodeGroupPolicyTargetRequest - 98, // 527: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:input_type -> api.v1.GetNodeGroupPolicyTargetRequest - 100, // 528: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:input_type -> api.v1.ListNodeGroupPolicyTargetsRequest - 102, // 529: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:input_type -> api.v1.UpdateNodeGroupPolicyTargetRequest - 104, // 530: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:input_type -> api.v1.DeleteNodeGroupPolicyTargetRequest - 105, // 531: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:input_type -> api.v1.ToggleNodeGroupPolicyTargetsRequest - 108, // 532: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:input_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - 110, // 533: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:input_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - 112, // 534: api.v1.K8sRecommendationService.BalanceGetRecommendations:input_type -> api.v1.BalanceGetRecommendationsRequest - 22, // 535: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:input_type -> api.v1.GetOptimalInstanceTypeForNodeGroupRequest - 172, // 536: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:input_type -> api.v1.GetAttachedNodeGroupPoliciesRequest - 174, // 537: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:input_type -> api.v1.GetAttachedWorkloadPoliciesRequest - 226, // 538: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:input_type -> api.v1.SearchResourcesByTargetingFiltersRequest - 225, // 539: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:input_type -> api.v1.GetAvailableKindsByTargetingFiltersRequest - 180, // 540: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:input_type -> api.v1.ListAttachedWorkloadPoliciesRequest - 182, // 541: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:input_type -> api.v1.ListAttachedNodeGroupPoliciesRequest - 189, // 542: api.v1.K8sRecommendationService.RecommendationEvents:input_type -> api.v1.RecommendationEventsRequest - 187, // 543: api.v1.K8sRecommendationService.ApplyRecommendation:input_type -> api.v1.ApplyRecommendationRequest - 185, // 544: api.v1.K8sRecommendationService.RecommendationApplied:input_type -> api.v1.RecommendationAppliedRequest - 191, // 545: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:input_type -> api.v1.RetrieveSavingsForWorkloadRequest - 193, // 546: api.v1.K8sRecommendationService.CreateNodePolicies:input_type -> api.v1.CreateNodePoliciesRequest - 213, // 547: api.v1.K8sRecommendationService.ListNodePolicies:input_type -> api.v1.ListNodePoliciesRequest - 215, // 548: api.v1.K8sRecommendationService.UpdateNodePolicy:input_type -> api.v1.UpdateNodePolicyRequest - 217, // 549: api.v1.K8sRecommendationService.DeleteNodePolicy:input_type -> api.v1.DeleteNodePolicyRequest - 195, // 550: api.v1.K8sRecommendationService.SuggestedNodePolicy:input_type -> api.v1.SuggestedNodePolicyRequest - 223, // 551: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:input_type -> api.v1.SuggestedKarpenterConfigRequest - 197, // 552: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:input_type -> api.v1.GenerateNodePoliciesFromKarpenterRequest - 199, // 553: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:input_type -> api.v1.GenerateNodePoliciesFromNodeGroupsRequest - 201, // 554: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:input_type -> api.v1.GetNodeAnnotationReadinessRequest - 203, // 555: api.v1.K8sRecommendationService.GetMigrationState:input_type -> api.v1.GetMigrationStateRequest - 205, // 556: api.v1.K8sRecommendationService.UpdateMigrationState:input_type -> api.v1.UpdateMigrationStateRequest - 207, // 557: api.v1.K8sRecommendationService.ReportNodePoolValidation:input_type -> api.v1.ReportNodePoolValidationRequest - 209, // 558: api.v1.K8sRecommendationService.GetNodePoolValidations:input_type -> api.v1.GetNodePoolValidationsRequest - 234, // 559: api.v1.K8sRecommendationService.CreateNodePolicyTargets:input_type -> api.v1.CreateNodePolicyTargetsRequest - 236, // 560: api.v1.K8sRecommendationService.ListNodePolicyTargets:input_type -> api.v1.ListNodePolicyTargetsRequest - 238, // 561: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:input_type -> api.v1.UpdateNodePolicyTargetRequest - 220, // 562: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:input_type -> api.v1.PreviewNodeRecommendationConfigRequest - 249, // 563: api.v1.K8sRecommendationService.GetInstanceFamilies:input_type -> api.v1.GetInstanceFamiliesRequest - 251, // 564: api.v1.K8sRecommendationService.GetInstanceSizes:input_type -> api.v1.GetInstanceSizesRequest - 258, // 565: api.v1.K8sRecommendationService.GetInstanceCategories:input_type -> api.v1.GetInstanceCategoriesRequest - 260, // 566: api.v1.K8sRecommendationService.GetInstanceCPUs:input_type -> api.v1.GetInstanceCPUsRequest - 262, // 567: api.v1.K8sRecommendationService.GetInstanceTypeNames:input_type -> api.v1.GetInstanceTypeNamesRequest - 133, // 568: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:input_type -> api.v1.GeneratePodDisruptionBudgetRequest - 135, // 569: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:input_type -> api.v1.GenerateAndCreatePodDisruptionBudgetRequest - 137, // 570: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:input_type -> api.v1.CreatePodDisruptionBudgetRequest - 139, // 571: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:input_type -> api.v1.GetPDBRecommendationForWorkloadRequest - 297, // 572: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:input_type -> api.v1.CreateStorageRecommendationPolicyRequest - 299, // 573: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:input_type -> api.v1.GetStorageRecommendationPolicyRequest - 301, // 574: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:input_type -> api.v1.ListStorageRecommendationPoliciesRequest - 303, // 575: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:input_type -> api.v1.UpdateStorageRecommendationPolicyRequest - 305, // 576: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:input_type -> api.v1.DeleteStorageRecommendationPolicyRequest - 308, // 577: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:input_type -> api.v1.CreateStoragePolicyTargetRequest - 310, // 578: api.v1.K8sRecommendationService.ListStoragePolicyTargets:input_type -> api.v1.ListStoragePolicyTargetsRequest - 312, // 579: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:input_type -> api.v1.UpdateStoragePolicyTargetRequest - 314, // 580: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:input_type -> api.v1.DeleteStoragePolicyTargetRequest - 317, // 581: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:input_type -> api.v1.GetPvcStorageRecommendationRequest - 319, // 582: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:input_type -> api.v1.ListPvcStorageRecommendationsRequest - 321, // 583: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:input_type -> api.v1.GeneratePvcStorageRecommendationRequest - 323, // 584: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:input_type -> api.v1.PreviewPvcStorageRecommendationRequest - 326, // 585: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:input_type -> api.v1.ListWorkloadRuleOOMEventsRequest - 328, // 586: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:input_type -> api.v1.ListWorkloadOOMEventsRequest - 331, // 587: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:input_type -> api.v1.ListWorkloadRuleCPUThrottleEventsRequest - 333, // 588: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:input_type -> api.v1.ListWorkloadCPUThrottleEventsRequest - 88, // 589: api.v1.K8sRecommendationService.RemoveClusterOptimizations:input_type -> api.v1.RemoveClusterOptimizationsRequest - 336, // 590: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:input_type -> api.v1.CreateWorkloadOptimizationPolicyRequest - 338, // 591: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:input_type -> api.v1.ListWorkloadOptimizationPoliciesRequest - 340, // 592: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:input_type -> api.v1.GetWorkloadOptimizationPolicyRequest - 342, // 593: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:input_type -> api.v1.UpdateWorkloadOptimizationPolicyRequest - 344, // 594: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:input_type -> api.v1.DeleteWorkloadOptimizationPolicyRequest - 359, // 595: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:input_type -> api.v1.UpsertManualWorkloadRuleRequest - 361, // 596: api.v1.K8sRecommendationService.PreviewWorkloadRule:input_type -> api.v1.PreviewWorkloadRuleRequest - 346, // 597: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:input_type -> api.v1.GetWorkloadRulesByPolicyRequest - 348, // 598: api.v1.K8sRecommendationService.ListWorkloadRules:input_type -> api.v1.ListWorkloadRulesRequest - 350, // 599: api.v1.K8sRecommendationService.GetWorkloadRuleByID:input_type -> api.v1.GetWorkloadRuleByIDRequest - 352, // 600: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:input_type -> api.v1.GetWorkloadRuleByWorkloadRequest - 354, // 601: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:input_type -> api.v1.GetWorkloadByWorkloadRuleRequest - 356, // 602: api.v1.K8sRecommendationService.DeleteWorkloadRule:input_type -> api.v1.DeleteWorkloadRuleRequest - 363, // 603: api.v1.K8sRecommendationService.GetWorkloadContainerNames:input_type -> api.v1.GetWorkloadContainerNamesRequest - 366, // 604: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:input_type -> api.v1.BatchAutoOptimizeWorkloadsRequest - 372, // 605: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:input_type -> api.v1.GetNodeRecommendationStatusRequest - 21, // 606: api.v1.K8sRecommendationService.GetNodeGroupStats:output_type -> api.v1.GetNodeGroupStatsResponse - 25, // 607: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:output_type -> api.v1.GetLatestNodeGroupRecommendationResponse - 27, // 608: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:output_type -> api.v1.GetLatestWorkloadRecommendationResponse - 29, // 609: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:output_type -> api.v1.GetPreviewWorkloadRecommendationResponse - 32, // 610: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:output_type -> api.v1.GetPreviewWorkloadRecommendationsResponse - 19, // 611: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:output_type -> api.v1.GetRecommendationsForWorkloadResponse - 17, // 612: api.v1.K8sRecommendationService.GetRecommendations:output_type -> api.v1.GetRecommendationsResponse - 49, // 613: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:output_type -> api.v1.CreateNodeGroupRecommendationPolicyResponse - 51, // 614: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:output_type -> api.v1.GetNodeGroupRecommendationPolicyResponse - 53, // 615: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:output_type -> api.v1.ListNodeGroupRecommendationPoliciesResponse - 55, // 616: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:output_type -> api.v1.UpdateNodeGroupRecommendationPolicyResponse - 57, // 617: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:output_type -> api.v1.DeleteNodeGroupRecommendationPolicyResponse - 59, // 618: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:output_type -> api.v1.AttachNodeGroupRecommendationPolicyResponse - 61, // 619: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:output_type -> api.v1.CreateWorkloadRecommendationPolicyResponse - 63, // 620: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:output_type -> api.v1.GetWorkloadRecommendationPolicyResponse - 163, // 621: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:output_type -> api.v1.GetPolicyRecommendedDefaultsResponse - 65, // 622: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:output_type -> api.v1.ListWorkloadRecommendationPoliciesResponse - 67, // 623: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:output_type -> api.v1.UpdateWorkloadRecommendationPolicyResponse - 69, // 624: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:output_type -> api.v1.DeleteWorkloadRecommendationPolicyResponse - 71, // 625: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:output_type -> api.v1.AttachWorkloadRecommendationPolicyResponse - 73, // 626: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:output_type -> api.v1.AttachWorkloadRecommendationPoliciesResponse - 77, // 627: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:output_type -> api.v1.CreateWorkloadPolicyTargetResponse - 79, // 628: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:output_type -> api.v1.GetWorkloadPolicyTargetResponse - 81, // 629: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:output_type -> api.v1.ListWorkloadPolicyTargetsResponse - 83, // 630: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:output_type -> api.v1.UpdateWorkloadPolicyTargetResponse - 87, // 631: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:output_type -> api.v1.DeleteWorkloadPolicyTargetResponse - 86, // 632: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:output_type -> api.v1.ToggleWorkloadPolicyTargetsResponse - 91, // 633: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:output_type -> api.v1.PreviewWorkloadPolicyTargetMatchesResponse - 93, // 634: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:output_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - 46, // 635: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:output_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - 97, // 636: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:output_type -> api.v1.CreateNodeGroupPolicyTargetResponse - 99, // 637: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:output_type -> api.v1.GetNodeGroupPolicyTargetResponse - 101, // 638: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:output_type -> api.v1.ListNodeGroupPolicyTargetsResponse - 103, // 639: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:output_type -> api.v1.UpdateNodeGroupPolicyTargetResponse - 107, // 640: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:output_type -> api.v1.DeleteNodeGroupPolicyTargetResponse - 106, // 641: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:output_type -> api.v1.ToggleNodeGroupPolicyTargetsResponse - 109, // 642: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:output_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - 111, // 643: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:output_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - 113, // 644: api.v1.K8sRecommendationService.BalanceGetRecommendations:output_type -> api.v1.BalanceGetRecommendationsResponse - 23, // 645: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:output_type -> api.v1.GetOptimalInstanceTypeForNodeGroupResponse - 173, // 646: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:output_type -> api.v1.GetAttachedNodeGroupPoliciesResponse - 175, // 647: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:output_type -> api.v1.GetAttachedWorkloadPoliciesResponse - 229, // 648: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:output_type -> api.v1.SearchResourcesByTargetingFiltersResponse - 228, // 649: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:output_type -> api.v1.GetAvailableKindsByTargetingFiltersResponse - 181, // 650: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:output_type -> api.v1.ListAttachedWorkloadPoliciesResponse - 183, // 651: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:output_type -> api.v1.ListAttachedNodeGroupPoliciesResponse - 190, // 652: api.v1.K8sRecommendationService.RecommendationEvents:output_type -> api.v1.RecommendationEventsResponse - 188, // 653: api.v1.K8sRecommendationService.ApplyRecommendation:output_type -> api.v1.ApplyRecommendationResponse - 186, // 654: api.v1.K8sRecommendationService.RecommendationApplied:output_type -> api.v1.RecommendationAppliedResponse - 192, // 655: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:output_type -> api.v1.RetrieveSavingsForWorkloadResponse - 194, // 656: api.v1.K8sRecommendationService.CreateNodePolicies:output_type -> api.v1.CreateNodePoliciesResponse - 214, // 657: api.v1.K8sRecommendationService.ListNodePolicies:output_type -> api.v1.ListNodePoliciesResponse - 216, // 658: api.v1.K8sRecommendationService.UpdateNodePolicy:output_type -> api.v1.UpdateNodePolicyResponse - 218, // 659: api.v1.K8sRecommendationService.DeleteNodePolicy:output_type -> api.v1.DeleteNodePolicyResponse - 196, // 660: api.v1.K8sRecommendationService.SuggestedNodePolicy:output_type -> api.v1.SuggestedNodePolicyResponse - 224, // 661: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:output_type -> api.v1.SuggestedKarpenterConfigResponse - 198, // 662: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:output_type -> api.v1.GenerateNodePoliciesFromKarpenterResponse - 200, // 663: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:output_type -> api.v1.GenerateNodePoliciesFromNodeGroupsResponse - 202, // 664: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:output_type -> api.v1.GetNodeAnnotationReadinessResponse - 204, // 665: api.v1.K8sRecommendationService.GetMigrationState:output_type -> api.v1.GetMigrationStateResponse - 206, // 666: api.v1.K8sRecommendationService.UpdateMigrationState:output_type -> api.v1.UpdateMigrationStateResponse - 208, // 667: api.v1.K8sRecommendationService.ReportNodePoolValidation:output_type -> api.v1.ReportNodePoolValidationResponse - 211, // 668: api.v1.K8sRecommendationService.GetNodePoolValidations:output_type -> api.v1.GetNodePoolValidationsResponse - 235, // 669: api.v1.K8sRecommendationService.CreateNodePolicyTargets:output_type -> api.v1.CreateNodePolicyTargetsResponse - 237, // 670: api.v1.K8sRecommendationService.ListNodePolicyTargets:output_type -> api.v1.ListNodePolicyTargetsResponse - 239, // 671: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:output_type -> api.v1.UpdateNodePolicyTargetResponse - 221, // 672: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:output_type -> api.v1.PreviewNodeRecommendationConfigResponse - 250, // 673: api.v1.K8sRecommendationService.GetInstanceFamilies:output_type -> api.v1.GetInstanceFamiliesResponse - 252, // 674: api.v1.K8sRecommendationService.GetInstanceSizes:output_type -> api.v1.GetInstanceSizesResponse - 259, // 675: api.v1.K8sRecommendationService.GetInstanceCategories:output_type -> api.v1.GetInstanceCategoriesResponse - 261, // 676: api.v1.K8sRecommendationService.GetInstanceCPUs:output_type -> api.v1.GetInstanceCPUsResponse - 263, // 677: api.v1.K8sRecommendationService.GetInstanceTypeNames:output_type -> api.v1.GetInstanceTypeNamesResponse - 134, // 678: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:output_type -> api.v1.GeneratePodDisruptionBudgetResponse - 136, // 679: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:output_type -> api.v1.GenerateAndCreatePodDisruptionBudgetResponse - 138, // 680: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:output_type -> api.v1.CreatePodDisruptionBudgetResponse - 140, // 681: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:output_type -> api.v1.GetPDBRecommendationForWorkloadResponse - 298, // 682: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:output_type -> api.v1.CreateStorageRecommendationPolicyResponse - 300, // 683: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:output_type -> api.v1.GetStorageRecommendationPolicyResponse - 302, // 684: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:output_type -> api.v1.ListStorageRecommendationPoliciesResponse - 304, // 685: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:output_type -> api.v1.UpdateStorageRecommendationPolicyResponse - 306, // 686: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:output_type -> api.v1.DeleteStorageRecommendationPolicyResponse - 309, // 687: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:output_type -> api.v1.CreateStoragePolicyTargetResponse - 311, // 688: api.v1.K8sRecommendationService.ListStoragePolicyTargets:output_type -> api.v1.ListStoragePolicyTargetsResponse - 313, // 689: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:output_type -> api.v1.UpdateStoragePolicyTargetResponse - 315, // 690: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:output_type -> api.v1.DeleteStoragePolicyTargetResponse - 318, // 691: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:output_type -> api.v1.GetPvcStorageRecommendationResponse - 320, // 692: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:output_type -> api.v1.ListPvcStorageRecommendationsResponse - 322, // 693: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:output_type -> api.v1.GeneratePvcStorageRecommendationResponse - 324, // 694: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:output_type -> api.v1.PreviewPvcStorageRecommendationResponse - 327, // 695: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:output_type -> api.v1.ListWorkloadRuleOOMEventsResponse - 329, // 696: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:output_type -> api.v1.ListWorkloadOOMEventsResponse - 332, // 697: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:output_type -> api.v1.ListWorkloadRuleCPUThrottleEventsResponse - 334, // 698: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:output_type -> api.v1.ListWorkloadCPUThrottleEventsResponse - 89, // 699: api.v1.K8sRecommendationService.RemoveClusterOptimizations:output_type -> api.v1.RemoveClusterOptimizationsResponse - 337, // 700: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:output_type -> api.v1.CreateWorkloadOptimizationPolicyResponse - 339, // 701: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:output_type -> api.v1.ListWorkloadOptimizationPoliciesResponse - 341, // 702: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:output_type -> api.v1.GetWorkloadOptimizationPolicyResponse - 343, // 703: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:output_type -> api.v1.UpdateWorkloadOptimizationPolicyResponse - 345, // 704: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:output_type -> api.v1.DeleteWorkloadOptimizationPolicyResponse - 360, // 705: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:output_type -> api.v1.UpsertManualWorkloadRuleResponse - 362, // 706: api.v1.K8sRecommendationService.PreviewWorkloadRule:output_type -> api.v1.PreviewWorkloadRuleResponse - 347, // 707: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:output_type -> api.v1.GetWorkloadRulesByPolicyResponse - 349, // 708: api.v1.K8sRecommendationService.ListWorkloadRules:output_type -> api.v1.ListWorkloadRulesResponse - 351, // 709: api.v1.K8sRecommendationService.GetWorkloadRuleByID:output_type -> api.v1.GetWorkloadRuleByIDResponse - 353, // 710: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:output_type -> api.v1.GetWorkloadRuleByWorkloadResponse - 355, // 711: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:output_type -> api.v1.GetWorkloadByWorkloadRuleResponse - 357, // 712: api.v1.K8sRecommendationService.DeleteWorkloadRule:output_type -> api.v1.DeleteWorkloadRuleResponse - 364, // 713: api.v1.K8sRecommendationService.GetWorkloadContainerNames:output_type -> api.v1.GetWorkloadContainerNamesResponse - 368, // 714: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:output_type -> api.v1.BatchAutoOptimizeWorkloadsResponse - 373, // 715: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:output_type -> api.v1.GetNodeRecommendationStatusResponse - 606, // [606:716] is the sub-list for method output_type - 496, // [496:606] is the sub-list for method input_type - 496, // [496:496] is the sub-list for extension type_name - 496, // [496:496] is the sub-list for extension extendee - 0, // [0:496] is the sub-list for field type_name + 637, // 0: api.v1.GetRecommendationsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 1: api.v1.GetRecommendationsRequest.end_time:type_name -> google.protobuf.Timestamp + 638, // 2: api.v1.GetRecommendationsRequest.filters:type_name -> api.v1.WorkloadFilters + 639, // 3: api.v1.GetRecommendationsRequest.pagination:type_name -> api.v1.Pagination + 206, // 4: api.v1.GetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 639, // 5: api.v1.GetRecommendationsResponse.pagination:type_name -> api.v1.Pagination + 637, // 6: api.v1.GetRecommendationsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 7: api.v1.GetRecommendationsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 206, // 8: api.v1.GetRecommendationsForWorkloadResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 637, // 9: api.v1.GetNodeGroupStatsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 10: api.v1.GetNodeGroupStatsRequest.end_time:type_name -> google.protobuf.Timestamp + 178, // 11: api.v1.GetNodeGroupStatsResponse.node_stats:type_name -> api.v1.NodeStats + 637, // 12: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 13: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp + 22, // 14: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.mode:type_name -> api.v1.RecommendationMode + 640, // 15: api.v1.GetLatestWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 640, // 16: api.v1.GetLatestWorkloadRecommendationResponse.kind:type_name -> api.v1.K8sObjectKind + 184, // 17: api.v1.GetLatestWorkloadRecommendationResponse.container_recommendations:type_name -> api.v1.ContainerRecommendation + 191, // 18: api.v1.GetLatestWorkloadRecommendationResponse.current_tolerations:type_name -> api.v1.Toleration + 191, // 19: api.v1.GetLatestWorkloadRecommendationResponse.recommended_tolerations:type_name -> api.v1.Toleration + 640, // 20: api.v1.GetPreviewWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 637, // 21: api.v1.GetPreviewWorkloadRecommendationRequest.timestamp:type_name -> google.protobuf.Timestamp + 206, // 22: api.v1.GetPreviewWorkloadRecommendationResponse.rec:type_name -> api.v1.WorkloadRecommendation + 50, // 23: api.v1.GetPreviewWorkloadRecommendationsRequest.workloads:type_name -> api.v1.WorkloadIdentifier + 637, // 24: api.v1.GetPreviewWorkloadRecommendationsRequest.timestamp:type_name -> google.protobuf.Timestamp + 640, // 25: api.v1.WorkloadIdentifier.kind:type_name -> api.v1.K8sObjectKind + 48, // 26: api.v1.GetPreviewWorkloadRecommendationsResponse.recommendations:type_name -> api.v1.GetPreviewWorkloadRecommendationResponse + 22, // 27: api.v1.CreateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 28: api.v1.CreateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 192, // 29: api.v1.CreateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 192, // 30: api.v1.GetClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 192, // 31: api.v1.ListClusterRecommendationPoliciesResponse.policies:type_name -> api.v1.ClusterRecommendationPolicy + 22, // 32: api.v1.UpdateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 33: api.v1.UpdateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 192, // 34: api.v1.UpdateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 637, // 35: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 36: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.end_time:type_name -> google.protobuf.Timestamp + 50, // 37: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workloads:type_name -> api.v1.WorkloadIdentifier + 596, // 38: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workload_target_map:type_name -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry + 20, // 39: api.v1.CreateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 40: api.v1.CreateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 41: api.v1.CreateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 42: api.v1.CreateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 193, // 43: api.v1.CreateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 193, // 44: api.v1.GetNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 193, // 45: api.v1.ListNodeGroupRecommendationPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy + 20, // 46: api.v1.UpdateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 47: api.v1.UpdateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 48: api.v1.UpdateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 49: api.v1.UpdateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 193, // 50: api.v1.UpdateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 196, // 51: api.v1.CreateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 52: api.v1.CreateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 53: api.v1.GetWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 54: api.v1.ListWorkloadRecommendationPoliciesResponse.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 55: api.v1.UpdateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 56: api.v1.UpdateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 640, // 57: api.v1.AttachWorkloadRecommendationPolicyRequest.kind:type_name -> api.v1.K8sObjectKind + 50, // 58: api.v1.AttachWorkloadRecommendationPoliciesRequest.workloads:type_name -> api.v1.WorkloadIdentifier + 93, // 59: api.v1.AttachWorkloadRecommendationPoliciesResponse.attachments:type_name -> api.v1.WorkloadPolicyAttachment + 640, // 60: api.v1.WorkloadPolicyAttachment.kind:type_name -> api.v1.K8sObjectKind + 637, // 61: api.v1.WorkloadPolicyAttachment.created_at:type_name -> google.protobuf.Timestamp + 637, // 62: api.v1.WorkloadPolicyAttachment.updated_at:type_name -> google.protobuf.Timestamp + 641, // 63: api.v1.WorkloadPolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 64: api.v1.WorkloadPolicyTarget.workload_selector:type_name -> api.v1.LabelSelector + 640, // 65: api.v1.WorkloadPolicyTarget.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 66: api.v1.WorkloadPolicyTarget.name_pattern:type_name -> api.v1.RegexPattern + 641, // 67: api.v1.WorkloadPolicyTarget.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 68: api.v1.WorkloadPolicyTarget.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 69: api.v1.WorkloadPolicyTarget.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 637, // 70: api.v1.WorkloadPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 71: api.v1.WorkloadPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 641, // 72: api.v1.CreateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 73: api.v1.CreateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 74: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 75: api.v1.CreateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 76: api.v1.CreateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 77: api.v1.CreateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 78: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 94, // 79: api.v1.CreateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 94, // 80: api.v1.GetWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 94, // 81: api.v1.ListWorkloadPolicyTargetsResponse.targets:type_name -> api.v1.WorkloadPolicyTarget + 641, // 82: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 83: api.v1.UpdateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 84: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 85: api.v1.UpdateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 86: api.v1.UpdateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 87: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 88: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 94, // 89: api.v1.UpdateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 641, // 90: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 92: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 93: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 94: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 95: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 96: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 643, // 97: api.v1.PreviewWorkloadPolicyTargetMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadItem + 641, // 98: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 99: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 100: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 101: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 102: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 103: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 104: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 206, // 105: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 643, // 106: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_items:type_name -> api.v1.WorkloadItem + 597, // 107: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_percentiles:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry + 598, // 108: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.collisions_by_workload_uid:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry + 644, // 109: api.v1.WorkloadPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles + 644, // 110: api.v1.WorkloadPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles + 644, // 111: api.v1.WorkloadPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles + 644, // 112: api.v1.WorkloadPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles + 644, // 113: api.v1.WorkloadPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles + 637, // 114: api.v1.NodeGroupPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 115: api.v1.NodeGroupPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 115, // 116: api.v1.CreateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 117: api.v1.GetNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 118: api.v1.ListNodeGroupPolicyTargetsResponse.targets:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 119: api.v1.UpdateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 645, // 120: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse.matched_node_groups:type_name -> api.v1.NodeGroup + 204, // 121: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.NodeGroupRecommendation + 199, // 122: api.v1.BalanceGetRecommendationsRequest.register:type_name -> api.v1.BalanceRegisterRequest + 201, // 123: api.v1.BalanceGetRecommendationsRequest.apply:type_name -> api.v1.BalanceApplyRecommendationResponse + 172, // 124: api.v1.BalanceGetRecommendationsRequest.workload_meta:type_name -> api.v1.ReconcileWorkload + 206, // 125: api.v1.BalanceGetRecommendationsRequest.in_cluster_recommendation:type_name -> api.v1.WorkloadRecommendation + 368, // 126: api.v1.BalanceGetRecommendationsRequest.snapshot_cr_status_report:type_name -> api.v1.SnapshotCRStatusReport + 463, // 127: api.v1.BalanceGetRecommendationsRequest.scheduler_enrollment_report:type_name -> api.v1.SchedulerEnrollmentReport + 464, // 128: api.v1.BalanceGetRecommendationsRequest.scheduler_revert_event_report:type_name -> api.v1.SchedulerRevertEventReport + 174, // 129: api.v1.BalanceGetRecommendationsRequest.operator_health:type_name -> api.v1.OperatorHealth + 175, // 130: api.v1.BalanceGetRecommendationsRequest.agent_health:type_name -> api.v1.AgentHealth + 204, // 131: api.v1.BalanceGetRecommendationsResponse.node_group_recommendation:type_name -> api.v1.NodeGroupRecommendation + 206, // 132: api.v1.BalanceGetRecommendationsResponse.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 373, // 133: api.v1.BalanceGetRecommendationsResponse.node_recommendation:type_name -> api.v1.NodeRecommendation + 134, // 134: api.v1.BalanceGetRecommendationsResponse.batch_node_group_recommendations:type_name -> api.v1.BatchNodeGroupRecommendations + 135, // 135: api.v1.BalanceGetRecommendationsResponse.batch_workload_recommendations:type_name -> api.v1.BatchWorkloadRecommendations + 156, // 136: api.v1.BalanceGetRecommendationsResponse.kind_to_namespace_to_workloads:type_name -> api.v1.WorkloadWithActiveRecommendations + 173, // 137: api.v1.BalanceGetRecommendationsResponse.workload_reconcile_response:type_name -> api.v1.ReconcileResponse + 507, // 138: api.v1.BalanceGetRecommendationsResponse.workload_profile_manifest:type_name -> api.v1.WorkloadProfileManifest + 508, // 139: api.v1.BalanceGetRecommendationsResponse.batch_workload_profiles:type_name -> api.v1.BatchWorkloadProfiles + 177, // 140: api.v1.BalanceGetRecommendationsResponse.health_update_requested:type_name -> api.v1.HealthReport + 158, // 141: api.v1.BalanceGetRecommendationsResponse.batch_generic_resource_recommendations:type_name -> api.v1.BatchGenericResourceRecommendations + 159, // 142: api.v1.BalanceGetRecommendationsResponse.batch_pvc_storage_recommendations:type_name -> api.v1.BatchPvcStorageRecommendations + 154, // 143: api.v1.BalanceGetRecommendationsResponse.batch_workload_rules:type_name -> api.v1.BatchWorkloadRules + 364, // 144: api.v1.BalanceGetRecommendationsResponse.karpenter_settings:type_name -> api.v1.KarpenterSettingsRecommendation + 366, // 145: api.v1.BalanceGetRecommendationsResponse.snapshot_recommendation:type_name -> api.v1.SnapshotRecommendation + 367, // 146: api.v1.BalanceGetRecommendationsResponse.forensic_snapshot_recommendation:type_name -> api.v1.ForensicSnapshotRecommendation + 155, // 147: api.v1.BalanceGetRecommendationsResponse.batch_hpa_connectors:type_name -> api.v1.BatchHPAConnectors + 460, // 148: api.v1.BalanceGetRecommendationsResponse.scheduler_policy_sync:type_name -> api.v1.SchedulerPolicySync + 204, // 149: api.v1.BatchNodeGroupRecommendations.recommendations:type_name -> api.v1.NodeGroupRecommendation + 206, // 150: api.v1.BatchWorkloadRecommendations.recommendations:type_name -> api.v1.WorkloadRecommendation + 137, // 151: api.v1.WorkloadRule.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 152: api.v1.WorkloadRule.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 153: api.v1.WorkloadRule.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 154: api.v1.WorkloadRule.hpa_rule:type_name -> api.v1.HPARuleConfig + 18, // 155: api.v1.WorkloadRule.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 156: api.v1.WorkloadRule.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 144, // 157: api.v1.WorkloadRule.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 151, // 158: api.v1.WorkloadRule.percentiles:type_name -> api.v1.ResourcePercentiles + 153, // 159: api.v1.WorkloadRule.classification:type_name -> api.v1.WorkloadClassification + 637, // 160: api.v1.WorkloadRule.created_at:type_name -> google.protobuf.Timestamp + 637, // 161: api.v1.WorkloadRule.updated_at:type_name -> google.protobuf.Timestamp + 141, // 162: api.v1.WorkloadRule.containers:type_name -> api.v1.ContainerResourceRuleConfig + 142, // 163: api.v1.WorkloadRule.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 145, // 164: api.v1.WorkloadRule.keda_scaled_object:type_name -> api.v1.KEDAScaledObjectTemplate + 599, // 165: api.v1.HPAMetricTrigger.metadata:type_name -> api.v1.HPAMetricTrigger.MetadataEntry + 140, // 166: api.v1.ContainerResourceRuleConfig.cpu_rule:type_name -> api.v1.ContainerResourceConfig + 140, // 167: api.v1.ContainerResourceRuleConfig.memory_rule:type_name -> api.v1.ContainerResourceConfig + 140, // 168: api.v1.ContainerResourceRuleConfig.gpu_rule:type_name -> api.v1.ContainerResourceConfig + 138, // 169: api.v1.HPARuleConfig.metrics:type_name -> api.v1.HPAMetricTrigger + 646, // 170: api.v1.HPARuleConfig.behavior:type_name -> api.v1.HPABehavior + 139, // 171: api.v1.HPARuleConfig.fallback:type_name -> api.v1.HPAFallback + 146, // 172: api.v1.KEDAScaledObjectTemplate.triggers:type_name -> api.v1.KEDATrigger + 148, // 173: api.v1.KEDAScaledObjectTemplate.fallback:type_name -> api.v1.KEDAFallback + 149, // 174: api.v1.KEDAScaledObjectTemplate.advanced:type_name -> api.v1.KEDAAdvanced + 600, // 175: api.v1.KEDATrigger.metadata:type_name -> api.v1.KEDATrigger.MetadataEntry + 147, // 176: api.v1.KEDATrigger.authentication_ref:type_name -> api.v1.KEDAAuthenticationRef + 150, // 177: api.v1.ResourcePercentiles.cpu:type_name -> api.v1.PercentileValues + 150, // 178: api.v1.ResourcePercentiles.memory:type_name -> api.v1.PercentileValues + 150, // 179: api.v1.ResourcePercentiles.network:type_name -> api.v1.PercentileValues + 150, // 180: api.v1.ResourcePercentiles.disk:type_name -> api.v1.PercentileValues + 152, // 181: api.v1.WorkloadClassification.burstiness:type_name -> api.v1.BurstinessRatios + 136, // 182: api.v1.BatchWorkloadRules.rules:type_name -> api.v1.WorkloadRule + 647, // 183: api.v1.BatchHPAConnectors.connectors:type_name -> api.v1.HPAConnector + 50, // 184: api.v1.WorkloadWithActiveRecommendations.workloads:type_name -> api.v1.WorkloadIdentifier + 637, // 185: api.v1.GenericResourceRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 9, // 186: api.v1.GenericResourceRecommendation.status:type_name -> api.v1.RecommendationStatus + 637, // 187: api.v1.GenericResourceRecommendation.created_at:type_name -> google.protobuf.Timestamp + 637, // 188: api.v1.GenericResourceRecommendation.updated_at:type_name -> google.protobuf.Timestamp + 157, // 189: api.v1.BatchGenericResourceRecommendations.recommendations:type_name -> api.v1.GenericResourceRecommendation + 403, // 190: api.v1.BatchPvcStorageRecommendations.recommendations:type_name -> api.v1.PvcStorageRecommendation + 50, // 191: api.v1.GeneratePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 192: api.v1.GeneratePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 50, // 193: api.v1.GenerateAndCreatePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 194: api.v1.GenerateAndCreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 157, // 195: api.v1.CreatePodDisruptionBudgetRequest.recommendation:type_name -> api.v1.GenericResourceRecommendation + 157, // 196: api.v1.CreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 50, // 197: api.v1.GetPDBRecommendationForWorkloadRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 198: api.v1.GetPDBRecommendationForWorkloadResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 637, // 199: api.v1.StructuralHealthFinding.first_seen_at:type_name -> google.protobuf.Timestamp + 168, // 200: api.v1.WorkloadStructuralHealth.findings:type_name -> api.v1.StructuralHealthFinding + 169, // 201: api.v1.ListWorkloadStructuralHealthResponse.workloads:type_name -> api.v1.WorkloadStructuralHealth + 640, // 202: api.v1.ReconcileWorkload.kind:type_name -> api.v1.K8sObjectKind + 0, // 203: api.v1.ReconcileResponse.status:type_name -> api.v1.ReconcileStatus + 206, // 204: api.v1.ReconcileResponse.updated_recommendation:type_name -> api.v1.WorkloadRecommendation + 601, // 205: api.v1.AgentHealth.node_name_to_agent:type_name -> api.v1.AgentHealth.NodeNameToAgentEntry + 179, // 206: api.v1.NodeStats.metrics:type_name -> api.v1.NodeMetric + 637, // 207: api.v1.NodeMetric.timestamp:type_name -> google.protobuf.Timestamp + 640, // 208: api.v1.ContainerStats.kind:type_name -> api.v1.K8sObjectKind + 181, // 209: api.v1.ContainerStats.metrics:type_name -> api.v1.ContainerMetric + 182, // 210: api.v1.ContainerStats.summarized_metrics:type_name -> api.v1.ContainerSummarizedMetric + 637, // 211: api.v1.ContainerMetric.timestamp:type_name -> google.protobuf.Timestamp + 637, // 212: api.v1.ContainerSummarizedMetric.timestamp:type_name -> google.protobuf.Timestamp + 183, // 213: api.v1.ContainerSummarizedMetric.cpu:type_name -> api.v1.Metric + 183, // 214: api.v1.ContainerSummarizedMetric.memory:type_name -> api.v1.Metric + 183, // 215: api.v1.ContainerSummarizedMetric.gpu:type_name -> api.v1.Metric + 183, // 216: api.v1.ContainerSummarizedMetric.gpu_vram:type_name -> api.v1.Metric + 186, // 217: api.v1.ContainerRecommendation.current_request:type_name -> api.v1.ResourceRecommendation + 186, // 218: api.v1.ContainerRecommendation.recommended_request:type_name -> api.v1.ResourceRecommendation + 186, // 219: api.v1.ContainerRecommendation.current_limit:type_name -> api.v1.ResourceRecommendation + 186, // 220: api.v1.ContainerRecommendation.recommended_limit:type_name -> api.v1.ResourceRecommendation + 187, // 221: api.v1.ContainerRecommendation.env_mutations:type_name -> api.v1.EnvVarMutation + 188, // 222: api.v1.ContainerRecommendation.command_arg_mutations:type_name -> api.v1.CommandArgMutation + 1, // 223: api.v1.ResourceRecommendation.cpu_action:type_name -> api.v1.ActionToTake + 1, // 224: api.v1.ResourceRecommendation.mem_action:type_name -> api.v1.ActionToTake + 1, // 225: api.v1.ResourceRecommendation.gpu_action:type_name -> api.v1.ActionToTake + 1, // 226: api.v1.ResourceRecommendation.gpu_vram_action:type_name -> api.v1.ActionToTake + 2, // 227: api.v1.EnvVarMutation.action:type_name -> api.v1.MutationAction + 2, // 228: api.v1.CommandArgMutation.action:type_name -> api.v1.MutationAction + 3, // 229: api.v1.CommandArgMutation.target:type_name -> api.v1.ArgTarget + 2, // 230: api.v1.NodeSelectorMutation.action:type_name -> api.v1.MutationAction + 2, // 231: api.v1.TolerationMutation.action:type_name -> api.v1.MutationAction + 191, // 232: api.v1.TolerationMutation.toleration:type_name -> api.v1.Toleration + 18, // 233: api.v1.ClusterRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 22, // 234: api.v1.ClusterRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 235: api.v1.ClusterRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 18, // 236: api.v1.NodeGroupRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 20, // 237: api.v1.NodeGroupRecommendationPolicy.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 238: api.v1.NodeGroupRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 239: api.v1.NodeGroupRecommendationPolicy.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 240: api.v1.NodeGroupRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 24, // 241: api.v1.HorizontalScalingOptimizationTarget.primary_metric:type_name -> api.v1.HPAMetricType + 18, // 242: api.v1.WorkloadRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 19, // 243: api.v1.WorkloadRecommendationPolicy.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 22, // 244: api.v1.WorkloadRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 194, // 245: api.v1.WorkloadRecommendationPolicy.cpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 246: api.v1.WorkloadRecommendationPolicy.memory_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 247: api.v1.WorkloadRecommendationPolicy.gpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 248: api.v1.WorkloadRecommendationPolicy.gpu_vram_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 195, // 249: api.v1.WorkloadRecommendationPolicy.horizontal_scaling:type_name -> api.v1.HorizontalScalingOptimizationTarget + 18, // 250: api.v1.WorkloadRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 144, // 251: api.v1.WorkloadRecommendationPolicy.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 637, // 252: api.v1.WorkloadRecommendationPolicy.deleted_at:type_name -> google.protobuf.Timestamp + 22, // 253: api.v1.GetPolicyRecommendedDefaultsRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 196, // 254: api.v1.GetPolicyRecommendedDefaultsResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 200, // 255: api.v1.BalanceRegisterRequest.features:type_name -> api.v1.BalanceFeatures + 23, // 256: api.v1.BalanceApplyRecommendationResponse.type:type_name -> api.v1.RecommendationType + 202, // 257: api.v1.BalanceApplyRecommendationResponse.live_migration_result:type_name -> api.v1.LiveMigrationResult + 637, // 258: api.v1.BalanceApplyRecommendationResponse.applied_at:type_name -> google.protobuf.Timestamp + 637, // 259: api.v1.NodeGroupRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 193, // 260: api.v1.NodeGroupRecommendation.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 648, // 261: api.v1.CostImpact.current_cost_per_month:type_name -> google.type.Money + 648, // 262: api.v1.CostImpact.recommended_cost_per_month:type_name -> google.type.Money + 648, // 263: api.v1.CostImpact.current_cpu_cost_per_month:type_name -> google.type.Money + 648, // 264: api.v1.CostImpact.current_memory_cost_per_month:type_name -> google.type.Money + 648, // 265: api.v1.CostImpact.recommended_cpu_cost_per_month:type_name -> google.type.Money + 648, // 266: api.v1.CostImpact.recommended_memory_cost_per_month:type_name -> google.type.Money + 648, // 267: api.v1.CostImpact.current_gpu_cost_per_month:type_name -> google.type.Money + 648, // 268: api.v1.CostImpact.recommended_gpu_cost_per_month:type_name -> google.type.Money + 4, // 269: api.v1.CostImpact.cost_period:type_name -> api.v1.CostPeriod + 640, // 270: api.v1.WorkloadRecommendation.kind:type_name -> api.v1.K8sObjectKind + 184, // 271: api.v1.WorkloadRecommendation.container_recommendations:type_name -> api.v1.ContainerRecommendation + 637, // 272: api.v1.WorkloadRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 185, // 273: api.v1.WorkloadRecommendation.keda_scaled_object_recommendation:type_name -> api.v1.KedaScaledObjectRecommendation + 641, // 274: api.v1.WorkloadRecommendation.label_selector:type_name -> api.v1.LabelSelector + 8, // 275: api.v1.WorkloadRecommendation.del_prop:type_name -> api.v1.LiveMigDeletionPropagation + 191, // 276: api.v1.WorkloadRecommendation.current_tolerations:type_name -> api.v1.Toleration + 191, // 277: api.v1.WorkloadRecommendation.recommended_tolerations:type_name -> api.v1.Toleration + 9, // 278: api.v1.WorkloadRecommendation.status:type_name -> api.v1.RecommendationStatus + 196, // 279: api.v1.WorkloadRecommendation.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 94, // 280: api.v1.WorkloadRecommendation.policy_target:type_name -> api.v1.WorkloadPolicyTarget + 1, // 281: api.v1.WorkloadRecommendation.replica_count_action:type_name -> api.v1.ActionToTake + 202, // 282: api.v1.WorkloadRecommendation.live_migration_result:type_name -> api.v1.LiveMigrationResult + 205, // 283: api.v1.WorkloadRecommendation.cost_impact:type_name -> api.v1.CostImpact + 189, // 284: api.v1.WorkloadRecommendation.node_selector_mutations:type_name -> api.v1.NodeSelectorMutation + 190, // 285: api.v1.WorkloadRecommendation.toleration_mutations:type_name -> api.v1.TolerationMutation + 602, // 286: api.v1.WorkloadRecommendation.source_images:type_name -> api.v1.WorkloadRecommendation.SourceImagesEntry + 1, // 287: api.v1.WorkloadRecommendation.restart_action_to_take:type_name -> api.v1.ActionToTake + 207, // 288: api.v1.WorkloadRecommendation.reasoning_details:type_name -> api.v1.ReasoningDetails + 209, // 289: api.v1.ReasoningDetails.insights:type_name -> api.v1.ReasoningInsight + 211, // 290: api.v1.ReasoningDetails.container_changes:type_name -> api.v1.ReasoningContainerChange + 214, // 291: api.v1.ReasoningDetails.replicas:type_name -> api.v1.ReasoningReplicas + 215, // 292: api.v1.ReasoningDetails.decisions:type_name -> api.v1.ReasoningDecision + 6, // 293: api.v1.ReasoningInsight.type:type_name -> api.v1.ReasoningInsightType + 5, // 294: api.v1.ReasoningInsight.severity:type_name -> api.v1.ReasoningInsightSeverity + 208, // 295: api.v1.ReasoningInsight.evidence:type_name -> api.v1.ReasoningEvidence + 210, // 296: api.v1.ReasoningContainerChange.cpu:type_name -> api.v1.ReasoningResourceEdge + 210, // 297: api.v1.ReasoningContainerChange.memory:type_name -> api.v1.ReasoningResourceEdge + 210, // 298: api.v1.ReasoningContainerChange.gpu:type_name -> api.v1.ReasoningResourceEdge + 212, // 299: api.v1.ReasoningReplicas.utilization:type_name -> api.v1.ReasoningUtilization + 213, // 300: api.v1.ReasoningReplicas.historical_pattern:type_name -> api.v1.ReasoningHistoricalPattern + 7, // 301: api.v1.ReasoningDecision.kind:type_name -> api.v1.ReasoningDecisionKind + 193, // 302: api.v1.GetAttachedNodeGroupPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy + 640, // 303: api.v1.GetAttachedWorkloadPoliciesRequest.kind:type_name -> api.v1.K8sObjectKind + 220, // 304: api.v1.GetAttachedWorkloadPoliciesResponse.relevant_policies:type_name -> api.v1.WorkloadRecommendationPolicyGroup + 603, // 305: api.v1.GetAttachedWorkloadPoliciesResponse.policy_id_to_matched_targets:type_name -> api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry + 196, // 306: api.v1.WorkloadRecommendationPolicyGroup.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 94, // 307: api.v1.WorkloadPolicyTargetGroup.targets:type_name -> api.v1.WorkloadPolicyTarget + 50, // 308: api.v1.WorkloadIdentifiers.workloads:type_name -> api.v1.WorkloadIdentifier + 50, // 309: api.v1.WorkloadPolicies.workload:type_name -> api.v1.WorkloadIdentifier + 196, // 310: api.v1.WorkloadPolicies.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 604, // 311: api.v1.ListAttachedWorkloadPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry + 605, // 312: api.v1.ListAttachedWorkloadPoliciesResponse.workload_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry + 606, // 313: api.v1.ListAttachedNodeGroupPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry + 607, // 314: api.v1.ListAttachedNodeGroupPoliciesResponse.node_group_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry + 640, // 315: api.v1.RecommendationAppliedRequest.kind:type_name -> api.v1.K8sObjectKind + 640, // 316: api.v1.ApplyRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 206, // 317: api.v1.ApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 637, // 318: api.v1.RetrieveSavingsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 319: api.v1.RetrieveSavingsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 649, // 320: api.v1.RetrieveSavingsForWorkloadResponse.savings:type_name -> api.v1.SavingsTimeSeries + 650, // 321: api.v1.RetrieveSavingsForWorkloadResponse.get_workload_resp:type_name -> api.v1.GetWorkloadResponse + 286, // 322: api.v1.CreateNodePoliciesRequest.policies:type_name -> api.v1.NodePolicy + 286, // 323: api.v1.CreateNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy + 286, // 324: api.v1.SuggestedNodePolicyResponse.policy:type_name -> api.v1.NodePolicy + 286, // 325: api.v1.GenerateNodePoliciesFromKarpenterResponse.policies:type_name -> api.v1.NodePolicy + 317, // 326: api.v1.GenerateNodePoliciesFromKarpenterResponse.targets:type_name -> api.v1.NodePolicyTarget + 286, // 327: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.policies:type_name -> api.v1.NodePolicy + 317, // 328: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.targets:type_name -> api.v1.NodePolicyTarget + 274, // 329: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.warnings:type_name -> api.v1.WorkloadCompatibilityWarning + 245, // 330: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.eligibility:type_name -> api.v1.NodeGroupMigrationEligibility + 637, // 331: api.v1.GetMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp + 637, // 332: api.v1.GetMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp + 637, // 333: api.v1.GetKarpenterMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp + 637, // 334: api.v1.GetKarpenterMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp + 637, // 335: api.v1.KarpenterOwnershipConflict.detected_at:type_name -> google.protobuf.Timestamp + 637, // 336: api.v1.KarpenterOwnershipConflict.acknowledged_at:type_name -> google.protobuf.Timestamp + 258, // 337: api.v1.DetectKarpenterOwnershipConflictsResponse.conflicts:type_name -> api.v1.KarpenterOwnershipConflict + 263, // 338: api.v1.GetKarpenterSourceResourcesResponse.resources:type_name -> api.v1.KarpenterSourceResource + 266, // 339: api.v1.GetKarpenterAdoptionStatusResponse.statuses:type_name -> api.v1.NodePoolAdoptionStatus + 637, // 340: api.v1.NodePoolValidationReport.reported_at:type_name -> google.protobuf.Timestamp + 272, // 341: api.v1.GetNodePoolValidationsResponse.validations:type_name -> api.v1.NodePoolValidationReport + 286, // 342: api.v1.ListNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy + 286, // 343: api.v1.UpdateNodePolicyRequest.policy:type_name -> api.v1.NodePolicy + 286, // 344: api.v1.UpdateNodePolicyResponse.policy:type_name -> api.v1.NodePolicy + 10, // 345: api.v1.NodeGroupCheckpointStatus.state:type_name -> api.v1.NodeGroupCheckpointState + 11, // 346: api.v1.NodeGroupCheckpointStatus.reason:type_name -> api.v1.CheckpointReason + 608, // 347: api.v1.GetNodeGroupsCheckpointStatusResponse.by_node_group:type_name -> api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry + 641, // 348: api.v1.NodePolicy.instance_categories:type_name -> api.v1.LabelSelector + 641, // 349: api.v1.NodePolicy.instance_families:type_name -> api.v1.LabelSelector + 641, // 350: api.v1.NodePolicy.instance_cpus:type_name -> api.v1.LabelSelector + 641, // 351: api.v1.NodePolicy.instance_hypervisors:type_name -> api.v1.LabelSelector + 641, // 352: api.v1.NodePolicy.instance_generations:type_name -> api.v1.LabelSelector + 641, // 353: api.v1.NodePolicy.instance_sizes:type_name -> api.v1.LabelSelector + 641, // 354: api.v1.NodePolicy.instance_shapes:type_name -> api.v1.LabelSelector + 641, // 355: api.v1.NodePolicy.instance_types:type_name -> api.v1.LabelSelector + 641, // 356: api.v1.NodePolicy.instance_local_nvme:type_name -> api.v1.LabelSelector + 641, // 357: api.v1.NodePolicy.zones:type_name -> api.v1.LabelSelector + 641, // 358: api.v1.NodePolicy.architectures:type_name -> api.v1.LabelSelector + 641, // 359: api.v1.NodePolicy.capacity_types:type_name -> api.v1.LabelSelector + 641, // 360: api.v1.NodePolicy.operating_systems:type_name -> api.v1.LabelSelector + 609, // 361: api.v1.NodePolicy.labels:type_name -> api.v1.NodePolicy.LabelsEntry + 321, // 362: api.v1.NodePolicy.taints:type_name -> api.v1.Taint + 323, // 363: api.v1.NodePolicy.disruption:type_name -> api.v1.DisruptionPolicy + 324, // 364: api.v1.NodePolicy.limits:type_name -> api.v1.ResourceLimits + 321, // 365: api.v1.NodePolicy.startup_taints:type_name -> api.v1.Taint + 325, // 366: api.v1.NodePolicy.aws:type_name -> api.v1.AWSNodeClassSpec + 352, // 367: api.v1.NodePolicy.gcp:type_name -> api.v1.GCPNodeClassSpec + 355, // 368: api.v1.NodePolicy.azure:type_name -> api.v1.AzureNodeClassSpec + 363, // 369: api.v1.NodePolicy.oci:type_name -> api.v1.OCINodeClassSpec + 651, // 370: api.v1.NodePolicy.cloud_provider:type_name -> api.v1.CloudProvider + 320, // 371: api.v1.NodePolicy.zonal_shift:type_name -> api.v1.ZonalShiftConfig + 365, // 372: api.v1.NodePolicy.raw:type_name -> api.v1.RawKarpenterSpec + 637, // 373: api.v1.NodePolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 374: api.v1.NodePolicy.updated_at:type_name -> google.protobuf.Timestamp + 637, // 375: api.v1.NodePolicy.deleted_at:type_name -> google.protobuf.Timestamp + 286, // 376: api.v1.PreviewNodeRecommendationConfigRequest.policies:type_name -> api.v1.NodePolicy + 289, // 377: api.v1.PreviewNodeRecommendationConfigResponse.nrc:type_name -> api.v1.NodeRecommendationConfig + 9, // 378: api.v1.NodeRecommendationConfig.status:type_name -> api.v1.RecommendationStatus + 637, // 379: api.v1.NodeRecommendationConfig.created_at:type_name -> google.protobuf.Timestamp + 637, // 380: api.v1.NodeRecommendationConfig.updated_at:type_name -> google.protobuf.Timestamp + 637, // 381: api.v1.NodeRecommendationConfig.deleted_at:type_name -> google.protobuf.Timestamp + 610, // 382: api.v1.SuggestedKarpenterConfigResponse.ng_to_original:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry + 611, // 383: api.v1.SuggestedKarpenterConfigResponse.ng_to_suggested:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry + 286, // 384: api.v1.SuggestNodePolicyImprovementsRequest.policy:type_name -> api.v1.NodePolicy + 652, // 385: api.v1.SuggestNodePolicyImprovementsRequest.window:type_name -> api.v1.ProfileWindow + 286, // 386: api.v1.SuggestNodePolicyImprovementsResponse.original:type_name -> api.v1.NodePolicy + 286, // 387: api.v1.SuggestNodePolicyImprovementsResponse.suggested:type_name -> api.v1.NodePolicy + 297, // 388: api.v1.SuggestNodePolicyImprovementsResponse.suggestions:type_name -> api.v1.NodePolicySuggestion + 301, // 389: api.v1.SuggestNodePolicyImprovementsResponse.context:type_name -> api.v1.SuggestionContext + 637, // 390: api.v1.SuggestNodePolicyImprovementsResponse.computed_at:type_name -> google.protobuf.Timestamp + 652, // 391: api.v1.ListClusterNodePolicySuggestionsRequest.window:type_name -> api.v1.ProfileWindow + 296, // 392: api.v1.ListClusterNodePolicySuggestionsResponse.policies:type_name -> api.v1.NodePolicySuggestionsForPolicy + 637, // 393: api.v1.ListClusterNodePolicySuggestionsResponse.computed_at:type_name -> google.protobuf.Timestamp + 297, // 394: api.v1.NodePolicySuggestionsForPolicy.suggestions:type_name -> api.v1.NodePolicySuggestion + 301, // 395: api.v1.NodePolicySuggestionsForPolicy.context:type_name -> api.v1.SuggestionContext + 637, // 396: api.v1.NodePolicySuggestionsForPolicy.computed_at:type_name -> google.protobuf.Timestamp + 12, // 397: api.v1.NodePolicySuggestion.group:type_name -> api.v1.SuggestionGroup + 13, // 398: api.v1.NodePolicySuggestion.flavor:type_name -> api.v1.SuggestionFlavor + 14, // 399: api.v1.NodePolicySuggestion.severity:type_name -> api.v1.SuggestionSeverity + 299, // 400: api.v1.NodePolicySuggestion.evidence:type_name -> api.v1.SuggestionEvidence + 298, // 401: api.v1.NodePolicySuggestion.additional_field_changes:type_name -> api.v1.SuggestionFieldChange + 15, // 402: api.v1.SuggestionEvidence.scope:type_name -> api.v1.EvidenceScope + 300, // 403: api.v1.SuggestionEvidence.workloads:type_name -> api.v1.SuggestionWorkloadRef + 652, // 404: api.v1.SuggestionContext.window:type_name -> api.v1.ProfileWindow + 15, // 405: api.v1.SuggestionContext.evidence_scope:type_name -> api.v1.EvidenceScope + 304, // 406: api.v1.GetAvailableKindsByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters + 16, // 407: api.v1.SearchResourcesByTargetingFiltersRequest.target_filter_type:type_name -> api.v1.TargetFilterType + 304, // 408: api.v1.SearchResourcesByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters + 640, // 409: api.v1.TargetFilters.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 410: api.v1.TargetFilters.name_pattern:type_name -> api.v1.RegexPattern + 642, // 411: api.v1.TargetFilters.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 412: api.v1.GetAvailableKindsByTargetingFiltersResponse.kinds:type_name -> api.v1.K8sObjectKind + 307, // 413: api.v1.SearchResourcesByTargetingFiltersResponse.namespaces:type_name -> api.v1.NamespaceSearchResult + 308, // 414: api.v1.SearchResourcesByTargetingFiltersResponse.workloads:type_name -> api.v1.WorkloadSearchResult + 309, // 415: api.v1.SearchResourcesByTargetingFiltersResponse.node_groups:type_name -> api.v1.NodeGroupSearchResult + 310, // 416: api.v1.SearchResourcesByTargetingFiltersResponse.labels:type_name -> api.v1.LabelSearchResult + 317, // 417: api.v1.CreateNodePolicyTargetsRequest.targets:type_name -> api.v1.NodePolicyTarget + 317, // 418: api.v1.CreateNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget + 317, // 419: api.v1.ListNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget + 317, // 420: api.v1.UpdateNodePolicyTargetRequest.target:type_name -> api.v1.NodePolicyTarget + 317, // 421: api.v1.UpdateNodePolicyTargetResponse.target:type_name -> api.v1.NodePolicyTarget + 637, // 422: api.v1.NodePolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 423: api.v1.NodePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 637, // 424: api.v1.NodePolicyTarget.deleted_at:type_name -> google.protobuf.Timestamp + 319, // 425: api.v1.NodePolicyTarget.status:type_name -> api.v1.NodePolicyTargetStatus + 637, // 426: api.v1.NodePolicyCondition.last_transition_time:type_name -> google.protobuf.Timestamp + 318, // 427: api.v1.NodePolicyTargetStatus.conditions:type_name -> api.v1.NodePolicyCondition + 322, // 428: api.v1.DisruptionPolicy.budgets:type_name -> api.v1.DisruptionBudget + 344, // 429: api.v1.AWSNodeClassSpec.subnet_selector_terms:type_name -> api.v1.SubnetSelectorTerm + 345, // 430: api.v1.AWSNodeClassSpec.security_group_selector_terms:type_name -> api.v1.SecurityGroupSelectorTerm + 346, // 431: api.v1.AWSNodeClassSpec.capacity_reservation_selector_terms:type_name -> api.v1.CapacityReservationSelectorTerm + 347, // 432: api.v1.AWSNodeClassSpec.ami_selector_terms:type_name -> api.v1.AMISelectorTerm + 612, // 433: api.v1.AWSNodeClassSpec.tags:type_name -> api.v1.AWSNodeClassSpec.TagsEntry + 348, // 434: api.v1.AWSNodeClassSpec.kubelet:type_name -> api.v1.KubeletConfiguration + 349, // 435: api.v1.AWSNodeClassSpec.block_device_mappings:type_name -> api.v1.BlockDeviceMapping + 17, // 436: api.v1.AWSNodeClassSpec.instance_store_policy:type_name -> api.v1.InstanceStorePolicy + 351, // 437: api.v1.AWSNodeClassSpec.metadata_options:type_name -> api.v1.MetadataOptions + 332, // 438: api.v1.GetInstanceFamiliesResponse.instance_families:type_name -> api.v1.InstanceFamily + 334, // 439: api.v1.GetInstanceSizesResponse.instance_sizes:type_name -> api.v1.InstanceSize + 333, // 440: api.v1.GetInstanceShapesResponse.instance_shapes:type_name -> api.v1.InstanceShape + 335, // 441: api.v1.GetInstanceCategoriesResponse.instance_categories:type_name -> api.v1.InstanceCategory + 336, // 442: api.v1.GetInstanceCPUsResponse.instance_cpus:type_name -> api.v1.InstanceCPU + 337, // 443: api.v1.GetInstanceTypeNamesResponse.instance_types:type_name -> api.v1.InstanceTypeName + 613, // 444: api.v1.SubnetSelectorTerm.tags:type_name -> api.v1.SubnetSelectorTerm.TagsEntry + 614, // 445: api.v1.SecurityGroupSelectorTerm.tags:type_name -> api.v1.SecurityGroupSelectorTerm.TagsEntry + 615, // 446: api.v1.CapacityReservationSelectorTerm.tags:type_name -> api.v1.CapacityReservationSelectorTerm.TagsEntry + 616, // 447: api.v1.AMISelectorTerm.tags:type_name -> api.v1.AMISelectorTerm.TagsEntry + 617, // 448: api.v1.KubeletConfiguration.system_reserved:type_name -> api.v1.KubeletConfiguration.SystemReservedEntry + 618, // 449: api.v1.KubeletConfiguration.kube_reserved:type_name -> api.v1.KubeletConfiguration.KubeReservedEntry + 619, // 450: api.v1.KubeletConfiguration.eviction_hard:type_name -> api.v1.KubeletConfiguration.EvictionHardEntry + 620, // 451: api.v1.KubeletConfiguration.eviction_soft:type_name -> api.v1.KubeletConfiguration.EvictionSoftEntry + 621, // 452: api.v1.KubeletConfiguration.eviction_soft_grace_period:type_name -> api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry + 350, // 453: api.v1.BlockDeviceMapping.ebs:type_name -> api.v1.BlockDevice + 353, // 454: api.v1.GCPNodeClassSpec.image_selector_terms:type_name -> api.v1.GCPImageSelectorTerm + 348, // 455: api.v1.GCPNodeClassSpec.kubelet_configuration:type_name -> api.v1.KubeletConfiguration + 622, // 456: api.v1.GCPNodeClassSpec.labels:type_name -> api.v1.GCPNodeClassSpec.LabelsEntry + 623, // 457: api.v1.GCPNodeClassSpec.metadata:type_name -> api.v1.GCPNodeClassSpec.MetadataEntry + 354, // 458: api.v1.GCPNodeClassSpec.disks:type_name -> api.v1.GCPDisk + 624, // 459: api.v1.AzureNodeClassSpec.tags:type_name -> api.v1.AzureNodeClassSpec.TagsEntry + 356, // 460: api.v1.AzureNodeClassSpec.kubelet:type_name -> api.v1.AzureKubeletConfiguration + 357, // 461: api.v1.OCINodeClassSpec.image_selector:type_name -> api.v1.OCIImageSelectorTerm + 358, // 462: api.v1.OCINodeClassSpec.subnet_selector:type_name -> api.v1.OCISubnetSelectorTerm + 359, // 463: api.v1.OCINodeClassSpec.security_group_selector:type_name -> api.v1.OCISecurityGroupSelectorTerm + 625, // 464: api.v1.OCINodeClassSpec.meta_data:type_name -> api.v1.OCINodeClassSpec.MetaDataEntry + 626, // 465: api.v1.OCINodeClassSpec.tags:type_name -> api.v1.OCINodeClassSpec.TagsEntry + 627, // 466: api.v1.OCINodeClassSpec.free_form_tags:type_name -> api.v1.OCINodeClassSpec.FreeFormTagsEntry + 360, // 467: api.v1.OCINodeClassSpec.boot_config:type_name -> api.v1.OCIBootConfig + 361, // 468: api.v1.OCINodeClassSpec.launch_options:type_name -> api.v1.OCILaunchOptions + 362, // 469: api.v1.OCINodeClassSpec.block_devices:type_name -> api.v1.OCIVolumeAttributes + 369, // 470: api.v1.SnapshotCRStatusReport.resources:type_name -> api.v1.SnapshotCRStatus + 628, // 471: api.v1.SnapshotCRStatus.annotations:type_name -> api.v1.SnapshotCRStatus.AnnotationsEntry + 637, // 472: api.v1.SnapshotCRRuntimeStatus.last_activity_time:type_name -> google.protobuf.Timestamp + 637, // 473: api.v1.SnapshotCRRuntimeStatus.start_time:type_name -> google.protobuf.Timestamp + 637, // 474: api.v1.SnapshotCRRuntimeStatus.completion_time:type_name -> google.protobuf.Timestamp + 637, // 475: api.v1.SnapshotCRRuntimeStatus.observed_at:type_name -> google.protobuf.Timestamp + 370, // 476: api.v1.SnapshotPolicyTargetStatus.resources:type_name -> api.v1.SnapshotCRRuntimeStatus + 374, // 477: api.v1.NodeRecommendation.aws:type_name -> api.v1.AWSKarpenterSpec + 375, // 478: api.v1.NodeRecommendation.aks:type_name -> api.v1.AKSKarpenterSpec + 379, // 479: api.v1.NodeRecommendation.gcp:type_name -> api.v1.GCPKarpenterSpec + 381, // 480: api.v1.NodeRecommendation.oci:type_name -> api.v1.OCIKarpenterSpec + 376, // 481: api.v1.AWSKarpenterSpec.np:type_name -> api.v1.NodePool + 377, // 482: api.v1.AWSKarpenterSpec.ec2nc:type_name -> api.v1.EC2NodeClass + 376, // 483: api.v1.AKSKarpenterSpec.np:type_name -> api.v1.NodePool + 378, // 484: api.v1.AKSKarpenterSpec.aksnc:type_name -> api.v1.AKSNodeClass + 376, // 485: api.v1.GCPKarpenterSpec.np:type_name -> api.v1.NodePool + 380, // 486: api.v1.GCPKarpenterSpec.node_classes:type_name -> api.v1.GCENodeClass + 376, // 487: api.v1.OCIKarpenterSpec.np:type_name -> api.v1.NodePool + 382, // 488: api.v1.OCIKarpenterSpec.node_classes:type_name -> api.v1.OCINodeClass + 18, // 489: api.v1.StorageRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 18, // 490: api.v1.StorageRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 637, // 491: api.v1.StorageRecommendationPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 492: api.v1.StorageRecommendationPolicy.updated_at:type_name -> google.protobuf.Timestamp + 18, // 493: api.v1.CreateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 383, // 494: api.v1.CreateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 383, // 495: api.v1.GetStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 383, // 496: api.v1.ListStorageRecommendationPoliciesResponse.policies:type_name -> api.v1.StorageRecommendationPolicy + 18, // 497: api.v1.UpdateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 383, // 498: api.v1.UpdateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 641, // 499: api.v1.StoragePolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector + 637, // 500: api.v1.StoragePolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 501: api.v1.StoragePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 641, // 502: api.v1.CreateStoragePolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 394, // 503: api.v1.CreateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget + 394, // 504: api.v1.ListStoragePolicyTargetsResponse.targets:type_name -> api.v1.StoragePolicyTarget + 394, // 505: api.v1.UpdateStoragePolicyTargetRequest.target:type_name -> api.v1.StoragePolicyTarget + 394, // 506: api.v1.UpdateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget + 9, // 507: api.v1.PvcStorageRecommendation.status:type_name -> api.v1.RecommendationStatus + 637, // 508: api.v1.PvcStorageRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 637, // 509: api.v1.PvcStorageRecommendation.applied_at:type_name -> google.protobuf.Timestamp + 637, // 510: api.v1.PvcStorageRecommendation.created_at:type_name -> google.protobuf.Timestamp + 637, // 511: api.v1.PvcStorageRecommendation.updated_at:type_name -> google.protobuf.Timestamp + 25, // 512: api.v1.PvcStorageRecommendation.operation_type:type_name -> api.v1.PvcOperationType + 403, // 513: api.v1.GetPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 639, // 514: api.v1.ListPvcStorageRecommendationsRequest.pagination:type_name -> api.v1.Pagination + 403, // 515: api.v1.ListPvcStorageRecommendationsResponse.recommendations:type_name -> api.v1.PvcStorageRecommendation + 639, // 516: api.v1.ListPvcStorageRecommendationsResponse.pagination:type_name -> api.v1.Pagination + 403, // 517: api.v1.GeneratePvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 403, // 518: api.v1.PreviewPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 637, // 519: api.v1.WorkloadRuleOOMEvent.timestamp:type_name -> google.protobuf.Timestamp + 637, // 520: api.v1.WorkloadRuleOOMEvent.created_at:type_name -> google.protobuf.Timestamp + 412, // 521: api.v1.ListWorkloadRuleOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent + 412, // 522: api.v1.ListWorkloadOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent + 637, // 523: api.v1.WorkloadRuleCPUThrottleEvent.timestamp:type_name -> google.protobuf.Timestamp + 637, // 524: api.v1.WorkloadRuleCPUThrottleEvent.created_at:type_name -> google.protobuf.Timestamp + 417, // 525: api.v1.ListWorkloadRuleCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent + 417, // 526: api.v1.ListWorkloadCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent + 422, // 527: api.v1.WorkloadOptimizationPolicyProto.namespace_selector:type_name -> api.v1.StringSetSelector + 637, // 528: api.v1.WorkloadOptimizationPolicyProto.created_at:type_name -> google.protobuf.Timestamp + 637, // 529: api.v1.WorkloadOptimizationPolicyProto.updated_at:type_name -> google.protobuf.Timestamp + 629, // 530: api.v1.WorkloadOptimizationPolicyProto.cluster_names:type_name -> api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry + 18, // 531: api.v1.WorkloadOptimizationPolicyProto.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 532: api.v1.WorkloadOptimizationPolicyProto.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 533: api.v1.WorkloadOptimizationPolicyProto.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 534: api.v1.WorkloadOptimizationPolicyProto.label_selector:type_name -> api.v1.LabelSelector + 642, // 535: api.v1.WorkloadOptimizationPolicyProto.name_pattern:type_name -> api.v1.RegexPattern + 642, // 536: api.v1.WorkloadOptimizationPolicyProto.namespace_pattern:type_name -> api.v1.RegexPattern + 137, // 537: api.v1.WorkloadOptimizationPolicyProto.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 538: api.v1.WorkloadOptimizationPolicyProto.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 539: api.v1.WorkloadOptimizationPolicyProto.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 540: api.v1.WorkloadOptimizationPolicyProto.hpa_rule:type_name -> api.v1.HPARuleConfig + 142, // 541: api.v1.WorkloadOptimizationPolicyProto.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 144, // 542: api.v1.WorkloadOptimizationPolicyProto.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 137, // 543: api.v1.GenericOptimizationSettings.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 544: api.v1.GenericOptimizationSettings.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 545: api.v1.GenericOptimizationSettings.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 546: api.v1.GenericOptimizationSettings.hpa_rule:type_name -> api.v1.HPARuleConfig + 142, // 547: api.v1.GenericOptimizationSettings.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 144, // 548: api.v1.GenericOptimizationSettings.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 422, // 549: api.v1.CreateWorkloadOptimizationPolicyRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 18, // 550: api.v1.CreateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 551: api.v1.CreateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 552: api.v1.CreateWorkloadOptimizationPolicyRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 553: api.v1.CreateWorkloadOptimizationPolicyRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 554: api.v1.CreateWorkloadOptimizationPolicyRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 555: api.v1.CreateWorkloadOptimizationPolicyRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 424, // 556: api.v1.CreateWorkloadOptimizationPolicyRequest.settings:type_name -> api.v1.GenericOptimizationSettings + 423, // 557: api.v1.CreateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 558: api.v1.ListWorkloadOptimizationPoliciesResponse.policies:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 559: api.v1.GetWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 560: api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 422, // 561: api.v1.UpdateWorkloadOptimizationPolicyRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 18, // 562: api.v1.UpdateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 563: api.v1.UpdateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 564: api.v1.UpdateWorkloadOptimizationPolicyRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 565: api.v1.UpdateWorkloadOptimizationPolicyRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 566: api.v1.UpdateWorkloadOptimizationPolicyRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 567: api.v1.UpdateWorkloadOptimizationPolicyRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 424, // 568: api.v1.UpdateWorkloadOptimizationPolicyRequest.settings:type_name -> api.v1.GenericOptimizationSettings + 26, // 569: api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest.rule_action:type_name -> api.v1.WorkloadRuleAction + 423, // 570: api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 571: api.v1.UpdateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 26, // 572: api.v1.DeleteWorkloadOptimizationPolicyRequest.rule_action:type_name -> api.v1.WorkloadRuleAction + 422, // 573: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 422, // 574: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 575: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 576: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 577: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 27, // 578: api.v1.WorkloadOptimizationPolicyMatch.status:type_name -> api.v1.WorkloadOptimizationPolicyMatchStatus + 440, // 579: api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadOptimizationPolicyMatch + 422, // 580: api.v1.SchedulerPolicyTargetProto.namespace_selector:type_name -> api.v1.StringSetSelector + 422, // 581: api.v1.SchedulerPolicyTargetProto.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 582: api.v1.SchedulerPolicyTargetProto.label_selector:type_name -> api.v1.LabelSelector + 642, // 583: api.v1.SchedulerPolicyTargetProto.name_pattern:type_name -> api.v1.RegexPattern + 642, // 584: api.v1.SchedulerPolicyTargetProto.namespace_pattern:type_name -> api.v1.RegexPattern + 442, // 585: api.v1.SchedulerPolicyProto.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 637, // 586: api.v1.SchedulerPolicyProto.created_at:type_name -> google.protobuf.Timestamp + 637, // 587: api.v1.SchedulerPolicyProto.updated_at:type_name -> google.protobuf.Timestamp + 637, // 588: api.v1.SchedulerPolicyProto.delete_requested_at:type_name -> google.protobuf.Timestamp + 630, // 589: api.v1.SchedulerPolicyProto.cluster_names:type_name -> api.v1.SchedulerPolicyProto.ClusterNamesEntry + 442, // 590: api.v1.CreateSchedulerPolicyRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 443, // 591: api.v1.CreateSchedulerPolicyResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 443, // 592: api.v1.ListSchedulerPoliciesResponse.policies:type_name -> api.v1.SchedulerPolicyProto + 442, // 593: api.v1.UpdateSchedulerPolicyRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 443, // 594: api.v1.UpdateSchedulerPolicyResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 443, // 595: api.v1.ToggleSchedulerPolicyDisabledResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 32, // 596: api.v1.DeleteSchedulerPolicyResponse.outcome:type_name -> api.v1.DeleteSchedulerPolicyResponse.Outcome + 442, // 597: api.v1.PreviewSchedulerPolicyTargetsRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 33, // 598: api.v1.SchedulerPolicyTargetMatch.status:type_name -> api.v1.SchedulerPolicyTargetMatch.Status + 455, // 599: api.v1.PreviewSchedulerPolicyTargetsResponse.matched_workloads:type_name -> api.v1.SchedulerPolicyTargetMatch + 34, // 600: api.v1.SchedulerPolicyEnrollment.state:type_name -> api.v1.SchedulerPolicyEnrollment.State + 637, // 601: api.v1.SchedulerPolicyEnrollment.enrolled_at:type_name -> google.protobuf.Timestamp + 637, // 602: api.v1.SchedulerPolicyEnrollment.unenrolled_at:type_name -> google.protobuf.Timestamp + 458, // 603: api.v1.ListSchedulerPolicyEnrollmentsResponse.enrollments:type_name -> api.v1.SchedulerPolicyEnrollment + 631, // 604: api.v1.ListSchedulerPolicyEnrollmentsResponse.cluster_names:type_name -> api.v1.ListSchedulerPolicyEnrollmentsResponse.ClusterNamesEntry + 443, // 605: api.v1.SchedulerPolicySync.policies:type_name -> api.v1.SchedulerPolicyProto + 462, // 606: api.v1.SchedulerPolicySync.reverts:type_name -> api.v1.SchedulerRevertInstruction + 461, // 607: api.v1.SchedulerPolicySync.scheduler_settings:type_name -> api.v1.SchedulerConfigPayload + 637, // 608: api.v1.SchedulerConfigPayload.updated_at:type_name -> google.protobuf.Timestamp + 632, // 609: api.v1.SchedulerEnrollmentReport.observations:type_name -> api.v1.SchedulerEnrollmentReport.Observation + 633, // 610: api.v1.SchedulerRevertEventReport.events:type_name -> api.v1.SchedulerRevertEventReport.Event + 136, // 611: api.v1.GetWorkloadRulesByPolicyResponse.managed_rules:type_name -> api.v1.WorkloadRule + 136, // 612: api.v1.GetWorkloadRulesByPolicyResponse.excluded_rules:type_name -> api.v1.WorkloadRule + 634, // 613: api.v1.GetWorkloadRulesByPolicyResponse.cluster_names:type_name -> api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry + 136, // 614: api.v1.ListWorkloadRulesResponse.rules:type_name -> api.v1.WorkloadRule + 635, // 615: api.v1.ListWorkloadRulesResponse.cluster_names:type_name -> api.v1.ListWorkloadRulesResponse.ClusterNamesEntry + 636, // 616: api.v1.ListWorkloadRulesResponse.policy_names:type_name -> api.v1.ListWorkloadRulesResponse.PolicyNamesEntry + 136, // 617: api.v1.GetWorkloadRuleByIDResponse.rule:type_name -> api.v1.WorkloadRule + 136, // 618: api.v1.GetWorkloadRuleByWorkloadResponse.rule:type_name -> api.v1.WorkloadRule + 206, // 619: api.v1.DeleteRuleAndApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 137, // 620: api.v1.ManualRuleFields.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 621: api.v1.ManualRuleFields.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 622: api.v1.ManualRuleFields.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 623: api.v1.ManualRuleFields.hpa_rule:type_name -> api.v1.HPARuleConfig + 144, // 624: api.v1.ManualRuleFields.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 18, // 625: api.v1.ManualRuleFields.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 626: api.v1.ManualRuleFields.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 141, // 627: api.v1.ManualRuleFields.containers:type_name -> api.v1.ContainerResourceRuleConfig + 142, // 628: api.v1.ManualRuleFields.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 145, // 629: api.v1.ManualRuleFields.keda_scaled_object:type_name -> api.v1.KEDAScaledObjectTemplate + 485, // 630: api.v1.UpsertManualWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields + 29, // 631: api.v1.UpsertManualWorkloadRuleRequest.source:type_name -> api.v1.WorkloadRuleSource + 136, // 632: api.v1.UpsertManualWorkloadRuleResponse.rule:type_name -> api.v1.WorkloadRule + 136, // 633: api.v1.ToggleWorkloadRuleDisabledResponse.rule:type_name -> api.v1.WorkloadRule + 485, // 634: api.v1.PreviewWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields + 136, // 635: api.v1.PreviewWorkloadRuleResponse.materialized_rule:type_name -> api.v1.WorkloadRule + 136, // 636: api.v1.PreviewWorkloadRuleResponse.engine_projection:type_name -> api.v1.WorkloadRule + 653, // 637: api.v1.PreviewWorkloadRuleResponse.profile:type_name -> api.v1.WorkloadProfileResult + 136, // 638: api.v1.PreviewWorkloadRuleResponse.db_rule:type_name -> api.v1.WorkloadRule + 494, // 639: api.v1.BatchAutoOptimizeWorkloadsRequest.workloads:type_name -> api.v1.BatchAutoOptimizeWorkload + 136, // 640: api.v1.BatchAutoOptimizeWorkloadResult.rule:type_name -> api.v1.WorkloadRule + 496, // 641: api.v1.BatchAutoOptimizeWorkloadsResponse.results:type_name -> api.v1.BatchAutoOptimizeWorkloadResult + 498, // 642: api.v1.BatchUpsertManualWorkloadRulesRequest.workloads:type_name -> api.v1.BatchWorkloadEntry + 485, // 643: api.v1.BatchUpsertManualWorkloadRulesRequest.fields:type_name -> api.v1.ManualRuleFields + 29, // 644: api.v1.BatchUpsertManualWorkloadRulesRequest.source:type_name -> api.v1.WorkloadRuleSource + 136, // 645: api.v1.BatchUpsertManualWorkloadRuleResult.rule:type_name -> api.v1.WorkloadRule + 500, // 646: api.v1.BatchUpsertManualWorkloadRulesResponse.results:type_name -> api.v1.BatchUpsertManualWorkloadRuleResult + 498, // 647: api.v1.BatchPreviewWorkloadRulesRequest.workloads:type_name -> api.v1.BatchWorkloadEntry + 485, // 648: api.v1.BatchPreviewWorkloadRulesRequest.fields:type_name -> api.v1.ManualRuleFields + 136, // 649: api.v1.BatchPreviewWorkloadRuleResult.materialized_rule:type_name -> api.v1.WorkloadRule + 136, // 650: api.v1.BatchPreviewWorkloadRuleResult.engine_projection:type_name -> api.v1.WorkloadRule + 653, // 651: api.v1.BatchPreviewWorkloadRuleResult.profile:type_name -> api.v1.WorkloadProfileResult + 503, // 652: api.v1.BatchPreviewWorkloadRulesResponse.results:type_name -> api.v1.BatchPreviewWorkloadRuleResult + 652, // 653: api.v1.WorkloadProfileManifest.window:type_name -> api.v1.ProfileWindow + 654, // 654: api.v1.WorkloadProfileManifest.keys:type_name -> api.v1.ProfileKey + 637, // 655: api.v1.WorkloadProfileManifest.issued_at:type_name -> google.protobuf.Timestamp + 652, // 656: api.v1.BatchWorkloadProfiles.window:type_name -> api.v1.ProfileWindow + 655, // 657: api.v1.BatchWorkloadProfiles.profiles:type_name -> api.v1.WorkloadProfileSnapshot + 637, // 658: api.v1.NodeConfigApplyEvent.applied_at:type_name -> google.protobuf.Timestamp + 289, // 659: api.v1.GetNodeRecommendationStatusResponse.current_config:type_name -> api.v1.NodeRecommendationConfig + 509, // 660: api.v1.GetNodeRecommendationStatusResponse.history:type_name -> api.v1.NodeConfigApplyEvent + 516, // 661: api.v1.GetCheckpointApplyStatusResponse.failures:type_name -> api.v1.NodeApplyFailure + 518, // 662: api.v1.GetClusterCheckpointLabelCoverageResponse.groups:type_name -> api.v1.NodeGroupCheckpointLabelCoverage + 30, // 663: api.v1.NodeCheckpointLabelEntry.last_apply_state:type_name -> api.v1.NodeCheckpointLabelState + 521, // 664: api.v1.ListNodeGroupCheckpointLabelStateResponse.nodes:type_name -> api.v1.NodeCheckpointLabelEntry + 523, // 665: api.v1.SnapshotResourceThreshold.cpu_percent:type_name -> api.v1.SnapshotPercentBounds + 523, // 666: api.v1.SnapshotResourceThreshold.memory_percent:type_name -> api.v1.SnapshotPercentBounds + 524, // 667: api.v1.SnapshotSchedulePolicySpec.resource_threshold:type_name -> api.v1.SnapshotResourceThreshold + 526, // 668: api.v1.SnapshotRetentionPolicySpec.global_retention:type_name -> api.v1.SnapshotGlobalRetention + 527, // 669: api.v1.SnapshotRetentionPolicySpec.container_policies:type_name -> api.v1.SnapshotContainerRetentionPolicy + 528, // 670: api.v1.SnapshotRetentionPolicySpec.pod_policies:type_name -> api.v1.SnapshotPodRetentionPolicy + 529, // 671: api.v1.SnapshotRetentionPolicySpec.namespace_policies:type_name -> api.v1.SnapshotNamespaceRetentionPolicy + 525, // 672: api.v1.SnapshotPolicy.schedule:type_name -> api.v1.SnapshotSchedulePolicySpec + 530, // 673: api.v1.SnapshotPolicy.retention:type_name -> api.v1.SnapshotRetentionPolicySpec + 637, // 674: api.v1.SnapshotPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 675: api.v1.SnapshotPolicy.updated_at:type_name -> google.protobuf.Timestamp + 31, // 676: api.v1.ForensicSnapshotPolicy.post_snapshot_action:type_name -> api.v1.ForensicPostSnapshotAction + 637, // 677: api.v1.ForensicSnapshotPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 678: api.v1.ForensicSnapshotPolicy.updated_at:type_name -> google.protobuf.Timestamp + 641, // 679: api.v1.SnapshotTargetScope.namespace_selector:type_name -> api.v1.LabelSelector + 642, // 680: api.v1.SnapshotTargetScope.namespace_pattern:type_name -> api.v1.RegexPattern + 641, // 681: api.v1.SnapshotTargetScope.workload_selector:type_name -> api.v1.LabelSelector + 641, // 682: api.v1.SnapshotTargetScope.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 683: api.v1.SnapshotTargetScope.name_pattern:type_name -> api.v1.RegexPattern + 640, // 684: api.v1.SnapshotTargetScope.kind_filter:type_name -> api.v1.K8sObjectKind + 641, // 685: api.v1.SnapshotTargetScope.pod_selector:type_name -> api.v1.LabelSelector + 533, // 686: api.v1.SnapshotPolicyTarget.scope:type_name -> api.v1.SnapshotTargetScope + 637, // 687: api.v1.SnapshotPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 688: api.v1.SnapshotPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 371, // 689: api.v1.SnapshotPolicyTarget.status:type_name -> api.v1.SnapshotPolicyTargetStatus + 533, // 690: api.v1.ForensicSnapshotPolicyTarget.scope:type_name -> api.v1.SnapshotTargetScope + 637, // 691: api.v1.ForensicSnapshotPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 692: api.v1.ForensicSnapshotPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 371, // 693: api.v1.ForensicSnapshotPolicyTarget.status:type_name -> api.v1.SnapshotPolicyTargetStatus + 531, // 694: api.v1.CreateSnapshotPoliciesRequest.policies:type_name -> api.v1.SnapshotPolicy + 531, // 695: api.v1.CreateSnapshotPoliciesResponse.policies:type_name -> api.v1.SnapshotPolicy + 531, // 696: api.v1.ListSnapshotPoliciesResponse.policies:type_name -> api.v1.SnapshotPolicy + 531, // 697: api.v1.UpdateSnapshotPolicyRequest.policy:type_name -> api.v1.SnapshotPolicy + 531, // 698: api.v1.UpdateSnapshotPolicyResponse.policy:type_name -> api.v1.SnapshotPolicy + 534, // 699: api.v1.CreateSnapshotPolicyTargetsRequest.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 700: api.v1.CreateSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 701: api.v1.ListSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 702: api.v1.UpdateSnapshotPolicyTargetRequest.target:type_name -> api.v1.SnapshotPolicyTarget + 534, // 703: api.v1.UpdateSnapshotPolicyTargetResponse.target:type_name -> api.v1.SnapshotPolicyTarget + 532, // 704: api.v1.CreateForensicSnapshotPoliciesRequest.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 705: api.v1.CreateForensicSnapshotPoliciesResponse.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 706: api.v1.ListForensicSnapshotPoliciesResponse.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 707: api.v1.UpdateForensicSnapshotPolicyRequest.policy:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 708: api.v1.UpdateForensicSnapshotPolicyResponse.policy:type_name -> api.v1.ForensicSnapshotPolicy + 535, // 709: api.v1.CreateForensicSnapshotPolicyTargetsRequest.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 710: api.v1.CreateForensicSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 711: api.v1.ListForensicSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 712: api.v1.UpdateForensicSnapshotPolicyTargetRequest.target:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 713: api.v1.UpdateForensicSnapshotPolicyTargetResponse.target:type_name -> api.v1.ForensicSnapshotPolicyTarget + 640, // 714: api.v1.SnapshotResolvedWorkload.kind:type_name -> api.v1.K8sObjectKind + 641, // 715: api.v1.SnapshotResolvedWorkload.pod_selector:type_name -> api.v1.LabelSelector + 570, // 716: api.v1.SnapshotResolvedNamespace.workloads:type_name -> api.v1.SnapshotResolvedWorkload + 571, // 717: api.v1.SnapshotClusterScopePreview.namespaces:type_name -> api.v1.SnapshotResolvedNamespace + 533, // 718: api.v1.PreviewSnapshotPolicyTargetMatchesRequest.scope:type_name -> api.v1.SnapshotTargetScope + 572, // 719: api.v1.PreviewSnapshotPolicyTargetMatchesResponse.clusters:type_name -> api.v1.SnapshotClusterScopePreview + 533, // 720: api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest.scope:type_name -> api.v1.SnapshotTargetScope + 572, // 721: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse.clusters:type_name -> api.v1.SnapshotClusterScopePreview + 575, // 722: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse.overlaps:type_name -> api.v1.ForensicTargetOverlap + 641, // 723: api.v1.SnapshotRenderedScopeRow.pod_selector:type_name -> api.v1.LabelSelector + 570, // 724: api.v1.SnapshotRenderedScopeRow.workloads:type_name -> api.v1.SnapshotResolvedWorkload + 637, // 725: api.v1.SnapshotRenderedScopeRow.updated_at:type_name -> google.protobuf.Timestamp + 578, // 726: api.v1.GetSnapshotPolicyTargetRenderedScopeResponse.rows:type_name -> api.v1.SnapshotRenderedScopeRow + 578, // 727: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse.rows:type_name -> api.v1.SnapshotRenderedScopeRow + 637, // 728: api.v1.SnapshotConfigInfo.created_at:type_name -> google.protobuf.Timestamp + 637, // 729: api.v1.SnapshotConfigInfo.updated_at:type_name -> google.protobuf.Timestamp + 637, // 730: api.v1.SnapshotConfigApplyEventInfo.applied_at:type_name -> google.protobuf.Timestamp + 637, // 731: api.v1.SnapshotConfigApplyEventInfo.created_at:type_name -> google.protobuf.Timestamp + 583, // 732: api.v1.GetSnapshotRecommendationStatusResponse.current_config:type_name -> api.v1.SnapshotConfigInfo + 584, // 733: api.v1.GetSnapshotRecommendationStatusResponse.events:type_name -> api.v1.SnapshotConfigApplyEventInfo + 370, // 734: api.v1.GetSnapshotRecommendationStatusResponse.runtime:type_name -> api.v1.SnapshotCRRuntimeStatus + 372, // 735: api.v1.GetSnapshotRecommendationStatusResponse.prereqs:type_name -> api.v1.SnapshotPrereqs + 583, // 736: api.v1.GetForensicSnapshotRecommendationStatusResponse.current_config:type_name -> api.v1.SnapshotConfigInfo + 584, // 737: api.v1.GetForensicSnapshotRecommendationStatusResponse.events:type_name -> api.v1.SnapshotConfigApplyEventInfo + 370, // 738: api.v1.GetForensicSnapshotRecommendationStatusResponse.runtime:type_name -> api.v1.SnapshotCRRuntimeStatus + 594, // 739: api.v1.ListReferencedAuthenticationsResponse.authentications:type_name -> api.v1.ReferencedAuthentication + 66, // 740: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry.value:type_name -> api.v1.TargetIdList + 114, // 741: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry.value:type_name -> api.v1.WorkloadPercentileSummary + 112, // 742: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry.value:type_name -> api.v1.WorkloadCollisionInfo + 176, // 743: api.v1.AgentHealth.NodeNameToAgentEntry.value:type_name -> api.v1.AgentHealthMeta + 221, // 744: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry.value:type_name -> api.v1.WorkloadPolicyTargetGroup + 196, // 745: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.WorkloadRecommendationPolicy + 643, // 746: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry.value:type_name -> api.v1.WorkloadItem + 193, // 747: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.NodeGroupRecommendationPolicy + 228, // 748: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroupItem + 279, // 749: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry.value:type_name -> api.v1.NodeGroupCheckpointStatus + 289, // 750: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry.value:type_name -> api.v1.NodeRecommendationConfig + 289, // 751: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry.value:type_name -> api.v1.NodeRecommendationConfig + 28, // 752: api.v1.SchedulerRevertEventReport.Event.reason:type_name -> api.v1.SchedulerUnhealthyReason + 637, // 753: api.v1.SchedulerRevertEventReport.Event.occurred_at:type_name -> google.protobuf.Timestamp + 39, // 754: api.v1.K8sRecommendationService.GetNodeGroupStats:input_type -> api.v1.GetNodeGroupStatsRequest + 43, // 755: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:input_type -> api.v1.GetLatestNodeGroupRecommendationRequest + 45, // 756: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:input_type -> api.v1.GetLatestWorkloadRecommendationRequest + 47, // 757: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:input_type -> api.v1.GetPreviewWorkloadRecommendationRequest + 49, // 758: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:input_type -> api.v1.GetPreviewWorkloadRecommendationsRequest + 37, // 759: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:input_type -> api.v1.GetRecommendationsForWorkloadRequest + 35, // 760: api.v1.K8sRecommendationService.GetRecommendations:input_type -> api.v1.GetRecommendationsRequest + 67, // 761: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:input_type -> api.v1.CreateNodeGroupRecommendationPolicyRequest + 69, // 762: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:input_type -> api.v1.GetNodeGroupRecommendationPolicyRequest + 71, // 763: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:input_type -> api.v1.ListNodeGroupRecommendationPoliciesRequest + 73, // 764: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:input_type -> api.v1.UpdateNodeGroupRecommendationPolicyRequest + 75, // 765: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:input_type -> api.v1.DeleteNodeGroupRecommendationPolicyRequest + 77, // 766: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:input_type -> api.v1.AttachNodeGroupRecommendationPolicyRequest + 79, // 767: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:input_type -> api.v1.CreateWorkloadRecommendationPolicyRequest + 81, // 768: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:input_type -> api.v1.GetWorkloadRecommendationPolicyRequest + 197, // 769: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:input_type -> api.v1.GetPolicyRecommendedDefaultsRequest + 83, // 770: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:input_type -> api.v1.ListWorkloadRecommendationPoliciesRequest + 85, // 771: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:input_type -> api.v1.UpdateWorkloadRecommendationPolicyRequest + 87, // 772: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:input_type -> api.v1.DeleteWorkloadRecommendationPolicyRequest + 89, // 773: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:input_type -> api.v1.AttachWorkloadRecommendationPolicyRequest + 91, // 774: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:input_type -> api.v1.AttachWorkloadRecommendationPoliciesRequest + 95, // 775: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:input_type -> api.v1.CreateWorkloadPolicyTargetRequest + 97, // 776: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:input_type -> api.v1.GetWorkloadPolicyTargetRequest + 99, // 777: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:input_type -> api.v1.ListWorkloadPolicyTargetsRequest + 101, // 778: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:input_type -> api.v1.UpdateWorkloadPolicyTargetRequest + 103, // 779: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:input_type -> api.v1.DeleteWorkloadPolicyTargetRequest + 104, // 780: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:input_type -> api.v1.ToggleWorkloadPolicyTargetsRequest + 109, // 781: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:input_type -> api.v1.PreviewWorkloadPolicyTargetMatchesRequest + 111, // 782: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:input_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest + 64, // 783: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:input_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest + 116, // 784: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:input_type -> api.v1.CreateNodeGroupPolicyTargetRequest + 118, // 785: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:input_type -> api.v1.GetNodeGroupPolicyTargetRequest + 120, // 786: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:input_type -> api.v1.ListNodeGroupPolicyTargetsRequest + 122, // 787: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:input_type -> api.v1.UpdateNodeGroupPolicyTargetRequest + 124, // 788: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:input_type -> api.v1.DeleteNodeGroupPolicyTargetRequest + 125, // 789: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:input_type -> api.v1.ToggleNodeGroupPolicyTargetsRequest + 128, // 790: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:input_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesRequest + 130, // 791: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:input_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest + 132, // 792: api.v1.K8sRecommendationService.BalanceGetRecommendations:input_type -> api.v1.BalanceGetRecommendationsRequest + 41, // 793: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:input_type -> api.v1.GetOptimalInstanceTypeForNodeGroupRequest + 216, // 794: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:input_type -> api.v1.GetAttachedNodeGroupPoliciesRequest + 218, // 795: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:input_type -> api.v1.GetAttachedWorkloadPoliciesRequest + 303, // 796: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:input_type -> api.v1.SearchResourcesByTargetingFiltersRequest + 302, // 797: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:input_type -> api.v1.GetAvailableKindsByTargetingFiltersRequest + 224, // 798: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:input_type -> api.v1.ListAttachedWorkloadPoliciesRequest + 226, // 799: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:input_type -> api.v1.ListAttachedNodeGroupPoliciesRequest + 233, // 800: api.v1.K8sRecommendationService.RecommendationEvents:input_type -> api.v1.RecommendationEventsRequest + 231, // 801: api.v1.K8sRecommendationService.ApplyRecommendation:input_type -> api.v1.ApplyRecommendationRequest + 229, // 802: api.v1.K8sRecommendationService.RecommendationApplied:input_type -> api.v1.RecommendationAppliedRequest + 235, // 803: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:input_type -> api.v1.RetrieveSavingsForWorkloadRequest + 237, // 804: api.v1.K8sRecommendationService.CreateNodePolicies:input_type -> api.v1.CreateNodePoliciesRequest + 275, // 805: api.v1.K8sRecommendationService.ListNodePolicies:input_type -> api.v1.ListNodePoliciesRequest + 277, // 806: api.v1.K8sRecommendationService.UpdateNodePolicy:input_type -> api.v1.UpdateNodePolicyRequest + 284, // 807: api.v1.K8sRecommendationService.DeleteNodePolicy:input_type -> api.v1.DeleteNodePolicyRequest + 239, // 808: api.v1.K8sRecommendationService.SuggestedNodePolicy:input_type -> api.v1.SuggestedNodePolicyRequest + 290, // 809: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:input_type -> api.v1.SuggestedKarpenterConfigRequest + 292, // 810: api.v1.K8sRecommendationService.SuggestNodePolicyImprovements:input_type -> api.v1.SuggestNodePolicyImprovementsRequest + 294, // 811: api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions:input_type -> api.v1.ListClusterNodePolicySuggestionsRequest + 241, // 812: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:input_type -> api.v1.GenerateNodePoliciesFromKarpenterRequest + 243, // 813: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:input_type -> api.v1.GenerateNodePoliciesFromNodeGroupsRequest + 280, // 814: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:input_type -> api.v1.GetNodeGroupsCheckpointStatusRequest + 282, // 815: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:input_type -> api.v1.SetNodePolicyCheckpointLabelRequest + 512, // 816: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:input_type -> api.v1.EnableCheckpointForPolicyRequest + 514, // 817: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:input_type -> api.v1.GetCheckpointApplyStatusRequest + 517, // 818: api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage:input_type -> api.v1.GetClusterCheckpointLabelCoverageRequest + 520, // 819: api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState:input_type -> api.v1.ListNodeGroupCheckpointLabelStateRequest + 246, // 820: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:input_type -> api.v1.GetNodeAnnotationReadinessRequest + 248, // 821: api.v1.K8sRecommendationService.DetectClusterAutoscaler:input_type -> api.v1.DetectClusterAutoscalerRequest + 250, // 822: api.v1.K8sRecommendationService.GetMigrationState:input_type -> api.v1.GetMigrationStateRequest + 252, // 823: api.v1.K8sRecommendationService.UpdateMigrationState:input_type -> api.v1.UpdateMigrationStateRequest + 254, // 824: api.v1.K8sRecommendationService.GetKarpenterMigrationState:input_type -> api.v1.GetKarpenterMigrationStateRequest + 256, // 825: api.v1.K8sRecommendationService.UpdateKarpenterMigrationState:input_type -> api.v1.UpdateKarpenterMigrationStateRequest + 259, // 826: api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts:input_type -> api.v1.DetectKarpenterOwnershipConflictsRequest + 261, // 827: api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict:input_type -> api.v1.AcknowledgeKarpenterOwnershipConflictRequest + 264, // 828: api.v1.K8sRecommendationService.GetKarpenterSourceResources:input_type -> api.v1.GetKarpenterSourceResourcesRequest + 267, // 829: api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus:input_type -> api.v1.GetKarpenterAdoptionStatusRequest + 269, // 830: api.v1.K8sRecommendationService.ReportNodePoolValidation:input_type -> api.v1.ReportNodePoolValidationRequest + 271, // 831: api.v1.K8sRecommendationService.GetNodePoolValidations:input_type -> api.v1.GetNodePoolValidationsRequest + 311, // 832: api.v1.K8sRecommendationService.CreateNodePolicyTargets:input_type -> api.v1.CreateNodePolicyTargetsRequest + 313, // 833: api.v1.K8sRecommendationService.ListNodePolicyTargets:input_type -> api.v1.ListNodePolicyTargetsRequest + 315, // 834: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:input_type -> api.v1.UpdateNodePolicyTargetRequest + 287, // 835: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:input_type -> api.v1.PreviewNodeRecommendationConfigRequest + 326, // 836: api.v1.K8sRecommendationService.GetInstanceFamilies:input_type -> api.v1.GetInstanceFamiliesRequest + 328, // 837: api.v1.K8sRecommendationService.GetInstanceSizes:input_type -> api.v1.GetInstanceSizesRequest + 338, // 838: api.v1.K8sRecommendationService.GetInstanceCategories:input_type -> api.v1.GetInstanceCategoriesRequest + 330, // 839: api.v1.K8sRecommendationService.GetInstanceShapes:input_type -> api.v1.GetInstanceShapesRequest + 340, // 840: api.v1.K8sRecommendationService.GetInstanceCPUs:input_type -> api.v1.GetInstanceCPUsRequest + 342, // 841: api.v1.K8sRecommendationService.GetInstanceTypeNames:input_type -> api.v1.GetInstanceTypeNamesRequest + 160, // 842: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:input_type -> api.v1.GeneratePodDisruptionBudgetRequest + 162, // 843: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:input_type -> api.v1.GenerateAndCreatePodDisruptionBudgetRequest + 164, // 844: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:input_type -> api.v1.CreatePodDisruptionBudgetRequest + 166, // 845: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:input_type -> api.v1.GetPDBRecommendationForWorkloadRequest + 170, // 846: api.v1.K8sRecommendationService.ListWorkloadStructuralHealth:input_type -> api.v1.ListWorkloadStructuralHealthRequest + 384, // 847: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:input_type -> api.v1.CreateStorageRecommendationPolicyRequest + 386, // 848: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:input_type -> api.v1.GetStorageRecommendationPolicyRequest + 388, // 849: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:input_type -> api.v1.ListStorageRecommendationPoliciesRequest + 390, // 850: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:input_type -> api.v1.UpdateStorageRecommendationPolicyRequest + 392, // 851: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:input_type -> api.v1.DeleteStorageRecommendationPolicyRequest + 395, // 852: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:input_type -> api.v1.CreateStoragePolicyTargetRequest + 397, // 853: api.v1.K8sRecommendationService.ListStoragePolicyTargets:input_type -> api.v1.ListStoragePolicyTargetsRequest + 399, // 854: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:input_type -> api.v1.UpdateStoragePolicyTargetRequest + 401, // 855: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:input_type -> api.v1.DeleteStoragePolicyTargetRequest + 404, // 856: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:input_type -> api.v1.GetPvcStorageRecommendationRequest + 406, // 857: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:input_type -> api.v1.ListPvcStorageRecommendationsRequest + 408, // 858: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:input_type -> api.v1.GeneratePvcStorageRecommendationRequest + 410, // 859: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:input_type -> api.v1.PreviewPvcStorageRecommendationRequest + 413, // 860: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:input_type -> api.v1.ListWorkloadRuleOOMEventsRequest + 415, // 861: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:input_type -> api.v1.ListWorkloadOOMEventsRequest + 418, // 862: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:input_type -> api.v1.ListWorkloadRuleCPUThrottleEventsRequest + 420, // 863: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:input_type -> api.v1.ListWorkloadCPUThrottleEventsRequest + 107, // 864: api.v1.K8sRecommendationService.RemoveClusterOptimizations:input_type -> api.v1.RemoveClusterOptimizationsRequest + 425, // 865: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:input_type -> api.v1.CreateWorkloadOptimizationPolicyRequest + 427, // 866: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:input_type -> api.v1.ListWorkloadOptimizationPoliciesRequest + 429, // 867: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:input_type -> api.v1.GetWorkloadOptimizationPolicyRequest + 431, // 868: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload:input_type -> api.v1.GetWorkloadOptimizationPolicyByWorkloadRequest + 433, // 869: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:input_type -> api.v1.UpdateWorkloadOptimizationPolicyRequest + 434, // 870: api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled:input_type -> api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest + 437, // 871: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:input_type -> api.v1.DeleteWorkloadOptimizationPolicyRequest + 439, // 872: api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches:input_type -> api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest + 444, // 873: api.v1.K8sRecommendationService.CreateSchedulerPolicy:input_type -> api.v1.CreateSchedulerPolicyRequest + 446, // 874: api.v1.K8sRecommendationService.ListSchedulerPolicies:input_type -> api.v1.ListSchedulerPoliciesRequest + 448, // 875: api.v1.K8sRecommendationService.UpdateSchedulerPolicy:input_type -> api.v1.UpdateSchedulerPolicyRequest + 450, // 876: api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled:input_type -> api.v1.ToggleSchedulerPolicyDisabledRequest + 452, // 877: api.v1.K8sRecommendationService.DeleteSchedulerPolicy:input_type -> api.v1.DeleteSchedulerPolicyRequest + 454, // 878: api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets:input_type -> api.v1.PreviewSchedulerPolicyTargetsRequest + 457, // 879: api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments:input_type -> api.v1.ListSchedulerPolicyEnrollmentsRequest + 486, // 880: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:input_type -> api.v1.UpsertManualWorkloadRuleRequest + 488, // 881: api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled:input_type -> api.v1.ToggleWorkloadRuleDisabledRequest + 490, // 882: api.v1.K8sRecommendationService.PreviewWorkloadRule:input_type -> api.v1.PreviewWorkloadRuleRequest + 465, // 883: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:input_type -> api.v1.GetWorkloadRulesByPolicyRequest + 467, // 884: api.v1.K8sRecommendationService.ListWorkloadRules:input_type -> api.v1.ListWorkloadRulesRequest + 469, // 885: api.v1.K8sRecommendationService.GetWorkloadRuleByID:input_type -> api.v1.GetWorkloadRuleByIDRequest + 471, // 886: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:input_type -> api.v1.GetWorkloadRuleByWorkloadRequest + 473, // 887: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:input_type -> api.v1.GetWorkloadByWorkloadRuleRequest + 475, // 888: api.v1.K8sRecommendationService.DeleteWorkloadRule:input_type -> api.v1.DeleteWorkloadRuleRequest + 477, // 889: api.v1.K8sRecommendationService.DeleteAllWorkloadRules:input_type -> api.v1.DeleteAllWorkloadRulesRequest + 479, // 890: api.v1.K8sRecommendationService.BulkDeleteWorkloadRules:input_type -> api.v1.BulkDeleteWorkloadRulesRequest + 481, // 891: api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled:input_type -> api.v1.BulkToggleWorkloadRulesDisabledRequest + 492, // 892: api.v1.K8sRecommendationService.GetWorkloadContainerNames:input_type -> api.v1.GetWorkloadContainerNamesRequest + 495, // 893: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:input_type -> api.v1.BatchAutoOptimizeWorkloadsRequest + 499, // 894: api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules:input_type -> api.v1.BatchUpsertManualWorkloadRulesRequest + 502, // 895: api.v1.K8sRecommendationService.BatchPreviewWorkloadRules:input_type -> api.v1.BatchPreviewWorkloadRulesRequest + 505, // 896: api.v1.K8sRecommendationService.ApplyOneTimeOptimization:input_type -> api.v1.ApplyOneTimeOptimizationRequest + 483, // 897: api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation:input_type -> api.v1.DeleteRuleAndApplyRecommendationRequest + 510, // 898: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:input_type -> api.v1.GetNodeRecommendationStatusRequest + 536, // 899: api.v1.K8sRecommendationService.CreateSnapshotPolicies:input_type -> api.v1.CreateSnapshotPoliciesRequest + 538, // 900: api.v1.K8sRecommendationService.ListSnapshotPolicies:input_type -> api.v1.ListSnapshotPoliciesRequest + 540, // 901: api.v1.K8sRecommendationService.UpdateSnapshotPolicy:input_type -> api.v1.UpdateSnapshotPolicyRequest + 542, // 902: api.v1.K8sRecommendationService.DeleteSnapshotPolicy:input_type -> api.v1.DeleteSnapshotPolicyRequest + 544, // 903: api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets:input_type -> api.v1.CreateSnapshotPolicyTargetsRequest + 546, // 904: api.v1.K8sRecommendationService.ListSnapshotPolicyTargets:input_type -> api.v1.ListSnapshotPolicyTargetsRequest + 548, // 905: api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget:input_type -> api.v1.UpdateSnapshotPolicyTargetRequest + 550, // 906: api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget:input_type -> api.v1.DeleteSnapshotPolicyTargetRequest + 552, // 907: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies:input_type -> api.v1.CreateForensicSnapshotPoliciesRequest + 554, // 908: api.v1.K8sRecommendationService.ListForensicSnapshotPolicies:input_type -> api.v1.ListForensicSnapshotPoliciesRequest + 556, // 909: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy:input_type -> api.v1.UpdateForensicSnapshotPolicyRequest + 558, // 910: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy:input_type -> api.v1.DeleteForensicSnapshotPolicyRequest + 560, // 911: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets:input_type -> api.v1.CreateForensicSnapshotPolicyTargetsRequest + 562, // 912: api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets:input_type -> api.v1.ListForensicSnapshotPolicyTargetsRequest + 564, // 913: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget:input_type -> api.v1.UpdateForensicSnapshotPolicyTargetRequest + 566, // 914: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget:input_type -> api.v1.DeleteForensicSnapshotPolicyTargetRequest + 568, // 915: api.v1.K8sRecommendationService.TriggerForensicSnapshotRun:input_type -> api.v1.TriggerForensicSnapshotRunRequest + 593, // 916: api.v1.K8sRecommendationService.ListReferencedAuthentications:input_type -> api.v1.ListReferencedAuthenticationsRequest + 573, // 917: api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches:input_type -> api.v1.PreviewSnapshotPolicyTargetMatchesRequest + 576, // 918: api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches:input_type -> api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest + 579, // 919: api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope:input_type -> api.v1.GetSnapshotPolicyTargetRenderedScopeRequest + 581, // 920: api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope:input_type -> api.v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest + 585, // 921: api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus:input_type -> api.v1.GetSnapshotRecommendationStatusRequest + 587, // 922: api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus:input_type -> api.v1.GetForensicSnapshotRecommendationStatusRequest + 589, // 923: api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig:input_type -> api.v1.PreviewSnapshotRecommendationConfigRequest + 591, // 924: api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig:input_type -> api.v1.PreviewForensicSnapshotRecommendationConfigRequest + 40, // 925: api.v1.K8sRecommendationService.GetNodeGroupStats:output_type -> api.v1.GetNodeGroupStatsResponse + 44, // 926: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:output_type -> api.v1.GetLatestNodeGroupRecommendationResponse + 46, // 927: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:output_type -> api.v1.GetLatestWorkloadRecommendationResponse + 48, // 928: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:output_type -> api.v1.GetPreviewWorkloadRecommendationResponse + 51, // 929: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:output_type -> api.v1.GetPreviewWorkloadRecommendationsResponse + 38, // 930: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:output_type -> api.v1.GetRecommendationsForWorkloadResponse + 36, // 931: api.v1.K8sRecommendationService.GetRecommendations:output_type -> api.v1.GetRecommendationsResponse + 68, // 932: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:output_type -> api.v1.CreateNodeGroupRecommendationPolicyResponse + 70, // 933: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:output_type -> api.v1.GetNodeGroupRecommendationPolicyResponse + 72, // 934: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:output_type -> api.v1.ListNodeGroupRecommendationPoliciesResponse + 74, // 935: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:output_type -> api.v1.UpdateNodeGroupRecommendationPolicyResponse + 76, // 936: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:output_type -> api.v1.DeleteNodeGroupRecommendationPolicyResponse + 78, // 937: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:output_type -> api.v1.AttachNodeGroupRecommendationPolicyResponse + 80, // 938: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:output_type -> api.v1.CreateWorkloadRecommendationPolicyResponse + 82, // 939: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:output_type -> api.v1.GetWorkloadRecommendationPolicyResponse + 198, // 940: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:output_type -> api.v1.GetPolicyRecommendedDefaultsResponse + 84, // 941: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:output_type -> api.v1.ListWorkloadRecommendationPoliciesResponse + 86, // 942: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:output_type -> api.v1.UpdateWorkloadRecommendationPolicyResponse + 88, // 943: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:output_type -> api.v1.DeleteWorkloadRecommendationPolicyResponse + 90, // 944: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:output_type -> api.v1.AttachWorkloadRecommendationPolicyResponse + 92, // 945: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:output_type -> api.v1.AttachWorkloadRecommendationPoliciesResponse + 96, // 946: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:output_type -> api.v1.CreateWorkloadPolicyTargetResponse + 98, // 947: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:output_type -> api.v1.GetWorkloadPolicyTargetResponse + 100, // 948: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:output_type -> api.v1.ListWorkloadPolicyTargetsResponse + 102, // 949: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:output_type -> api.v1.UpdateWorkloadPolicyTargetResponse + 106, // 950: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:output_type -> api.v1.DeleteWorkloadPolicyTargetResponse + 105, // 951: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:output_type -> api.v1.ToggleWorkloadPolicyTargetsResponse + 110, // 952: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:output_type -> api.v1.PreviewWorkloadPolicyTargetMatchesResponse + 113, // 953: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:output_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse + 65, // 954: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:output_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse + 117, // 955: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:output_type -> api.v1.CreateNodeGroupPolicyTargetResponse + 119, // 956: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:output_type -> api.v1.GetNodeGroupPolicyTargetResponse + 121, // 957: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:output_type -> api.v1.ListNodeGroupPolicyTargetsResponse + 123, // 958: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:output_type -> api.v1.UpdateNodeGroupPolicyTargetResponse + 127, // 959: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:output_type -> api.v1.DeleteNodeGroupPolicyTargetResponse + 126, // 960: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:output_type -> api.v1.ToggleNodeGroupPolicyTargetsResponse + 129, // 961: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:output_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesResponse + 131, // 962: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:output_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse + 133, // 963: api.v1.K8sRecommendationService.BalanceGetRecommendations:output_type -> api.v1.BalanceGetRecommendationsResponse + 42, // 964: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:output_type -> api.v1.GetOptimalInstanceTypeForNodeGroupResponse + 217, // 965: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:output_type -> api.v1.GetAttachedNodeGroupPoliciesResponse + 219, // 966: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:output_type -> api.v1.GetAttachedWorkloadPoliciesResponse + 306, // 967: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:output_type -> api.v1.SearchResourcesByTargetingFiltersResponse + 305, // 968: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:output_type -> api.v1.GetAvailableKindsByTargetingFiltersResponse + 225, // 969: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:output_type -> api.v1.ListAttachedWorkloadPoliciesResponse + 227, // 970: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:output_type -> api.v1.ListAttachedNodeGroupPoliciesResponse + 234, // 971: api.v1.K8sRecommendationService.RecommendationEvents:output_type -> api.v1.RecommendationEventsResponse + 232, // 972: api.v1.K8sRecommendationService.ApplyRecommendation:output_type -> api.v1.ApplyRecommendationResponse + 230, // 973: api.v1.K8sRecommendationService.RecommendationApplied:output_type -> api.v1.RecommendationAppliedResponse + 236, // 974: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:output_type -> api.v1.RetrieveSavingsForWorkloadResponse + 238, // 975: api.v1.K8sRecommendationService.CreateNodePolicies:output_type -> api.v1.CreateNodePoliciesResponse + 276, // 976: api.v1.K8sRecommendationService.ListNodePolicies:output_type -> api.v1.ListNodePoliciesResponse + 278, // 977: api.v1.K8sRecommendationService.UpdateNodePolicy:output_type -> api.v1.UpdateNodePolicyResponse + 285, // 978: api.v1.K8sRecommendationService.DeleteNodePolicy:output_type -> api.v1.DeleteNodePolicyResponse + 240, // 979: api.v1.K8sRecommendationService.SuggestedNodePolicy:output_type -> api.v1.SuggestedNodePolicyResponse + 291, // 980: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:output_type -> api.v1.SuggestedKarpenterConfigResponse + 293, // 981: api.v1.K8sRecommendationService.SuggestNodePolicyImprovements:output_type -> api.v1.SuggestNodePolicyImprovementsResponse + 295, // 982: api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions:output_type -> api.v1.ListClusterNodePolicySuggestionsResponse + 242, // 983: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:output_type -> api.v1.GenerateNodePoliciesFromKarpenterResponse + 244, // 984: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:output_type -> api.v1.GenerateNodePoliciesFromNodeGroupsResponse + 281, // 985: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:output_type -> api.v1.GetNodeGroupsCheckpointStatusResponse + 283, // 986: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:output_type -> api.v1.SetNodePolicyCheckpointLabelResponse + 513, // 987: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:output_type -> api.v1.EnableCheckpointForPolicyResponse + 515, // 988: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:output_type -> api.v1.GetCheckpointApplyStatusResponse + 519, // 989: api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage:output_type -> api.v1.GetClusterCheckpointLabelCoverageResponse + 522, // 990: api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState:output_type -> api.v1.ListNodeGroupCheckpointLabelStateResponse + 247, // 991: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:output_type -> api.v1.GetNodeAnnotationReadinessResponse + 249, // 992: api.v1.K8sRecommendationService.DetectClusterAutoscaler:output_type -> api.v1.DetectClusterAutoscalerResponse + 251, // 993: api.v1.K8sRecommendationService.GetMigrationState:output_type -> api.v1.GetMigrationStateResponse + 253, // 994: api.v1.K8sRecommendationService.UpdateMigrationState:output_type -> api.v1.UpdateMigrationStateResponse + 255, // 995: api.v1.K8sRecommendationService.GetKarpenterMigrationState:output_type -> api.v1.GetKarpenterMigrationStateResponse + 257, // 996: api.v1.K8sRecommendationService.UpdateKarpenterMigrationState:output_type -> api.v1.UpdateKarpenterMigrationStateResponse + 260, // 997: api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts:output_type -> api.v1.DetectKarpenterOwnershipConflictsResponse + 262, // 998: api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict:output_type -> api.v1.AcknowledgeKarpenterOwnershipConflictResponse + 265, // 999: api.v1.K8sRecommendationService.GetKarpenterSourceResources:output_type -> api.v1.GetKarpenterSourceResourcesResponse + 268, // 1000: api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus:output_type -> api.v1.GetKarpenterAdoptionStatusResponse + 270, // 1001: api.v1.K8sRecommendationService.ReportNodePoolValidation:output_type -> api.v1.ReportNodePoolValidationResponse + 273, // 1002: api.v1.K8sRecommendationService.GetNodePoolValidations:output_type -> api.v1.GetNodePoolValidationsResponse + 312, // 1003: api.v1.K8sRecommendationService.CreateNodePolicyTargets:output_type -> api.v1.CreateNodePolicyTargetsResponse + 314, // 1004: api.v1.K8sRecommendationService.ListNodePolicyTargets:output_type -> api.v1.ListNodePolicyTargetsResponse + 316, // 1005: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:output_type -> api.v1.UpdateNodePolicyTargetResponse + 288, // 1006: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:output_type -> api.v1.PreviewNodeRecommendationConfigResponse + 327, // 1007: api.v1.K8sRecommendationService.GetInstanceFamilies:output_type -> api.v1.GetInstanceFamiliesResponse + 329, // 1008: api.v1.K8sRecommendationService.GetInstanceSizes:output_type -> api.v1.GetInstanceSizesResponse + 339, // 1009: api.v1.K8sRecommendationService.GetInstanceCategories:output_type -> api.v1.GetInstanceCategoriesResponse + 331, // 1010: api.v1.K8sRecommendationService.GetInstanceShapes:output_type -> api.v1.GetInstanceShapesResponse + 341, // 1011: api.v1.K8sRecommendationService.GetInstanceCPUs:output_type -> api.v1.GetInstanceCPUsResponse + 343, // 1012: api.v1.K8sRecommendationService.GetInstanceTypeNames:output_type -> api.v1.GetInstanceTypeNamesResponse + 161, // 1013: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:output_type -> api.v1.GeneratePodDisruptionBudgetResponse + 163, // 1014: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:output_type -> api.v1.GenerateAndCreatePodDisruptionBudgetResponse + 165, // 1015: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:output_type -> api.v1.CreatePodDisruptionBudgetResponse + 167, // 1016: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:output_type -> api.v1.GetPDBRecommendationForWorkloadResponse + 171, // 1017: api.v1.K8sRecommendationService.ListWorkloadStructuralHealth:output_type -> api.v1.ListWorkloadStructuralHealthResponse + 385, // 1018: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:output_type -> api.v1.CreateStorageRecommendationPolicyResponse + 387, // 1019: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:output_type -> api.v1.GetStorageRecommendationPolicyResponse + 389, // 1020: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:output_type -> api.v1.ListStorageRecommendationPoliciesResponse + 391, // 1021: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:output_type -> api.v1.UpdateStorageRecommendationPolicyResponse + 393, // 1022: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:output_type -> api.v1.DeleteStorageRecommendationPolicyResponse + 396, // 1023: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:output_type -> api.v1.CreateStoragePolicyTargetResponse + 398, // 1024: api.v1.K8sRecommendationService.ListStoragePolicyTargets:output_type -> api.v1.ListStoragePolicyTargetsResponse + 400, // 1025: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:output_type -> api.v1.UpdateStoragePolicyTargetResponse + 402, // 1026: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:output_type -> api.v1.DeleteStoragePolicyTargetResponse + 405, // 1027: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:output_type -> api.v1.GetPvcStorageRecommendationResponse + 407, // 1028: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:output_type -> api.v1.ListPvcStorageRecommendationsResponse + 409, // 1029: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:output_type -> api.v1.GeneratePvcStorageRecommendationResponse + 411, // 1030: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:output_type -> api.v1.PreviewPvcStorageRecommendationResponse + 414, // 1031: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:output_type -> api.v1.ListWorkloadRuleOOMEventsResponse + 416, // 1032: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:output_type -> api.v1.ListWorkloadOOMEventsResponse + 419, // 1033: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:output_type -> api.v1.ListWorkloadRuleCPUThrottleEventsResponse + 421, // 1034: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:output_type -> api.v1.ListWorkloadCPUThrottleEventsResponse + 108, // 1035: api.v1.K8sRecommendationService.RemoveClusterOptimizations:output_type -> api.v1.RemoveClusterOptimizationsResponse + 426, // 1036: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:output_type -> api.v1.CreateWorkloadOptimizationPolicyResponse + 428, // 1037: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:output_type -> api.v1.ListWorkloadOptimizationPoliciesResponse + 430, // 1038: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:output_type -> api.v1.GetWorkloadOptimizationPolicyResponse + 432, // 1039: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload:output_type -> api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse + 436, // 1040: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:output_type -> api.v1.UpdateWorkloadOptimizationPolicyResponse + 435, // 1041: api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled:output_type -> api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse + 438, // 1042: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:output_type -> api.v1.DeleteWorkloadOptimizationPolicyResponse + 441, // 1043: api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches:output_type -> api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse + 445, // 1044: api.v1.K8sRecommendationService.CreateSchedulerPolicy:output_type -> api.v1.CreateSchedulerPolicyResponse + 447, // 1045: api.v1.K8sRecommendationService.ListSchedulerPolicies:output_type -> api.v1.ListSchedulerPoliciesResponse + 449, // 1046: api.v1.K8sRecommendationService.UpdateSchedulerPolicy:output_type -> api.v1.UpdateSchedulerPolicyResponse + 451, // 1047: api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled:output_type -> api.v1.ToggleSchedulerPolicyDisabledResponse + 453, // 1048: api.v1.K8sRecommendationService.DeleteSchedulerPolicy:output_type -> api.v1.DeleteSchedulerPolicyResponse + 456, // 1049: api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets:output_type -> api.v1.PreviewSchedulerPolicyTargetsResponse + 459, // 1050: api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments:output_type -> api.v1.ListSchedulerPolicyEnrollmentsResponse + 487, // 1051: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:output_type -> api.v1.UpsertManualWorkloadRuleResponse + 489, // 1052: api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled:output_type -> api.v1.ToggleWorkloadRuleDisabledResponse + 491, // 1053: api.v1.K8sRecommendationService.PreviewWorkloadRule:output_type -> api.v1.PreviewWorkloadRuleResponse + 466, // 1054: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:output_type -> api.v1.GetWorkloadRulesByPolicyResponse + 468, // 1055: api.v1.K8sRecommendationService.ListWorkloadRules:output_type -> api.v1.ListWorkloadRulesResponse + 470, // 1056: api.v1.K8sRecommendationService.GetWorkloadRuleByID:output_type -> api.v1.GetWorkloadRuleByIDResponse + 472, // 1057: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:output_type -> api.v1.GetWorkloadRuleByWorkloadResponse + 474, // 1058: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:output_type -> api.v1.GetWorkloadByWorkloadRuleResponse + 476, // 1059: api.v1.K8sRecommendationService.DeleteWorkloadRule:output_type -> api.v1.DeleteWorkloadRuleResponse + 478, // 1060: api.v1.K8sRecommendationService.DeleteAllWorkloadRules:output_type -> api.v1.DeleteAllWorkloadRulesResponse + 480, // 1061: api.v1.K8sRecommendationService.BulkDeleteWorkloadRules:output_type -> api.v1.BulkDeleteWorkloadRulesResponse + 482, // 1062: api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled:output_type -> api.v1.BulkToggleWorkloadRulesDisabledResponse + 493, // 1063: api.v1.K8sRecommendationService.GetWorkloadContainerNames:output_type -> api.v1.GetWorkloadContainerNamesResponse + 497, // 1064: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:output_type -> api.v1.BatchAutoOptimizeWorkloadsResponse + 501, // 1065: api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules:output_type -> api.v1.BatchUpsertManualWorkloadRulesResponse + 504, // 1066: api.v1.K8sRecommendationService.BatchPreviewWorkloadRules:output_type -> api.v1.BatchPreviewWorkloadRulesResponse + 506, // 1067: api.v1.K8sRecommendationService.ApplyOneTimeOptimization:output_type -> api.v1.ApplyOneTimeOptimizationResponse + 484, // 1068: api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation:output_type -> api.v1.DeleteRuleAndApplyRecommendationResponse + 511, // 1069: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:output_type -> api.v1.GetNodeRecommendationStatusResponse + 537, // 1070: api.v1.K8sRecommendationService.CreateSnapshotPolicies:output_type -> api.v1.CreateSnapshotPoliciesResponse + 539, // 1071: api.v1.K8sRecommendationService.ListSnapshotPolicies:output_type -> api.v1.ListSnapshotPoliciesResponse + 541, // 1072: api.v1.K8sRecommendationService.UpdateSnapshotPolicy:output_type -> api.v1.UpdateSnapshotPolicyResponse + 543, // 1073: api.v1.K8sRecommendationService.DeleteSnapshotPolicy:output_type -> api.v1.DeleteSnapshotPolicyResponse + 545, // 1074: api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets:output_type -> api.v1.CreateSnapshotPolicyTargetsResponse + 547, // 1075: api.v1.K8sRecommendationService.ListSnapshotPolicyTargets:output_type -> api.v1.ListSnapshotPolicyTargetsResponse + 549, // 1076: api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget:output_type -> api.v1.UpdateSnapshotPolicyTargetResponse + 551, // 1077: api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget:output_type -> api.v1.DeleteSnapshotPolicyTargetResponse + 553, // 1078: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies:output_type -> api.v1.CreateForensicSnapshotPoliciesResponse + 555, // 1079: api.v1.K8sRecommendationService.ListForensicSnapshotPolicies:output_type -> api.v1.ListForensicSnapshotPoliciesResponse + 557, // 1080: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy:output_type -> api.v1.UpdateForensicSnapshotPolicyResponse + 559, // 1081: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy:output_type -> api.v1.DeleteForensicSnapshotPolicyResponse + 561, // 1082: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets:output_type -> api.v1.CreateForensicSnapshotPolicyTargetsResponse + 563, // 1083: api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets:output_type -> api.v1.ListForensicSnapshotPolicyTargetsResponse + 565, // 1084: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget:output_type -> api.v1.UpdateForensicSnapshotPolicyTargetResponse + 567, // 1085: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget:output_type -> api.v1.DeleteForensicSnapshotPolicyTargetResponse + 569, // 1086: api.v1.K8sRecommendationService.TriggerForensicSnapshotRun:output_type -> api.v1.TriggerForensicSnapshotRunResponse + 595, // 1087: api.v1.K8sRecommendationService.ListReferencedAuthentications:output_type -> api.v1.ListReferencedAuthenticationsResponse + 574, // 1088: api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches:output_type -> api.v1.PreviewSnapshotPolicyTargetMatchesResponse + 577, // 1089: api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches:output_type -> api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse + 580, // 1090: api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope:output_type -> api.v1.GetSnapshotPolicyTargetRenderedScopeResponse + 582, // 1091: api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope:output_type -> api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse + 586, // 1092: api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus:output_type -> api.v1.GetSnapshotRecommendationStatusResponse + 588, // 1093: api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus:output_type -> api.v1.GetForensicSnapshotRecommendationStatusResponse + 590, // 1094: api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig:output_type -> api.v1.PreviewSnapshotRecommendationConfigResponse + 592, // 1095: api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig:output_type -> api.v1.PreviewForensicSnapshotRecommendationConfigResponse + 925, // [925:1096] is the sub-list for method output_type + 754, // [754:925] is the sub-list for method input_type + 754, // [754:754] is the sub-list for extension type_name + 754, // [754:754] is the sub-list for extension extendee + 0, // [0:754] is the sub-list for field type_name } func init() { file_api_v1_recommendation_proto_init() } @@ -35935,6 +57276,7 @@ func file_api_v1_recommendation_proto_init() { file_api_v1_common_proto_init() file_api_v1_instance_proto_init() file_api_v1_k8s_proto_init() + file_api_v1_hpa_connector_proto_init() file_api_v1_profiling_proto_init() if !protoimpl.UnsafeEnabled { file_api_v1_recommendation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { @@ -35949,8 +57291,1976 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupStatsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupStatsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOptimalInstanceTypeForNodeGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOptimalInstanceTypeForNodeGroupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestNodeGroupRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestNodeGroupRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestWorkloadRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestWorkloadRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadIdentifier); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TargetIdList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyAttachment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveClusterOptimizationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveClusterOptimizationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadPolicyTargetMatchesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadPolicyTargetMatchesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadCollisionInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPercentileSummary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupPolicyTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleNodeGroupPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleNodeGroupPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeGroupPolicyTargetMatchesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeGroupPolicyTargetMatchesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceGetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceGetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchNodeGroupRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAMetricTrigger); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAFallback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerResourceConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerResourceRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JVMHeapRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPARuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EmergencyResponseConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAScaledObjectTemplate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDATrigger); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAAuthenticationRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAFallback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAAdvanced); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PercentileValues); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourcePercentiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BurstinessRatios); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadClassification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadRules); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchHPAConnectors); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadWithActiveRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericResourceRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchGenericResourceRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPvcStorageRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateAndCreatePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateAndCreatePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPDBRecommendationForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPDBRecommendationForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StructuralHealthFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadStructuralHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadStructuralHealthRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadStructuralHealthResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReconcileWorkload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReconcileResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OperatorHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentHealthMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HealthReport); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerSummarizedMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KedaScaledObjectRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvVarMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandArgMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeSelectorMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TolerationMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Toleration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterRecommendationPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupRecommendationPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VerticalScalingOptimizationTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HorizontalScalingOptimizationTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendationPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPolicyRecommendedDefaultsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPolicyRecommendedDefaultsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceRegisterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceFeatures); i { case 0: return &v.state case 1: @@ -35961,8 +59271,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceApplyRecommendationResponse); i { case 0: return &v.state case 1: @@ -35973,8 +59283,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LiveMigrationResult); i { case 0: return &v.state case 1: @@ -35985,8 +59295,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupStatsRequest); i { + file_api_v1_recommendation_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupReference); i { case 0: return &v.state case 1: @@ -35997,8 +59307,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupStatsResponse); i { + file_api_v1_recommendation_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupRecommendation); i { case 0: return &v.state case 1: @@ -36009,8 +59319,500 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOptimalInstanceTypeForNodeGroupRequest); i { + file_api_v1_recommendation_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CostImpact); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningEvidence); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningInsight); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningResourceEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningContainerChange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningUtilization); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningHistoricalPattern); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningReplicas); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDecision); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedNodeGroupPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedNodeGroupPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedWorkloadPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedWorkloadPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendationPolicyGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyTargetGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadIdentifiers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicies); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedWorkloadPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedWorkloadPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedNodeGroupPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedNodeGroupPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationAppliedRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationAppliedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationEventsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationEventsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveSavingsForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveSavingsForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedNodePolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedNodePolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromKarpenterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromKarpenterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupMigrationEligibility); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeAnnotationReadinessRequest); i { case 0: return &v.state case 1: @@ -36021,8 +59823,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOptimalInstanceTypeForNodeGroupResponse); i { + file_api_v1_recommendation_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeAnnotationReadinessResponse); i { case 0: return &v.state case 1: @@ -36033,8 +59835,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestNodeGroupRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerRequest); i { case 0: return &v.state case 1: @@ -36045,8 +59847,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestNodeGroupRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerResponse); i { case 0: return &v.state case 1: @@ -36057,8 +59859,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestWorkloadRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36069,8 +59871,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestWorkloadRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36081,8 +59883,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36093,8 +59895,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36105,8 +59907,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36117,8 +59919,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadIdentifier); i { + file_api_v1_recommendation_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36129,8 +59931,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36141,8 +59943,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36153,8 +59955,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterOwnershipConflict); i { case 0: return &v.state case 1: @@ -36165,8 +59967,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsRequest); i { case 0: return &v.state case 1: @@ -36177,8 +59979,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsResponse); i { case 0: return &v.state case 1: @@ -36189,8 +59991,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClusterRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictRequest); i { case 0: return &v.state case 1: @@ -36201,8 +60003,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClusterRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictResponse); i { case 0: return &v.state case 1: @@ -36213,8 +60015,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSourceResource); i { case 0: return &v.state case 1: @@ -36225,8 +60027,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesRequest); i { case 0: return &v.state case 1: @@ -36237,8 +60039,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesResponse); i { case 0: return &v.state case 1: @@ -36249,8 +60051,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolAdoptionStatus); i { case 0: return &v.state case 1: @@ -36261,8 +60063,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusRequest); i { case 0: return &v.state case 1: @@ -36273,8 +60075,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusResponse); i { case 0: return &v.state case 1: @@ -36285,8 +60087,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationRequest); i { case 0: return &v.state case 1: @@ -36297,8 +60099,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationResponse); i { case 0: return &v.state case 1: @@ -36309,8 +60111,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetIdList); i { + file_api_v1_recommendation_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsRequest); i { case 0: return &v.state case 1: @@ -36321,8 +60123,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolValidationReport); i { case 0: return &v.state case 1: @@ -36333,8 +60135,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsResponse); i { case 0: return &v.state case 1: @@ -36345,8 +60147,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadCompatibilityWarning); i { case 0: return &v.state case 1: @@ -36357,8 +60159,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesRequest); i { case 0: return &v.state case 1: @@ -36369,8 +60171,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesResponse); i { case 0: return &v.state case 1: @@ -36381,8 +60183,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyRequest); i { case 0: return &v.state case 1: @@ -36393,8 +60195,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyResponse); i { case 0: return &v.state case 1: @@ -36405,8 +60207,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupCheckpointStatus); i { case 0: return &v.state case 1: @@ -36417,8 +60219,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusRequest); i { case 0: return &v.state case 1: @@ -36429,8 +60231,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusResponse); i { case 0: return &v.state case 1: @@ -36441,8 +60243,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelRequest); i { case 0: return &v.state case 1: @@ -36453,8 +60255,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelResponse); i { case 0: return &v.state case 1: @@ -36465,8 +60267,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyRequest); i { case 0: return &v.state case 1: @@ -36477,8 +60279,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyResponse); i { case 0: return &v.state case 1: @@ -36489,8 +60291,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicy); i { case 0: return &v.state case 1: @@ -36501,8 +60303,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -36513,8 +60315,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -36525,8 +60327,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendationConfig); i { case 0: return &v.state case 1: @@ -36537,8 +60339,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigRequest); i { case 0: return &v.state case 1: @@ -36549,8 +60351,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigResponse); i { case 0: return &v.state case 1: @@ -36561,8 +60363,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsRequest); i { case 0: return &v.state case 1: @@ -36573,8 +60375,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsResponse); i { case 0: return &v.state case 1: @@ -36585,8 +60387,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsRequest); i { case 0: return &v.state case 1: @@ -36597,8 +60399,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsResponse); i { case 0: return &v.state case 1: @@ -36609,8 +60411,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestionsForPolicy); i { case 0: return &v.state case 1: @@ -36621,8 +60423,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestion); i { case 0: return &v.state case 1: @@ -36633,8 +60435,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyAttachment); i { + file_api_v1_recommendation_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionFieldChange); i { case 0: return &v.state case 1: @@ -36645,8 +60447,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionEvidence); i { case 0: return &v.state case 1: @@ -36657,8 +60459,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionWorkloadRef); i { case 0: return &v.state case 1: @@ -36669,8 +60471,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionContext); i { case 0: return &v.state case 1: @@ -36681,8 +60483,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -36693,8 +60495,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -36705,8 +60507,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TargetFilters); i { case 0: return &v.state case 1: @@ -36717,8 +60519,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -36729,8 +60531,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -36741,8 +60543,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceSearchResult); i { case 0: return &v.state case 1: @@ -36753,8 +60555,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadSearchResult); i { case 0: return &v.state case 1: @@ -36765,8 +60567,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleWorkloadPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupSearchResult); i { case 0: return &v.state case 1: @@ -36777,8 +60579,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleWorkloadPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LabelSearchResult); i { case 0: return &v.state case 1: @@ -36789,8 +60591,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -36801,8 +60603,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveClusterOptimizationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -36813,8 +60615,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveClusterOptimizationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -36825,8 +60627,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadPolicyTargetMatchesRequest); i { + file_api_v1_recommendation_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -36837,8 +60639,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadPolicyTargetMatchesResponse); i { + file_api_v1_recommendation_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -36849,8 +60651,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -36861,8 +60663,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTarget); i { case 0: return &v.state case 1: @@ -36873,8 +60675,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPercentileSummary); i { + file_api_v1_recommendation_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyCondition); i { case 0: return &v.state case 1: @@ -36885,8 +60687,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupPolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTargetStatus); i { case 0: return &v.state case 1: @@ -36897,8 +60699,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ZonalShiftConfig); i { case 0: return &v.state case 1: @@ -36909,8 +60711,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Taint); i { case 0: return &v.state case 1: @@ -36921,8 +60723,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionBudget); i { case 0: return &v.state case 1: @@ -36933,8 +60735,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionPolicy); i { case 0: return &v.state case 1: @@ -36945,8 +60747,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceLimits); i { case 0: return &v.state case 1: @@ -36957,8 +60759,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSNodeClassSpec); i { case 0: return &v.state case 1: @@ -36969,8 +60771,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesRequest); i { case 0: return &v.state case 1: @@ -36981,8 +60783,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesResponse); i { case 0: return &v.state case 1: @@ -36993,8 +60795,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesRequest); i { case 0: return &v.state case 1: @@ -37005,8 +60807,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleNodeGroupPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesResponse); i { case 0: return &v.state case 1: @@ -37017,8 +60819,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleNodeGroupPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesRequest); i { case 0: return &v.state case 1: @@ -37029,8 +60831,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesResponse); i { case 0: return &v.state case 1: @@ -37041,8 +60843,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeGroupPolicyTargetMatchesRequest); i { + file_api_v1_recommendation_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceFamily); i { case 0: return &v.state case 1: @@ -37053,8 +60855,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeGroupPolicyTargetMatchesResponse); i { + file_api_v1_recommendation_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceShape); i { case 0: return &v.state case 1: @@ -37065,8 +60867,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceSize); i { case 0: return &v.state case 1: @@ -37077,8 +60879,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCategory); i { case 0: return &v.state case 1: @@ -37089,8 +60891,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceGetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCPU); i { case 0: return &v.state case 1: @@ -37101,8 +60903,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceGetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceTypeName); i { case 0: return &v.state case 1: @@ -37113,8 +60915,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchNodeGroupRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesRequest); i { case 0: return &v.state case 1: @@ -37125,8 +60927,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesResponse); i { case 0: return &v.state case 1: @@ -37137,8 +60939,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRule); i { + file_api_v1_recommendation_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsRequest); i { case 0: return &v.state case 1: @@ -37149,8 +60951,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceRuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsResponse); i { case 0: return &v.state case 1: @@ -37161,8 +60963,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPAMetricTrigger); i { + file_api_v1_recommendation_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesRequest); i { case 0: return &v.state case 1: @@ -37173,8 +60975,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPAFallback); i { + file_api_v1_recommendation_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesResponse); i { case 0: return &v.state case 1: @@ -37185,8 +60987,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerResourceConfig); i { + file_api_v1_recommendation_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -37197,8 +60999,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerResourceRuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -37209,8 +61011,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPARuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapacityReservationSelectorTerm); i { case 0: return &v.state case 1: @@ -37221,8 +61023,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EmergencyResponseConfig); i { + file_api_v1_recommendation_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMISelectorTerm); i { case 0: return &v.state case 1: @@ -37233,8 +61035,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PercentileValues); i { + file_api_v1_recommendation_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeletConfiguration); i { case 0: return &v.state case 1: @@ -37245,8 +61047,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourcePercentiles); i { + file_api_v1_recommendation_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDeviceMapping); i { case 0: return &v.state case 1: @@ -37257,8 +61059,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BurstinessRatios); i { + file_api_v1_recommendation_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDevice); i { case 0: return &v.state case 1: @@ -37269,8 +61071,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadClassification); i { + file_api_v1_recommendation_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetadataOptions); i { case 0: return &v.state case 1: @@ -37281,8 +61083,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadRules); i { + file_api_v1_recommendation_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPNodeClassSpec); i { case 0: return &v.state case 1: @@ -37293,8 +61095,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadWithActiveRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPImageSelectorTerm); i { case 0: return &v.state case 1: @@ -37305,8 +61107,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenericResourceRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPDisk); i { case 0: return &v.state case 1: @@ -37317,8 +61119,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchGenericResourceRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureNodeClassSpec); i { case 0: return &v.state case 1: @@ -37329,8 +61131,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchPvcStorageRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureKubeletConfiguration); i { case 0: return &v.state case 1: @@ -37341,8 +61143,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIImageSelectorTerm); i { case 0: return &v.state case 1: @@ -37353,8 +61155,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -37365,8 +61167,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateAndCreatePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -37377,8 +61179,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateAndCreatePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIBootConfig); i { case 0: return &v.state case 1: @@ -37389,8 +61191,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCILaunchOptions); i { case 0: return &v.state case 1: @@ -37401,8 +61203,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIVolumeAttributes); i { case 0: return &v.state case 1: @@ -37413,8 +61215,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPDBRecommendationForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClassSpec); i { case 0: return &v.state case 1: @@ -37425,8 +61227,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPDBRecommendationForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSettingsRecommendation); i { case 0: return &v.state case 1: @@ -37437,8 +61239,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReconcileWorkload); i { + file_api_v1_recommendation_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawKarpenterSpec); i { case 0: return &v.state case 1: @@ -37449,8 +61251,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReconcileResponse); i { + file_api_v1_recommendation_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRecommendation); i { case 0: return &v.state case 1: @@ -37461,8 +61263,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OperatorHealth); i { + file_api_v1_recommendation_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotRecommendation); i { case 0: return &v.state case 1: @@ -37473,8 +61275,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentHealth); i { + file_api_v1_recommendation_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatusReport); i { case 0: return &v.state case 1: @@ -37485,8 +61287,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentHealthMeta); i { + file_api_v1_recommendation_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatus); i { case 0: return &v.state case 1: @@ -37497,8 +61299,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthReport); i { + file_api_v1_recommendation_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRRuntimeStatus); i { case 0: return &v.state case 1: @@ -37509,8 +61311,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeStats); i { + file_api_v1_recommendation_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicyTargetStatus); i { case 0: return &v.state case 1: @@ -37521,8 +61323,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeMetric); i { + file_api_v1_recommendation_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPrereqs); i { case 0: return &v.state case 1: @@ -37533,8 +61335,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerStats); i { + file_api_v1_recommendation_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendation); i { case 0: return &v.state case 1: @@ -37545,8 +61347,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerMetric); i { + file_api_v1_recommendation_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSKarpenterSpec); i { case 0: return &v.state case 1: @@ -37557,8 +61359,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerSummarizedMetric); i { + file_api_v1_recommendation_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSKarpenterSpec); i { case 0: return &v.state case 1: @@ -37569,8 +61371,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metric); i { + file_api_v1_recommendation_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePool); i { case 0: return &v.state case 1: @@ -37581,8 +61383,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EC2NodeClass); i { case 0: return &v.state case 1: @@ -37593,8 +61395,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KedaScaledObjectRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSNodeClass); i { case 0: return &v.state case 1: @@ -37605,8 +61407,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPKarpenterSpec); i { case 0: return &v.state case 1: @@ -37617,8 +61419,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Toleration); i { + file_api_v1_recommendation_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCENodeClass); i { case 0: return &v.state case 1: @@ -37629,8 +61431,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClusterRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIKarpenterSpec); i { case 0: return &v.state case 1: @@ -37641,8 +61443,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClass); i { case 0: return &v.state case 1: @@ -37653,8 +61455,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerticalScalingOptimizationTarget); i { + file_api_v1_recommendation_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageRecommendationPolicy); i { case 0: return &v.state case 1: @@ -37665,8 +61467,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HorizontalScalingOptimizationTarget); i { + file_api_v1_recommendation_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37677,8 +61479,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37689,8 +61491,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPolicyRecommendedDefaultsRequest); i { + file_api_v1_recommendation_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37701,8 +61503,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPolicyRecommendedDefaultsResponse); i { + file_api_v1_recommendation_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37713,8 +61515,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceRegisterRequest); i { + file_api_v1_recommendation_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesRequest); i { case 0: return &v.state case 1: @@ -37725,8 +61527,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceFeatures); i { + file_api_v1_recommendation_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesResponse); i { case 0: return &v.state case 1: @@ -37737,8 +61539,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceApplyRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37749,8 +61551,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiveMigrationResult); i { + file_api_v1_recommendation_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37761,8 +61563,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupReference); i { + file_api_v1_recommendation_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37773,8 +61575,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37785,8 +61587,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CostImpact); i { + file_api_v1_recommendation_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StoragePolicyTarget); i { case 0: return &v.state case 1: @@ -37797,8 +61599,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37809,8 +61611,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedNodeGroupPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37821,8 +61623,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedNodeGroupPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -37833,8 +61635,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedWorkloadPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -37845,8 +61647,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedWorkloadPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37857,8 +61659,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendationPolicyGroup); i { + file_api_v1_recommendation_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37869,8 +61671,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyTargetGroup); i { + file_api_v1_recommendation_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37881,8 +61683,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadIdentifiers); i { + file_api_v1_recommendation_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37893,8 +61695,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicies); i { + file_api_v1_recommendation_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PvcStorageRecommendation); i { case 0: return &v.state case 1: @@ -37905,8 +61707,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedWorkloadPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[369].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37917,8 +61719,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedWorkloadPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[370].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -37929,8 +61731,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedNodeGroupPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[371].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsRequest); i { case 0: return &v.state case 1: @@ -37941,8 +61743,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedNodeGroupPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[372].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsResponse); i { case 0: return &v.state case 1: @@ -37953,8 +61755,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupItem); i { + file_api_v1_recommendation_proto_msgTypes[373].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37965,8 +61767,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationAppliedRequest); i { + file_api_v1_recommendation_proto_msgTypes[374].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -37977,8 +61779,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationAppliedResponse); i { + file_api_v1_recommendation_proto_msgTypes[375].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37989,8 +61791,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[376].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -38001,8 +61803,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[377].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleOOMEvent); i { case 0: return &v.state case 1: @@ -38013,8 +61815,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[378].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsRequest); i { case 0: return &v.state case 1: @@ -38025,8 +61827,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[379].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsResponse); i { case 0: return &v.state case 1: @@ -38037,8 +61839,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetrieveSavingsForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[380].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsRequest); i { case 0: return &v.state case 1: @@ -38049,8 +61851,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetrieveSavingsForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[381].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsResponse); i { case 0: return &v.state case 1: @@ -38061,8 +61863,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[382].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleCPUThrottleEvent); i { case 0: return &v.state case 1: @@ -38073,8 +61875,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[383].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -38085,8 +61887,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[384].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -38097,8 +61899,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[385].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -38109,8 +61911,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromKarpenterRequest); i { + file_api_v1_recommendation_proto_msgTypes[386].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -38121,8 +61923,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromKarpenterResponse); i { + file_api_v1_recommendation_proto_msgTypes[387].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringSetSelector); i { case 0: return &v.state case 1: @@ -38133,8 +61935,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromNodeGroupsRequest); i { + file_api_v1_recommendation_proto_msgTypes[388].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadOptimizationPolicyProto); i { case 0: return &v.state case 1: @@ -38145,8 +61947,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromNodeGroupsResponse); i { + file_api_v1_recommendation_proto_msgTypes[389].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericOptimizationSettings); i { case 0: return &v.state case 1: @@ -38157,8 +61959,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeAnnotationReadinessRequest); i { + file_api_v1_recommendation_proto_msgTypes[390].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -38169,8 +61971,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeAnnotationReadinessResponse); i { + file_api_v1_recommendation_proto_msgTypes[391].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -38181,8 +61983,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMigrationStateRequest); i { + file_api_v1_recommendation_proto_msgTypes[392].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOptimizationPoliciesRequest); i { case 0: return &v.state case 1: @@ -38193,8 +61995,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMigrationStateResponse); i { + file_api_v1_recommendation_proto_msgTypes[393].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOptimizationPoliciesResponse); i { case 0: return &v.state case 1: @@ -38205,8 +62007,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMigrationStateRequest); i { + file_api_v1_recommendation_proto_msgTypes[394].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -38217,8 +62019,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMigrationStateResponse); i { + file_api_v1_recommendation_proto_msgTypes[395].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -38229,8 +62031,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportNodePoolValidationRequest); i { + file_api_v1_recommendation_proto_msgTypes[396].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyByWorkloadRequest); i { case 0: return &v.state case 1: @@ -38241,8 +62043,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportNodePoolValidationResponse); i { + file_api_v1_recommendation_proto_msgTypes[397].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyByWorkloadResponse); i { case 0: return &v.state case 1: @@ -38253,8 +62055,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodePoolValidationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[398].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -38265,8 +62067,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePoolValidationReport); i { + file_api_v1_recommendation_proto_msgTypes[399].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadOptimizationPolicyDisabledRequest); i { case 0: return &v.state case 1: @@ -38277,8 +62079,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodePoolValidationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[400].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadOptimizationPolicyDisabledResponse); i { case 0: return &v.state case 1: @@ -38289,8 +62091,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadCompatibilityWarning); i { + file_api_v1_recommendation_proto_msgTypes[401].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -38301,8 +62103,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[402].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -38313,8 +62115,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[403].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -38325,8 +62127,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[404].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadOptimizationPolicyMatchesRequest); i { case 0: return &v.state case 1: @@ -38337,8 +62139,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[405].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadOptimizationPolicyMatch); i { case 0: return &v.state case 1: @@ -38349,8 +62151,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[406].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadOptimizationPolicyMatchesResponse); i { case 0: return &v.state case 1: @@ -38361,8 +62163,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[407].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyTargetProto); i { case 0: return &v.state case 1: @@ -38373,8 +62175,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicy); i { + file_api_v1_recommendation_proto_msgTypes[408].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyProto); i { case 0: return &v.state case 1: @@ -38385,8 +62187,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeRecommendationConfigRequest); i { + file_api_v1_recommendation_proto_msgTypes[409].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -38397,8 +62199,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeRecommendationConfigResponse); i { + file_api_v1_recommendation_proto_msgTypes[410].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -38409,8 +62211,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeRecommendationConfig); i { + file_api_v1_recommendation_proto_msgTypes[411].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPoliciesRequest); i { case 0: return &v.state case 1: @@ -38421,8 +62223,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedKarpenterConfigRequest); i { + file_api_v1_recommendation_proto_msgTypes[412].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPoliciesResponse); i { case 0: return &v.state case 1: @@ -38433,8 +62235,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedKarpenterConfigResponse); i { + file_api_v1_recommendation_proto_msgTypes[413].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -38445,8 +62247,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAvailableKindsByTargetingFiltersRequest); i { + file_api_v1_recommendation_proto_msgTypes[414].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -38457,8 +62259,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchResourcesByTargetingFiltersRequest); i { + file_api_v1_recommendation_proto_msgTypes[415].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleSchedulerPolicyDisabledRequest); i { case 0: return &v.state case 1: @@ -38469,8 +62271,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetFilters); i { + file_api_v1_recommendation_proto_msgTypes[416].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleSchedulerPolicyDisabledResponse); i { case 0: return &v.state case 1: @@ -38481,8 +62283,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAvailableKindsByTargetingFiltersResponse); i { + file_api_v1_recommendation_proto_msgTypes[417].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -38493,8 +62295,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchResourcesByTargetingFiltersResponse); i { + file_api_v1_recommendation_proto_msgTypes[418].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -38505,8 +62307,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamespaceSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[419].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSchedulerPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -38517,8 +62319,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[420].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyTargetMatch); i { case 0: return &v.state case 1: @@ -38529,8 +62331,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[421].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSchedulerPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -38541,8 +62343,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[422].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPolicyEnrollmentsRequest); i { case 0: return &v.state case 1: @@ -38553,8 +62355,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[423].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyEnrollment); i { case 0: return &v.state case 1: @@ -38565,8 +62367,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[424].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPolicyEnrollmentsResponse); i { case 0: return &v.state case 1: @@ -38577,8 +62379,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[425].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicySync); i { case 0: return &v.state case 1: @@ -38589,8 +62391,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[426].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerConfigPayload); i { case 0: return &v.state case 1: @@ -38601,8 +62403,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[427].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertInstruction); i { case 0: return &v.state case 1: @@ -38613,8 +62415,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[428].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerEnrollmentReport); i { case 0: return &v.state case 1: @@ -38625,8 +62427,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[429].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertEventReport); i { case 0: return &v.state case 1: @@ -38637,8 +62439,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyCondition); i { + file_api_v1_recommendation_proto_msgTypes[430].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRulesByPolicyRequest); i { case 0: return &v.state case 1: @@ -38649,8 +62451,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyTargetStatus); i { + file_api_v1_recommendation_proto_msgTypes[431].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRulesByPolicyResponse); i { case 0: return &v.state case 1: @@ -38661,8 +62463,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZonalShiftConfig); i { + file_api_v1_recommendation_proto_msgTypes[432].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -38673,8 +62475,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Taint); i { + file_api_v1_recommendation_proto_msgTypes[433].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -38685,8 +62487,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DisruptionBudget); i { + file_api_v1_recommendation_proto_msgTypes[434].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByIDRequest); i { case 0: return &v.state case 1: @@ -38697,8 +62499,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DisruptionPolicy); i { + file_api_v1_recommendation_proto_msgTypes[435].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByIDResponse); i { case 0: return &v.state case 1: @@ -38709,8 +62511,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceLimits); i { + file_api_v1_recommendation_proto_msgTypes[436].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByWorkloadRequest); i { case 0: return &v.state case 1: @@ -38721,8 +62523,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AWSNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[437].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByWorkloadResponse); i { case 0: return &v.state case 1: @@ -38733,8 +62535,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceFamiliesRequest); i { + file_api_v1_recommendation_proto_msgTypes[438].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadByWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -38745,8 +62547,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceFamiliesResponse); i { + file_api_v1_recommendation_proto_msgTypes[439].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadByWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -38757,8 +62559,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceSizesRequest); i { + file_api_v1_recommendation_proto_msgTypes[440].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -38769,8 +62571,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceSizesResponse); i { + file_api_v1_recommendation_proto_msgTypes[441].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -38781,8 +62583,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceFamily); i { + file_api_v1_recommendation_proto_msgTypes[442].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteAllWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -38793,8 +62595,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceSize); i { + file_api_v1_recommendation_proto_msgTypes[443].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteAllWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -38805,8 +62607,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceCategory); i { + file_api_v1_recommendation_proto_msgTypes[444].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -38817,8 +62619,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceCPU); i { + file_api_v1_recommendation_proto_msgTypes[445].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -38829,8 +62631,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceTypeName); i { + file_api_v1_recommendation_proto_msgTypes[446].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkToggleWorkloadRulesDisabledRequest); i { case 0: return &v.state case 1: @@ -38841,8 +62643,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCategoriesRequest); i { + file_api_v1_recommendation_proto_msgTypes[447].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkToggleWorkloadRulesDisabledResponse); i { case 0: return &v.state case 1: @@ -38853,8 +62655,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCategoriesResponse); i { + file_api_v1_recommendation_proto_msgTypes[448].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRuleAndApplyRecommendationRequest); i { case 0: return &v.state case 1: @@ -38865,8 +62667,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCPUsRequest); i { + file_api_v1_recommendation_proto_msgTypes[449].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRuleAndApplyRecommendationResponse); i { case 0: return &v.state case 1: @@ -38877,8 +62679,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCPUsResponse); i { + file_api_v1_recommendation_proto_msgTypes[450].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ManualRuleFields); i { case 0: return &v.state case 1: @@ -38889,8 +62691,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceTypeNamesRequest); i { + file_api_v1_recommendation_proto_msgTypes[451].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpsertManualWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -38901,8 +62703,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceTypeNamesResponse); i { + file_api_v1_recommendation_proto_msgTypes[452].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpsertManualWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -38913,8 +62715,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubnetSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[453].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadRuleDisabledRequest); i { case 0: return &v.state case 1: @@ -38925,8 +62727,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecurityGroupSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[454].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadRuleDisabledResponse); i { case 0: return &v.state case 1: @@ -38937,8 +62739,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CapacityReservationSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[455].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -38949,8 +62751,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AMISelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[456].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -38961,8 +62763,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KubeletConfiguration); i { + file_api_v1_recommendation_proto_msgTypes[457].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerNamesRequest); i { case 0: return &v.state case 1: @@ -38973,8 +62775,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockDeviceMapping); i { + file_api_v1_recommendation_proto_msgTypes[458].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerNamesResponse); i { case 0: return &v.state case 1: @@ -38985,8 +62787,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockDevice); i { + file_api_v1_recommendation_proto_msgTypes[459].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkload); i { case 0: return &v.state case 1: @@ -38997,8 +62799,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetadataOptions); i { + file_api_v1_recommendation_proto_msgTypes[460].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadsRequest); i { case 0: return &v.state case 1: @@ -39009,8 +62811,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[461].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadResult); i { case 0: return &v.state case 1: @@ -39021,8 +62823,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPImageSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[462].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadsResponse); i { case 0: return &v.state case 1: @@ -39033,8 +62835,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPDisk); i { + file_api_v1_recommendation_proto_msgTypes[463].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadEntry); i { case 0: return &v.state case 1: @@ -39045,8 +62847,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AzureNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[464].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -39057,8 +62859,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AzureKubeletConfiguration); i { + file_api_v1_recommendation_proto_msgTypes[465].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRuleResult); i { case 0: return &v.state case 1: @@ -39069,8 +62871,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIImageSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[466].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -39081,8 +62883,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCISubnetSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[467].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -39093,8 +62895,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCISecurityGroupSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[468].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRuleResult); i { case 0: return &v.state case 1: @@ -39105,8 +62907,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIBootConfig); i { + file_api_v1_recommendation_proto_msgTypes[469].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -39117,8 +62919,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCILaunchOptions); i { + file_api_v1_recommendation_proto_msgTypes[470].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyOneTimeOptimizationRequest); i { case 0: return &v.state case 1: @@ -39129,8 +62931,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIVolumeAttributes); i { + file_api_v1_recommendation_proto_msgTypes[471].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyOneTimeOptimizationResponse); i { case 0: return &v.state case 1: @@ -39141,8 +62943,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCINodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[472].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadProfileManifest); i { case 0: return &v.state case 1: @@ -39153,8 +62955,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KarpenterSettingsRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[473].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadProfiles); i { case 0: return &v.state case 1: @@ -39165,8 +62967,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[474].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeConfigApplyEvent); i { case 0: return &v.state case 1: @@ -39177,8 +62979,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[475].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -39189,8 +62991,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AWSKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[476].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -39201,8 +63003,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AKSKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[477].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableCheckpointForPolicyRequest); i { case 0: return &v.state case 1: @@ -39213,8 +63015,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePool); i { + file_api_v1_recommendation_proto_msgTypes[478].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableCheckpointForPolicyResponse); i { case 0: return &v.state case 1: @@ -39225,8 +63027,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EC2NodeClass); i { + file_api_v1_recommendation_proto_msgTypes[479].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCheckpointApplyStatusRequest); i { case 0: return &v.state case 1: @@ -39237,8 +63039,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AKSNodeClass); i { + file_api_v1_recommendation_proto_msgTypes[480].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCheckpointApplyStatusResponse); i { case 0: return &v.state case 1: @@ -39249,8 +63051,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[481].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeApplyFailure); i { case 0: return &v.state case 1: @@ -39261,8 +63063,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCENodeClass); i { + file_api_v1_recommendation_proto_msgTypes[482].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterCheckpointLabelCoverageRequest); i { case 0: return &v.state case 1: @@ -39273,8 +63075,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[483].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupCheckpointLabelCoverage); i { case 0: return &v.state case 1: @@ -39285,8 +63087,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCINodeClass); i { + file_api_v1_recommendation_proto_msgTypes[484].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterCheckpointLabelCoverageResponse); i { case 0: return &v.state case 1: @@ -39297,8 +63099,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[485].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupCheckpointLabelStateRequest); i { case 0: return &v.state case 1: @@ -39309,8 +63111,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[486].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeCheckpointLabelEntry); i { case 0: return &v.state case 1: @@ -39321,8 +63123,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[487].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupCheckpointLabelStateResponse); i { case 0: return &v.state case 1: @@ -39333,8 +63135,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[488].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPercentBounds); i { case 0: return &v.state case 1: @@ -39345,8 +63147,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[489].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResourceThreshold); i { case 0: return &v.state case 1: @@ -39357,8 +63159,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[490].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotSchedulePolicySpec); i { case 0: return &v.state case 1: @@ -39369,8 +63171,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[491].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotGlobalRetention); i { case 0: return &v.state case 1: @@ -39381,8 +63183,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[492].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotContainerRetentionPolicy); i { case 0: return &v.state case 1: @@ -39393,8 +63195,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[493].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPodRetentionPolicy); i { case 0: return &v.state case 1: @@ -39405,8 +63207,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[494].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotNamespaceRetentionPolicy); i { case 0: return &v.state case 1: @@ -39417,8 +63219,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[495].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRetentionPolicySpec); i { case 0: return &v.state case 1: @@ -39429,8 +63231,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoragePolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[496].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicy); i { case 0: return &v.state case 1: @@ -39441,8 +63243,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[497].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotPolicy); i { case 0: return &v.state case 1: @@ -39453,8 +63255,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[498].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotTargetScope); i { case 0: return &v.state case 1: @@ -39465,8 +63267,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoragePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[499].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicyTarget); i { case 0: return &v.state case 1: @@ -39477,8 +63279,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoragePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[500].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotPolicyTarget); i { case 0: return &v.state case 1: @@ -39489,8 +63291,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[501].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -39501,8 +63303,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[502].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -39513,8 +63315,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[503].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -39525,8 +63327,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[504].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -39537,8 +63339,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PvcStorageRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[505].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -39549,8 +63351,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[506].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -39561,8 +63363,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[507].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -39573,8 +63375,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPvcStorageRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[508].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -39585,8 +63387,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPvcStorageRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[509].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39597,8 +63399,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[510].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39609,8 +63411,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[511].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39621,8 +63423,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewPvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[512].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39633,8 +63435,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewPvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[513].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39645,8 +63447,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRuleOOMEvent); i { + file_api_v1_recommendation_proto_msgTypes[514].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39657,8 +63459,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleOOMEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[515].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39669,8 +63471,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleOOMEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[516].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39681,8 +63483,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOOMEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[517].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -39693,8 +63495,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOOMEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[518].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -39705,8 +63507,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRuleCPUThrottleEvent); i { + file_api_v1_recommendation_proto_msgTypes[519].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -39717,8 +63519,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleCPUThrottleEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[520].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -39729,8 +63531,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleCPUThrottleEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[521].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -39741,8 +63543,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadCPUThrottleEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[522].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -39753,8 +63555,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadCPUThrottleEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[523].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -39765,8 +63567,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadOptimizationPolicyProto); i { + file_api_v1_recommendation_proto_msgTypes[524].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -39777,8 +63579,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[525].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39789,8 +63591,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[526].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39801,8 +63603,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOptimizationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[527].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39813,8 +63615,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOptimizationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[528].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39825,8 +63627,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[529].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39837,8 +63639,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[530].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39849,8 +63651,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[531].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39861,8 +63663,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[532].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39873,8 +63675,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[533].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TriggerForensicSnapshotRunRequest); i { case 0: return &v.state case 1: @@ -39885,8 +63687,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[534].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TriggerForensicSnapshotRunResponse); i { case 0: return &v.state case 1: @@ -39897,8 +63699,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRulesByPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[535].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResolvedWorkload); i { case 0: return &v.state case 1: @@ -39909,8 +63711,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRulesByPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[536].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResolvedNamespace); i { case 0: return &v.state case 1: @@ -39921,8 +63723,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRulesRequest); i { + file_api_v1_recommendation_proto_msgTypes[537].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotClusterScopePreview); i { case 0: return &v.state case 1: @@ -39933,8 +63735,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRulesResponse); i { + file_api_v1_recommendation_proto_msgTypes[538].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotPolicyTargetMatchesRequest); i { case 0: return &v.state case 1: @@ -39945,8 +63747,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByIDRequest); i { + file_api_v1_recommendation_proto_msgTypes[539].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotPolicyTargetMatchesResponse); i { case 0: return &v.state case 1: @@ -39957,8 +63759,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByIDResponse); i { + file_api_v1_recommendation_proto_msgTypes[540].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicTargetOverlap); i { case 0: return &v.state case 1: @@ -39969,8 +63771,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[541].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotPolicyTargetMatchesRequest); i { case 0: return &v.state case 1: @@ -39981,8 +63783,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[542].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotPolicyTargetMatchesResponse); i { case 0: return &v.state case 1: @@ -39993,8 +63795,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadByWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[543].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRenderedScopeRow); i { case 0: return &v.state case 1: @@ -40005,8 +63807,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadByWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[544].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotPolicyTargetRenderedScopeRequest); i { case 0: return &v.state case 1: @@ -40017,8 +63819,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[545].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotPolicyTargetRenderedScopeResponse); i { case 0: return &v.state case 1: @@ -40029,8 +63831,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[546].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotPolicyTargetRenderedScopeRequest); i { case 0: return &v.state case 1: @@ -40041,8 +63843,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ManualRuleFields); i { + file_api_v1_recommendation_proto_msgTypes[547].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotPolicyTargetRenderedScopeResponse); i { case 0: return &v.state case 1: @@ -40053,8 +63855,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertManualWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[548].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotConfigInfo); i { case 0: return &v.state case 1: @@ -40065,8 +63867,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertManualWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[549].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotConfigApplyEventInfo); i { case 0: return &v.state case 1: @@ -40077,8 +63879,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[550].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -40089,8 +63891,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[551].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -40101,8 +63903,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerNamesRequest); i { + file_api_v1_recommendation_proto_msgTypes[552].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -40113,8 +63915,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerNamesResponse); i { + file_api_v1_recommendation_proto_msgTypes[553].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -40125,8 +63927,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkload); i { + file_api_v1_recommendation_proto_msgTypes[554].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -40137,8 +63939,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadsRequest); i { + file_api_v1_recommendation_proto_msgTypes[555].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -40149,8 +63951,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadResult); i { + file_api_v1_recommendation_proto_msgTypes[556].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -40161,8 +63963,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadsResponse); i { + file_api_v1_recommendation_proto_msgTypes[557].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -40173,8 +63975,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadProfileManifest); i { + file_api_v1_recommendation_proto_msgTypes[558].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReferencedAuthenticationsRequest); i { case 0: return &v.state case 1: @@ -40185,8 +63987,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadProfiles); i { + file_api_v1_recommendation_proto_msgTypes[559].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReferencedAuthentication); i { case 0: return &v.state case 1: @@ -40197,8 +63999,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeConfigApplyEvent); i { + file_api_v1_recommendation_proto_msgTypes[560].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReferencedAuthenticationsResponse); i { case 0: return &v.state case 1: @@ -40209,8 +64011,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeRecommendationStatusRequest); i { + file_api_v1_recommendation_proto_msgTypes[597].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerEnrollmentReport_Observation); i { case 0: return &v.state case 1: @@ -40221,8 +64023,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeRecommendationStatusResponse); i { + file_api_v1_recommendation_proto_msgTypes[598].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertEventReport_Event); i { case 0: return &v.state case 1: @@ -40250,19 +64052,22 @@ func file_api_v1_recommendation_proto_init() { file_api_v1_recommendation_proto_msgTypes[66].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[74].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[76].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[79].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[80].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[84].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[86].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[96].OneofWrappers = []interface{}{ + file_api_v1_recommendation_proto_msgTypes[81].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[85].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[87].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[97].OneofWrappers = []interface{}{ (*BalanceGetRecommendationsRequest_Register)(nil), (*BalanceGetRecommendationsRequest_Apply)(nil), (*BalanceGetRecommendationsRequest_WorkloadMeta)(nil), (*BalanceGetRecommendationsRequest_InClusterRecommendation)(nil), + (*BalanceGetRecommendationsRequest_SnapshotCrStatusReport)(nil), + (*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport)(nil), + (*BalanceGetRecommendationsRequest_SchedulerRevertEventReport)(nil), (*BalanceGetRecommendationsRequest_OperatorHealth)(nil), (*BalanceGetRecommendationsRequest_AgentHealth)(nil), } - file_api_v1_recommendation_proto_msgTypes[97].OneofWrappers = []interface{}{ + file_api_v1_recommendation_proto_msgTypes[98].OneofWrappers = []interface{}{ (*BalanceGetRecommendationsResponse_NodeGroupRecommendation)(nil), (*BalanceGetRecommendationsResponse_WorkloadRecommendation)(nil), (*BalanceGetRecommendationsResponse_NodeRecommendation)(nil), @@ -40277,71 +64082,128 @@ func file_api_v1_recommendation_proto_init() { (*BalanceGetRecommendationsResponse_BatchPvcStorageRecommendations)(nil), (*BalanceGetRecommendationsResponse_BatchWorkloadRules)(nil), (*BalanceGetRecommendationsResponse_KarpenterSettings)(nil), + (*BalanceGetRecommendationsResponse_SnapshotRecommendation)(nil), + (*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation)(nil), + (*BalanceGetRecommendationsResponse_BatchHpaConnectors)(nil), + (*BalanceGetRecommendationsResponse_SchedulerPolicySync)(nil), } - file_api_v1_recommendation_proto_msgTypes[100].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[101].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[102].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[104].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[106].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[114].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[124].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[126].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[140].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[141].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[142].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[143].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[144].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[145].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[148].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[149].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[150].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[103].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[105].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[107].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[108].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[110].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[111].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[122].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[132].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[138].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[152].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[153].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[154].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[155].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[156].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[157].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[158].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[159].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[160].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[161].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[164].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[165].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[166].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[169].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[170].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[171].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[176].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[203].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[211].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[232].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[252].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[253].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[254].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[255].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[256].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[259].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[260].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[265].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[267].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[280].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[281].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[287].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[291].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[292].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[294].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[300].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[303].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[304].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[306].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[308].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[309].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[310].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[312].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[172].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[180].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[194].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[196].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[201].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[251].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[262].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[269].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[290].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[313].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[314].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[315].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[316].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[317].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[319].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[320].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[321].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[326].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[332].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[342].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[328].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[348].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[349].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[355].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[359].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[360].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[362].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[368].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[371].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[372].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[374].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[376].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[377].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[378].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[380].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[382].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[383].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[385].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[388].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[389].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[390].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[398].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[399].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[402].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[404].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[405].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[408].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[409].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[411].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[413].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[419].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[420].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[423].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[432].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[450].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[455].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[463].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[488].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[489].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[490].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[491].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[492].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[493].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[494].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[495].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[496].OneofWrappers = []interface{}{ + (*SnapshotPolicy_Schedule)(nil), + (*SnapshotPolicy_Retention)(nil), + } + file_api_v1_recommendation_proto_msgTypes[497].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[498].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[511].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[527].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[535].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[541].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[543].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[544].OneofWrappers = []interface{}{ + (*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId)(nil), + (*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId)(nil), + } + file_api_v1_recommendation_proto_msgTypes[546].OneofWrappers = []interface{}{ + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId)(nil), + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId)(nil), + } + file_api_v1_recommendation_proto_msgTypes[548].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[551].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[553].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_recommendation_proto_rawDesc, - NumEnums: 16, - NumMessages: 390, + NumEnums: 35, + NumMessages: 602, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/proto/api/v1/cluster.proto b/internal/proto/api/v1/cluster.proto index 10d7462..e1eefbc 100644 --- a/internal/proto/api/v1/cluster.proto +++ b/internal/proto/api/v1/cluster.proto @@ -125,6 +125,8 @@ message GetNetworkDependenciesRequest { google.protobuf.Timestamp end_time = 3; repeated string src_namespaces = 4; // Filter by source namespaces (optional) repeated string src_node_groups = 5; // Filter by source node groups (optional) + int32 limit = 6; // Max edges to return, ordered by rank_by (optional; 0/unset means no limit — all matching edges are returned) + string rank_by = 7; // Ordering dimension: "traffic" (default) or "cost" (optional; unset/unrecognized falls back to "traffic") } // A workload node in the dependency graph diff --git a/internal/proto/api/v1/common.proto b/internal/proto/api/v1/common.proto index d87e033..795fcf3 100644 --- a/internal/proto/api/v1/common.proto +++ b/internal/proto/api/v1/common.proto @@ -50,6 +50,14 @@ enum K8sObjectKind { K8S_OBJECT_KIND_CNPG_CLUSTER = 35; K8S_OBJECT_KIND_SPARK_APPLICATION = 36; K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION = 37; + // Kyverno Policy and ClusterPolicy (kyverno.io/v1); one kind for both scopes. + K8S_OBJECT_KIND_KYVERNO_POLICY = 38; + // Kyverno PolicyReport and ClusterPolicyReport (wgpolicyk8s.io/v1alpha2). + K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT = 39; + // Gatekeeper ConstraintTemplate (templates.gatekeeper.sh/v1). + K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE = 40; + // Gatekeeper constraint instances (constraints.gatekeeper.sh, dynamic kinds). + K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT = 41; } // Represents a single audit log entry @@ -142,6 +150,7 @@ message CostInfo { google.type.Money money_cpu_cost_for_time_period = 110; google.type.Money money_memory_cost_for_time_period = 111; google.type.Money money_total_cost_for_time_period = 112; + google.type.Money money_network_cost_for_time_period = 122; google.type.Money money_optimized_cpu_cost_for_time_period = 113; google.type.Money money_optimized_memory_cost_for_time_period = 114; @@ -221,6 +230,40 @@ message ResourceMetrics { // Pod count int32 pod_count = 111; // Number of distinct pods observed in this time bucket. + + // JVM heap metrics (0 for non-Java containers) + int64 jvm_heap_used_bytes = 121; + int64 jvm_heap_max_bytes = 122; + + // Memory RSS (Resident Set Size) in bytes from kubelet stats/summary (0 for non-RSS-reporting nodes) + int64 container_memory_rss_bytes = 123; + + // Memory breakdown components (bytes). Relationship: + // usage_bytes = anonymous + file cache + swap cache + kernel (container_memory_usage_bytes / memory.current) + // working_set = usage_bytes - inactive_file (what the kubelet/OOM-killer acts on; stored as container_memory_usage) + // cache = active_file + inactive_file (file-backed, reclaimable) + // inactive_cache = max(0, usage_bytes - working_set) (reclaimable file cache) + // active_cache = max(0, cache - inactive_cache) (recently-used file cache) + // swap = swapped-out (non-resident) pages; tracked separately, NOT part of usage/working_set + int64 container_memory_cache_bytes = 124; + int64 container_memory_swap_bytes = 125; + int64 container_memory_active_cache_bytes = 126; + int64 container_memory_inactive_cache_bytes = 127; + + // Runtime-aware cgroup signals (Plane 0, ADR-0037). Read directly from + // /sys/fs/cgroup by zxporter-nodemon (v2 primary). All are cumulative kernel + // counters; consumers derive windowed rates as last-first. + // cfs_* CPU CFS throttling (cpu.stat): real throttle, not a usage/limit ratio + // memory_events_max memory.events:max — allocations pinned against memory.max, the + // Guaranteed-memory ceiling counter that fires before/without an OOM kill + // *_pressure_*_usec PSI stall time (cpu.pressure/memory.pressure "total="), microseconds + int64 container_cfs_periods = 128; + int64 container_cfs_throttled_periods = 129; + int64 container_cfs_throttled_usec = 130; + int64 container_memory_events_max = 131; + int64 container_cpu_pressure_some_usec = 132; + int64 container_memory_pressure_some_usec = 133; + int64 container_memory_pressure_full_usec = 134; } // MetricPercentiles contains percentile statistics for a single metric. @@ -288,6 +331,90 @@ message ContainerRequestLimits { double current_memory_request = 3; double current_cpu_limit = 4; double current_memory_limit = 5; + + // JVM metadata (empty/zero for non-Java containers). + // Populated from k8s_containers table when JVM is detected via hsperfdata. + string jvm_java_version = 10; + string jvm_java_command = 11; + + // Parsed JVM flags (typed fields instead of raw JSON for type-safe frontend access). + int64 jvm_xmx_bytes = 13; // -Xmx max heap size in bytes + int64 jvm_xms_bytes = 14; // -Xms initial heap size in bytes + double jvm_max_ram_percentage = 15; // -XX:MaxRAMPercentage + optional bool jvm_use_container_support = 16; // -XX:+/-UseContainerSupport + + // Source the -Xmx flag was extracted from: "cmdline", "JAVA_TOOL_OPTIONS", + // "JDK_JAVA_OPTIONS", or "JAVA_OPTS". Empty when -Xmx is unset. Matters + // because the `java` launcher ignores JAVA_OPTS — an -Xmx set there is + // inert and the JVM falls back to ergonomic (container-limit) heap sizing. + string jvm_xmx_source = 17; + + // Generic runtime detections (Node.js, .NET, Go, Rust, GraalVM native-image, + // Python, Ruby, Deno, Bun) from zxporter-nodemon: existence + best-effort + // version per runtime. Empty for containers with no detected runtime. JVM + // stays on the dedicated fields above (richer hsperfdata payload). + repeated RuntimeProcess runtime_processes = 18; +} + +// GPUMigInstance captures per-instance identity and profiling metrics for a +// single MIG partition. GPU utilization/SM fields are intentionally absent — +// DCGM never populates them on MIG rows. +message GPUMigInstance { + string device_uuid = 1; + string device_id = 2; + string mig_profile = 3; + string mig_instance_id = 4; + string model_name = 5; + + double tensor_active = 6; + double dram_active = 7; + double graphics_engine_active = 8; + double framebuffer_used = 9; + double framebuffer_total = 10; +} + +// IndividualGPUMetric captures point-in-time metrics for a single GPU used +// by a container. +message IndividualGPUMetric { + string uuid = 1; + string model_name = 2; + string device_index = 3; + string mig_profile = 4; + string mig_instance_id = 5; + + double utilization = 6; + double memory_used = 7; + double memory_free = 8; + double total_memory = 9; + double memory_utilization_percentage = 10; + double power_usage = 11; + double temperature = 12; + double sm_clock = 13; + double mem_clock = 14; +} + +// ContainerIndividualGPUMetrics is the most recent per-GPU breakdown for a +// single container. +message ContainerIndividualGPUMetrics { + string container_name = 1; + repeated IndividualGPUMetric instances = 2; + optional google.protobuf.Timestamp collected_at = 3; +} + +// RuntimeProcess is one detected language runtime in a container. +message RuntimeProcess { + // Runtime name: "nodejs" | "dotnet" | "go" | "rust" | + // "graalvm-native-image" | "python" | "ruby" | "deno" | "bun". + string runtime = 1; + // Best-effort version; may be empty (stripped/custom binaries) — the + // detection itself is still meaningful. + string version = 2; + // How the version was resolved: "env" | "maps" | "buildinfo" | "elf-comment" + // | "binary-scan" | "exe-path" | "comm". + string version_source = 3; + // Raw process cmdline (useful for future flag heuristics, e.g. + // --max-old-space-size). + string raw_cmdline = 4; } // ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. @@ -346,6 +473,27 @@ message ResourceSummary { } // WorkloadItem represents a Kubernetes resource and its hierarchical children. +// LegacyPolicyRef identifies a legacy WorkloadPolicy whose target matches a workload. +message LegacyPolicyRef { + string policy_id = 1; + string policy_name = 2; +} + +// OptimizationStatus reports whether a workload is optimized under either the +// legacy (WorkloadPolicy/WorkloadPolicyTarget) or MPA v2 (WorkloadRule) system. +// Only populated on WorkloadItem when at least one of +// GetWorkloadsRequest.include_legacy_optimization_status or +// GetWorkloadsRequest.include_v2_optimization_status is true. +message OptimizationStatus { + bool is_optimized = 1; // is_optimized_legacy || is_optimized_v2 + bool is_optimized_legacy = 2; + bool is_optimized_v2 = 3; + repeated LegacyPolicyRef legacy_policies = 4; // legacy policies whose targets match this workload + string workload_rule_id = 5; // v2: empty if no active WorkloadRule + string workload_rule_policy_name = 6; // v2: display name of the policy behind the active rule, empty if unresolved + bool disabled = 7; // v2: whether the active WorkloadRule (workload_rule_id) is currently disabled. Always false when workload_rule_id is empty. +} + message WorkloadItem { string kind = 1; // Kind of the resource (e.g., Pod, Container, Deployment). string name = 2; // Name of the resource. @@ -377,6 +525,8 @@ message WorkloadItem { string root_owner_kind = 91; // Kind of the root owning resource, if any. string root_owner_uid = 92; // UID of the root owning resource, if any. + + optional OptimizationStatus optimization_status = 93; // Populated only when GetWorkloadsRequest.include_legacy_optimization_status and/or GetWorkloadsRequest.include_v2_optimization_status is true } // ContainerRuntimeInfo containes information about container runtime info @@ -534,13 +684,34 @@ message SavingsTimeSeries { double total_cpu_cost_waste = 4; } -// Kubernetes-compatible Label Selector Types - -// LabelSelectorOperator is the set of operators that can be used in a selector requirement. +// LabelSelectorOperator is the set of operators that can be used in a selector +// requirement. +// +// The message shape mirrors Kubernetes metav1.LabelSelector, and matching +// follows Kubernetes for the IN and NOT_IN operators. In particular, a +// workload whose labels lack the key still matches NOT_IN, because a missing +// key is not in the set. This agrees with Kubernetes: in +// k8s.io/apimachinery/pkg/labels, Requirement.Matches returns true for NotIn +// when the key is absent, so it is not a divergence. +// +// Two DevZero-specific caveats apply (PC-1452): +// +// First, the department and workload filter paths implement only IN and +// NOT_IN. EXISTS, DOES_NOT_EXIST, GT, and LT are part of this proto for shape +// compatibility but are not honored by those SQL filters. +// +// Second, a workload whose entire labels or annotations column is SQL NULL +// (an unset column, distinct from an empty map) is EXCLUDED from a NOT_IN +// match by the department query, which ANDs a column IS NOT NULL guard ahead +// of the selector condition (dakr/repositories/departments.go). This is a +// genuine divergence from Kubernetes, which matches a label-less object +// against NotIn. It is also inconsistent with the workload-metrics filter +// path, which matches a NULL column against NOT_IN +// (dakr/repositories/workload_metrics_filters.go). enum LabelSelectorOperator { LABEL_SELECTOR_OPERATOR_UNSPECIFIED = 0; LABEL_SELECTOR_OPERATOR_IN = 1; // In - LABEL_SELECTOR_OPERATOR_NOT_IN = 2; // NotIn + LABEL_SELECTOR_OPERATOR_NOT_IN = 2; // NotIn (missing key matches; see caveats above and PC-1452) LABEL_SELECTOR_OPERATOR_EXISTS = 3; // Exists LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST = 4; // DoesNotExist LABEL_SELECTOR_OPERATOR_GT = 5; // GreaterThan @@ -553,7 +724,9 @@ message LabelSelectorRequirement { // key is the label key that the selector applies to. string key = 1; // operator represents a key's relationship to a set of values. - // Valid operators are In, NotIn, Exists and DoesNotExist. + // Valid operators are In, NotIn, Exists and DoesNotExist, but the DevZero + // department and workload filter paths honor only In and NotIn (see the + // LabelSelectorOperator caveats above, PC-1452). LabelSelectorOperator operator = 2; // values is an array of string values. If the operator is In or NotIn, // the values array must be non-empty. If the operator is Exists or DoesNotExist, @@ -647,6 +820,14 @@ message ResourceDetails { SparkApplicationDetails spark_application_details = 242; // ScheduledSparkApplication-specific fields ScheduledSparkApplicationDetails scheduled_spark_application_details = 243; + // KyvernoPolicy-specific fields + KyvernoPolicyDetails kyverno_policy_details = 244; + // KyvernoPolicyReport-specific fields + KyvernoPolicyReportDetails kyverno_policy_report_details = 245; + // GatekeeperConstraintTemplate-specific fields + GatekeeperConstraintTemplateDetails gatekeeper_constraint_template_details = 246; + // GatekeeperConstraint-specific fields + GatekeeperConstraintDetails gatekeeper_constraint_details = 247; } // Common fields that can be flattened at this level for easier access @@ -1118,6 +1299,12 @@ message NodeDetails { map capacity = 4; // Resource capacity (cpu, memory, etc.) map allocatable = 5; // Allocatable resources repeated NodeImage images = 6; // Container images on the node + // Desired MIG partitioning profile from the nvidia.com/mig.config node + // label; empty on nodes without MIG management. + string mig_config_desired = 7; + // Applied MIG state from the nvidia.com/mig.config.state node label + // (e.g. success, pending, failed); empty on nodes without MIG management. + string mig_config_state = 8; } // NodeTaint represents a node taint that affects pod scheduling @@ -1523,6 +1710,20 @@ enum WorkloadStatusFilter { WORKLOAD_STATUS_FILTER_BOTH = 3; // Both active and deleted workloads } +// ResourceFieldFilter filters resources on a single field; values are OR'd together. +message ResourceFieldFilter { + string field = 1; // e.g. "type", "class", "kind", "namespace" + repeated string values = 2; // OR'd together +} + +// ResourceFilterFieldOptions describes the distinct values available for a filterable field. +message ResourceFilterFieldOptions { + string field = 1; + string label = 2; + repeated string values = 3; + bool truncated = 4; // true when the value list was capped and is incomplete +} + // WorkloadFilters provides optional filters for narrowing the GetWorkloads request. // All fields are optional. When multiple fields are provided, they are ANDed together. message WorkloadFilters { @@ -1534,8 +1735,19 @@ message WorkloadFilters { optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; // Target specific workload kinds + // Match workloads with at least one container detected as one of these + // languages (e.g. "python", "go", "java"). ANY container matching is + // sufficient — containers do not all need to match. + repeated string language_filter = 17; + // Exact detected version strings (e.g. "3.11.4"). Only meaningful when + // language_filter is also set; ignored otherwise. + repeated string language_version_filter = 18; + repeated string node_group_names = 21; // target workloads running on specific nodes + repeated string namespace_names = 22; // Target workloads in any of these namespaces by exact name (OR'd together; ANDed with other filter fields; no-op when empty) + optional RegexPattern namespace_pattern = 23; // Target namespaces by name pattern + // Lifecycle status filter (overrides legacy show_deleted when set) WorkloadStatusFilter status = 30; // ACTIVE, DELETED, or BOTH } @@ -1678,6 +1890,146 @@ message ScheduledSparkApplicationDetails { SparkApplicationDetails template_details = 14; // Details from the SparkApplication template } +// KyvernoPolicyDetails contains detailed Kyverno Policy/ClusterPolicy information for drill-down +message KyvernoPolicyDetails { + string kind = 1; // Policy (namespaced) or ClusterPolicy + bool background = 2; // Whether background scanning is enabled + string validation_failure_action = 3; // Audit or Enforce (rule-level failureAction wins on kyverno 1.13+) + int32 rule_count = 4; // Number of rules in the policy + repeated string rule_names = 5; // Rule names + string spec_json = 6; // Full policy spec as JSON for raw inspection +} + +// PolicyReportResult is one per-resource result inside a Kyverno policy report +message PolicyReportResult { + string policy = 1; // Policy name + string rule = 2; // Rule name + string result = 3; // pass, fail, warn, error, skip + string severity = 4; // critical, high, medium, low, info + string message = 5; // Human readable message + string resource_kind = 6; // Kind of the evaluated resource + string resource_namespace = 7; // Namespace of the evaluated resource + string resource_name = 8; // Name of the evaluated resource +} + +// KyvernoPolicyReportDetails contains detailed policy report information for drill-down. +// The results list is capped at collection time (50); the counts always cover the full report. +message KyvernoPolicyReportDetails { + string kind = 1; // PolicyReport (namespaced) or ClusterPolicyReport + string scope_kind = 2; // Kind of the resource the report applies to + string scope_name = 3; // Name of the resource the report applies to + string scope_namespace = 4; // Namespace of the resource the report applies to + int32 pass = 5; // Passing result count + int32 fail = 6; // Failing result count + int32 warn = 7; // Warning result count + int32 error = 8; // Error result count + int32 skip = 9; // Skipped result count + repeated PolicyReportResult results = 10; // Capped per-resource results + int32 total_results = 11; // Full result count before capping +} + +// GatekeeperConstraintTemplateDetails contains detailed ConstraintTemplate information for drill-down +message GatekeeperConstraintTemplateDetails { + string crd_kind = 1; // Constraint kind this template generates (e.g. K8sRequiredLabels) + repeated string targets = 2; // Enforcement targets (e.g. admission.k8s.gatekeeper.sh) + bool created = 3; // Whether the constraint CRD has been created + string spec_json = 4; // Full template spec as JSON for raw inspection +} + +// ConstraintViolation is one audit violation on a Gatekeeper constraint status +message ConstraintViolation { + string resource_kind = 1; // Kind of the violating resource + string resource_namespace = 2; // Namespace of the violating resource + string resource_name = 3; // Name of the violating resource + string message = 4; // Violation message + string enforcement_action = 5; // Action recorded on the violation +} + +// GatekeeperConstraintDetails contains detailed constraint information for drill-down. +// The violations list is capped by gatekeeper (default 20); total_violations covers the full audit. +message GatekeeperConstraintDetails { + string kind = 1; // Template-generated constraint kind + string enforcement_action = 2; // deny, warn, or dryrun + string match_json = 3; // Match criteria as JSON + string parameters_json = 4; // Constraint parameters as JSON + int64 total_violations = 5; // Full audit violation count + google.protobuf.Timestamp audit_timestamp = 6; // When gatekeeper last audited + repeated ConstraintViolation violations = 7; // Capped audit violations +} + +// DisruptionBlockReason is the structured classification of a consolidation / scale-down +// block: why the autoscaler could not remove a node. +// +// Assigned by zxporter at ingest time, because only the collector has the inputs the +// answer needs — the blocked pods' annotations, live PodDisruptionBudget status, the +// NodeClaim's terminationGracePeriod deadline, and (on Cluster Autoscaler) the +// `cluster-autoscaler-status` ConfigMap. dakr has none of those at read time, and the +// event's own message is unversioned free text that has changed shape across releases. +// +// ONE ENUM FOR BOTH AUTOSCALERS. Karpenter's `DisruptionBlocked` events and Cluster +// Autoscaler's synthesized `ScaleDownBlocked` observations share these buckets: two mean +// the same thing under either autoscaler, the rest are specific to one. Which autoscaler +// produced a row is answered by its `reporting_controller`, not by a second enum — that is +// what lets one report cover a Karpenter cluster, a CAS cluster, and a cluster running +// both mid-migration. +// +// The value names map 1:1 to models.DisruptionBlockReason and to the +// k8s_events.disruption_block_reason ClickHouse column's string values. That column is +// LowCardinality(String), not Enum8, so appending a value here costs no migration. +enum DisruptionBlockReason { + // Not a disruption-block event, or an event ingested before classification existed. + // Deliberately distinct from OTHER: this means "never classified", where OTHER means + // "classified, and matched no known pattern". + DISRUPTION_BLOCK_REASON_UNSPECIFIED = 0; + // A PodDisruptionBudget selecting a pod on the node currently allows no disruptions. + // blocking_pdb_name carries which one. Both autoscalers (on Cluster Autoscaler this is + // the BlockedByPod unremovable reason with a NotEnoughPdb blocking pod). + DISRUPTION_BLOCK_REASON_PDB_VIOLATION = 1; + // A pod on the node, or the node itself, is annotated un-evictable. Both autoscalers: + // `karpenter.sh/do-not-disrupt: "true"` on a pod (Karpenter), + // `cluster-autoscaler.kubernetes.io/safe-to-evict: "false"` on a pod, or + // `cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"` on a node (CAS). + DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION = 2; + // The NodeClaim's terminationGracePeriod deadline has already elapsed, so Karpenter + // will force-terminate past both PDBs and do-not-disrupt. Karpenter-only: Cluster + // Autoscaler has no equivalent override. + DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED = 3; + // Classified, but the block matched none of the above — e.g. a node-level block + // (uninitialized, already deleting, missing its NodePool label), or any Cluster + // Autoscaler unremovable reason without its own bucket (NodeGroupMinSizeReached, + // NotUnderutilized, CurrentlyBeingDeleted, ...). The verbatim `message` is the only + // remaining detail, which is why it is never dropped. This is the REQUIRED fallback: + // dakr rejects an event carrying a value outside this enum. + DISRUPTION_BLOCK_REASON_OTHER = 4; + // Cluster Autoscaler considers the node underutilized but has not yet seen it stay that + // way for --scale-down-unneeded-time. A waiting state rather than a misconfiguration, + // and the most common thing a healthy CAS cluster reports — hence its own bucket rather + // than OTHER. Cluster-Autoscaler-only. + DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH = 5; + // Cluster Autoscaler's scheduling simulation found nowhere to move the node's pods to, + // so the node cannot be drained. Actionable, unlike NOT_UNNEEDED_LONG_ENOUGH. + // Cluster-Autoscaler-only. + DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS = 6; + // The scheduler has provisionally assigned a pending pod to this node + // (pod.Status.NominatedNodeName). The autoscaler will not disrupt a node it is about to + // hand a pod, since that would just make the pod re-pend immediately — a self-resolving, + // expected-waiting state, not a misconfiguration. related_pod_name carries the pod. + // Derived structurally, not from the event message — reachable via the Karpenter path + // today. + DISRUPTION_BLOCK_REASON_POD_NOMINATED = 7; + // Karpenter's own `disruption.budgets` allowance for the NodePool is currently spent, so + // it throttled itself. Operationally the opposite of every other value here: a config + // choice the cluster's owner made, not an obstruction to go find, which is why it is not + // folded into OTHER. Reported against the NodePool rather than a node, so it counts as a + // blocking event and never as a blocked node. Karpenter-only. + DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET = 8; + // Karpenter's scheduling simulation found nowhere for the node's pods to go, so draining + // it would leave them pending. Same situation as NO_PLACE_TO_MOVE_PODS, which is spelled + // to match Cluster Autoscaler's own unremovable reason verbatim and is therefore kept + // CAS-only; the per-pod sub-reason stays readable in the verbatim `message`. + DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE = 9; +} + message Event { string id = 1; string kind = 2; @@ -1704,6 +2056,13 @@ message Event { map labels = 24; string involved_object_uid = 25; + // Set only on Karpenter `DisruptionBlocked` events; UNSPECIFIED on every other event. + DisruptionBlockReason disruption_block_reason = 26; + // The PodDisruptionBudget that blocked eviction, as "namespace/name". Set only + // alongside DISRUPTION_BLOCK_REASON_PDB_VIOLATION; absent — not empty-string — + // otherwise, since "no PDB was involved" is not the same as "a PDB with no name". + optional string blocking_pdb_name = 27; + google.protobuf.Timestamp created_at = 41; google.protobuf.Timestamp updated_at = 42; google.protobuf.Timestamp last_seen = 43; @@ -1711,6 +2070,11 @@ message Event { string updated_at_age = 45; string last_seen_age = 46; google.protobuf.Timestamp deleted_at = 47; + + // The pod behind a DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION or + // DISRUPTION_BLOCK_REASON_POD_NOMINATED classification, as "namespace/name". Same + // absent-means-not-applicable contract as blocking_pdb_name. + optional string related_pod_name = 48; } message EventDatapointInfo { diff --git a/internal/proto/api/v1/hpa_connector.proto b/internal/proto/api/v1/hpa_connector.proto new file mode 100644 index 0000000..ff0aaa2 --- /dev/null +++ b/internal/proto/api/v1/hpa_connector.proto @@ -0,0 +1,67 @@ +// dakr/proto/api/v1/hpa_connector.proto +syntax = "proto3"; + +package api.v1; + +option go_package = "github.com/devzero-inc/services/dakr/gen/api/v1;gen"; + +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +message HPAConnector { + string id = 1; + string cluster_id = 2; + string team_id = 3; + string name = 4; + string type = 5; + map config = 6; + optional string auth_secret_ref = 7; + string status = 8; + optional google.protobuf.Timestamp last_health_check = 9; + optional string health_error = 10; + google.protobuf.Timestamp created_at = 11; + google.protobuf.Timestamp updated_at = 12; + optional string auth_secret_namespace = 13; +} + +message CreateHPAConnectorRequest { + string cluster_id = 1; + string name = 2; + string type = 3; + map config = 4; + optional string auth_secret_ref = 5; + optional string auth_secret_namespace = 6; +} + +message UpdateHPAConnectorRequest { + string id = 1; + string name = 2; + map config = 3; + optional string auth_secret_ref = 4; + optional string auth_secret_namespace = 5; +} + +message GetHPAConnectorRequest { + string id = 1; +} + +message ListHPAConnectorsRequest { + string cluster_id = 1; + optional string type = 2; +} + +message ListHPAConnectorsResponse { + repeated HPAConnector connectors = 1; +} + +message DeleteHPAConnectorRequest { + string id = 1; +} + +service HPAConnectorService { + rpc CreateHPAConnector(CreateHPAConnectorRequest) returns (HPAConnector); + rpc UpdateHPAConnector(UpdateHPAConnectorRequest) returns (HPAConnector); + rpc DeleteHPAConnector(DeleteHPAConnectorRequest) returns (google.protobuf.Empty); + rpc ListHPAConnectors(ListHPAConnectorsRequest) returns (ListHPAConnectorsResponse); + rpc GetHPAConnector(GetHPAConnectorRequest) returns (HPAConnector); +} diff --git a/internal/proto/api/v1/k8s.proto b/internal/proto/api/v1/k8s.proto index 82886dc..e6e5557 100644 --- a/internal/proto/api/v1/k8s.proto +++ b/internal/proto/api/v1/k8s.proto @@ -68,6 +68,103 @@ message GetWorkloadsRequest { repeated string node_group_names = 25 [deprecated = true]; // Prefer filters.status instead optional WorkloadFilters filters = 31; // Optional advanced filters; when set, overrides show_deleted behavior via filters.status + + // The two flags below independently control which half of + // WorkloadItem.optimization_status gets computed. Split because a team on + // MPA_V2 with is_enabled=false is permanently locked into exactly one + // system (is_active=true -> v2-only, is_active=false -> legacy-only) and + // the unused system should never be queried; only when is_enabled=true + // (team is in a self-service/transition state) does the caller request + // both. Adds batched lookups — leave both false unless the caller renders + // optimization status. + bool include_legacy_optimization_status = 32; + bool include_v2_optimization_status = 33; +} + +// ListWorkloadsPaginatedRequest fetches a single keyset-paginated page of +// top-level workloads for a cluster+timerange. Additive alternative to +// GetWorkloads for large clusters; existing GetWorkloads callers are unaffected. +message ListWorkloadsPaginatedRequest { + string team_id = 1; // Unique identifier for the team. + string cluster_id = 2; // Unique identifier for the cluster. + optional google.protobuf.Timestamp start_time = 3; + optional google.protobuf.Timestamp end_time = 4; + optional WorkloadFilters filters = 5; // Optional advanced filters (same message GetWorkloads uses). + bool include_legacy_optimization_status = 6; + bool include_v2_optimization_status = 7; + int32 page_size = 8; // Max items per page; server clamps to a sane range. + string page_token = 9; // Opaque cursor from a prior response; empty = first page. + string sort_order = 10; // "asc" | "desc" (default "desc": highest sort_field value first). + string sort_field = 11; // "cost" | "cpu" | "memory" | "gpu" (default "cost"). Selects which metric orders the page. +} + +// GetWorkloadsSummaryRequest computes cluster-wide aggregate breakdowns (summary +// cards, top-N lists, treemaps) over the FULL filtered workload set in a single +// pass. Companion to ListWorkloadsPaginated: this pays the full-scan cost once +// per page load, while ListWorkloadsPaginated serves the cheap table body per +// scroll. +message GetWorkloadsSummaryRequest { + string team_id = 1; + string cluster_id = 2; + optional google.protobuf.Timestamp start_time = 3; + optional google.protobuf.Timestamp end_time = 4; + optional WorkloadFilters filters = 5; // Same WorkloadFilters message as ListWorkloadsPaginatedRequest. +} + +// WorkloadMetricEntry is a single workload's contribution to one metric. value +// is whatever the enclosing breakdown is sorted by; requested/limit/usage carry +// the full picture so the frontend can render tooltips and compute utilization +// without a second round-trip. For the cost breakdown, requested is the +// requested cost, usage is the usage cost, and limit is 0 (no limit-cost +// concept). +message WorkloadMetricEntry { + string uid = 1; + string name = 2; + string kind = 3; + string namespace = 4; + double value = 5; // The metric this breakdown is sorted by (usage for cpu/mem/gpu, requested cost for cost, overprovisioned amount for optimization_potential). + double requested = 6; // Cluster-wide requested amount for this workload (millicores / bytes / gpu-count / requested cost). + double limit = 7; // Configured limit for this workload (0 for the cost breakdown). + double usage = 8; // Observed usage for this workload (millicores / bytes / gpu-count / usage cost). + bool is_deleted = 9; // Whether this workload is soft-deleted. The frontend needs this to open the workload drawer correctly when a caller clicks a treemap/top-N node built from this entry, the same way it already does for table rows sourced from WorkloadItem.deleted_at. +} + +// WorkloadMetricBreakdown is a top-N + "other" rollup of one metric across all +// top-level workloads matching the filters. +message WorkloadMetricBreakdown { + repeated WorkloadMetricEntry top_entries = 1; // Top N by this metric, descending. + double other_value = 2; // Sum of value across everything NOT in top_entries. + int32 other_count = 3; // How many workloads are folded into other_value. + double total = 4; // Sum of value across ALL workloads (top_entries + other). + double requested_total = 5; // Sum of requested across ALL workloads; pair with total (usage) for request-utilization %. + int32 positive_count = 6; // How many workloads (top_entries + other, combined) have value > 0 for this metric. Use this, not top_entries+other_count, as the denominator for "N% of workloads account for ~80%" style displays — other_count includes workloads with zero value for this metric (e.g. a workload with no CPU usage still gets folded into "other"), which understates the percentage. + int32 top80_count = 7; // How many workloads, ranked by this metric descending, are needed to reach ~80% of total. Computed server-side over the FULL dataset, not just top_entries (which is capped at 50) — use this instead of walking top_entries client-side, which silently caps at 50 and under-reports on flatter distributions where more than 50 workloads are needed to reach 80%. +} + +// GetWorkloadsSummaryResponse carries one usage/cost breakdown per metric plus +// the total matching top-level workload count. The optimization_potential_* +// breakdowns re-rank the same workloads by the overprovisioned amount +// (requested - usage) for that metric, feeding each treemap's "show +// optimization potential" toggle without an approximation. +message GetWorkloadsSummaryResponse { + WorkloadMetricBreakdown cost = 1; + WorkloadMetricBreakdown cpu_usage = 2; + WorkloadMetricBreakdown memory_usage = 3; + WorkloadMetricBreakdown gpu_usage = 4; + int32 total_workload_count = 5; // Total top-level workloads matching filters. + WorkloadMetricBreakdown optimization_potential_cost = 6; // Ranked by overprovisioned cost (requested cost - usage cost), descending. + WorkloadMetricBreakdown optimization_potential_cpu = 7; // Ranked by overprovisioned cpu (cpu request - cpu usage, millicores), descending. + WorkloadMetricBreakdown optimization_potential_memory = 8; // Ranked by overprovisioned memory (memory request - memory usage, bytes), descending. + WorkloadMetricBreakdown optimization_potential_gpu = 9; // Ranked by overprovisioned gpu (gpu request - gpu usage, gpu-count), descending. +} + +// ListWorkloadsPaginatedResponse is one page of workloads plus the cursor for +// the next page and the total matching count (before pagination). +message ListWorkloadsPaginatedResponse { + repeated WorkloadItem workload_items = 1; // This page's workloads. + string next_page_token = 2; // Opaque cursor for the next page; empty = no more data. + int64 total_count = 3; // Total workloads matching the filters, before pagination. + int32 page_size = 4; // Effective page size applied after clamping; reflects the requested/clamped size, not len(workload_items). } // GetResourcesRequest is uset to fetch resources from db. @@ -76,8 +173,10 @@ message GetResourcesRequest { optional string cluster_id = 2; // Unique identifier for the cluster. K8sObjectKind kind = 3; // Type of object to get. optional string search = 4; // Search term to filter resources by name - + Pagination pagination = 11; // Pagination parameters + + repeated ResourceFieldFilter filters = 12; // Optional field-level filters; multiple filters AND together } // GetPodsRequest is used to fetch Pod resources from db. @@ -182,6 +281,18 @@ message GetResourcesResponse { Pagination pagination = 2; // Pagination information } +// GetResourceFilterOptionsRequest asks for the distinct filterable field values for a resource kind. +message GetResourceFilterOptionsRequest { + string team_id = 1; + optional string cluster_id = 2; + K8sObjectKind kind = 3; +} + +// GetResourceFilterOptionsResponse returns the available filter options per field. +message GetResourceFilterOptionsResponse { + repeated ResourceFilterFieldOptions options = 1; +} + // CreateClusterRequest is used to create a new cluster. message CreateClusterRequest { string team_id = 1; // Unique identifier for the team. @@ -382,6 +493,90 @@ message GetLatestContainerRequestLimitsResponse { repeated ContainerRequestLimits containers = 1; } +// GetNodeGPUMigInstancesRequest requests the most recent MIG-instance telemetry for a node. +message GetNodeGPUMigInstancesRequest { + string team_id = 1; + string cluster_id = 2; + optional string node_id = 3; // Unique identifier for the node. + optional string node_uid = 4; // alternatively -> Unique identifier for the node. +} + +// GetNodeGPUMigInstancesResponse returns the node's most recent MIG-instance telemetry. +message GetNodeGPUMigInstancesResponse { + repeated GPUMigInstance instances = 1; + optional google.protobuf.Timestamp collected_at = 2; +} + +// GetNodeGPUMigInstanceTimeseriesRequest requests per-MIG-instance +// utilization as a time series for a node over a time range. +message GetNodeGPUMigInstanceTimeseriesRequest { + string team_id = 1; + string cluster_id = 2; + optional string node_id = 3; + optional string node_uid = 4; + google.protobuf.Timestamp start_time = 5; + google.protobuf.Timestamp end_time = 6; +} + +// GPUMigInstanceDataPoint is one timestamped sample of a single MIG +// instance's utilization. +message GPUMigInstanceDataPoint { + google.protobuf.Timestamp timestamp = 1; + double tensor_active = 2; + double dram_active = 3; + double graphics_engine_active = 4; + double framebuffer_used = 5; + double framebuffer_total = 6; +} + +// GPUMigInstanceTimeseries is one MIG instance's identity plus its +// utilization samples over the requested time range. +message GPUMigInstanceTimeseries { + string mig_instance_id = 1; + string mig_profile = 2; + string device_uuid = 3; + string model_name = 4; + repeated GPUMigInstanceDataPoint points = 5; +} + +// GetNodeGPUMigInstanceTimeseriesResponse returns one series per MIG +// instance present on the node during the requested range. +message GetNodeGPUMigInstanceTimeseriesResponse { + repeated GPUMigInstanceTimeseries instances = 1; +} + +// GetContainerIndividualGPUMetricsRequest requests the most recent per-GPU breakdown per container. +message GetContainerIndividualGPUMetricsRequest { + string team_id = 1; + string cluster_id = 2; + string uid = 3; +} + +// GetContainerIndividualGPUMetricsResponse returns per-container per-GPU breakdowns. +message GetContainerIndividualGPUMetricsResponse { + repeated ContainerIndividualGPUMetrics containers = 1; +} + +// LanguageVersions holds every distinct version detected for one language +// across a cluster's workloads. +message LanguageVersions { + string language = 1; + repeated string versions = 2; +} + +// GetWorkloadLanguagesRequest requests the distinct languages/versions +// detected across a cluster's workloads (used to populate filter dropdowns). +message GetWorkloadLanguagesRequest { + string team_id = 1; + string cluster_id = 2; +} + +// GetWorkloadLanguagesResponse returns every distinct language and its +// detected versions for the requested cluster. +message GetWorkloadLanguagesResponse { + repeated LanguageVersions languages = 1; +} + // Request to get forecasted workloads message GetForecastWorkloadsRequest { string team_id = 1; @@ -596,6 +791,10 @@ message GetLatestOperatorVersionResponse { OperatorInfo trezr_info = 41; OperatorInfo trezr_helm_info = 42; + + // checkpoint-restore-operator helm chart (snapshot policies). Placeholder + // version until the DevZero-authored chart is published. + OperatorInfo snapshot_helm_info = 51; } message GalaxyGetWorkloadPerspectiveRequest { @@ -1038,6 +1237,15 @@ service K8SService { // GetWorkloads retrieves all workloads for a specific cluster. rpc GetWorkloads(GetWorkloadsRequest) returns (GetWorkloadsResponse); + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + rpc ListWorkloadsPaginated(ListWorkloadsPaginatedRequest) returns (ListWorkloadsPaginatedResponse); + + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + rpc GetWorkloadsSummary(GetWorkloadsSummaryRequest) returns (GetWorkloadsSummaryResponse); + // GetWorkload retrieves detailed information for a specific workload. rpc GetWorkload(GetWorkloadRequest) returns (GetWorkloadResponse); @@ -1053,6 +1261,22 @@ service K8SService { // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. rpc GetLatestContainerRequestLimits(GetLatestContainerRequestLimitsRequest) returns (GetLatestContainerRequestLimitsResponse); + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + rpc GetNodeGPUMigInstances(GetNodeGPUMigInstancesRequest) returns (GetNodeGPUMigInstancesResponse); + + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + rpc GetNodeGPUMigInstanceTimeseries(GetNodeGPUMigInstanceTimeseriesRequest) returns (GetNodeGPUMigInstanceTimeseriesResponse); + + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + rpc GetContainerIndividualGPUMetrics(GetContainerIndividualGPUMetricsRequest) returns (GetContainerIndividualGPUMetricsResponse); + + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + rpc GetWorkloadLanguages(GetWorkloadLanguagesRequest) returns (GetWorkloadLanguagesResponse); + // GetForecastWorkloads retrieves all workloads for a specific cluster. rpc GetForecastWorkloads(GetForecastWorkloadsRequest) returns (GetForecastWorkloadsResponse) { option deprecated = true; @@ -1067,6 +1291,9 @@ service K8SService { // GetResources retrivers specific resource and their details from db, simulating informer. rpc GetResources(GetResourcesRequest) returns (GetResourcesResponse); + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + rpc GetResourceFilterOptions(GetResourceFilterOptionsRequest) returns (GetResourceFilterOptionsResponse); + // GetPods retrieves Pod resources and their details from db. rpc GetPods(GetPodsRequest) returns (GetPodsResponse); @@ -1108,6 +1335,32 @@ service K8SService { // ListTags lists all tags for a team. rpc ListTags(ListTagsRequest) returns (ListTagsResponse); + + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + rpc GetMigPartedConfig(GetMigPartedConfigRequest) returns (GetMigPartedConfigResponse); +} + +message GetMigPartedConfigRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetMigPartedConfigResponse { + // Whether a mig-parted ConfigMap has been collected for this cluster. + bool found = 1; + string name = 2; + string namespace = 3; + // Config schema version (e.g. v1). + string version = 4; + // Parsed profile map from config.yaml as JSON: + // {profile-name: [{devices, mig-enabled, mig-devices}, ...]}. + string mig_configs_json = 5; + // Original config.yaml text; authoritative when parse_error is set. + string raw = 6; + string parse_error = 7; + google.protobuf.Timestamp last_seen = 8; } // ClusterMutationService manages mutating cluster resources. diff --git a/internal/proto/api/v1/profiling.proto b/internal/proto/api/v1/profiling.proto index 53489ef..86c530b 100644 --- a/internal/proto/api/v1/profiling.proto +++ b/internal/proto/api/v1/profiling.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package api.v1; import "google/protobuf/timestamp.proto"; +import "google/type/money.proto"; import "api/v1/common.proto"; option go_package = "github.com/devzero-inc/services/dakr/gen/api/v1;gen"; @@ -12,6 +13,13 @@ option java_package = "gen.api.v1"; service ProfilingService { rpc GetWorkloadProfiles(GetWorkloadProfilesRequest) returns (GetWorkloadProfilesResponse); + + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + rpc GetWorkloadProfileAvailability(GetWorkloadProfileAvailabilityRequest) + returns (GetWorkloadProfileAvailabilityResponse); } message ProfilingWorkloadKey { @@ -26,12 +34,36 @@ message GetWorkloadProfilesRequest { optional google.protobuf.Timestamp start_time = 11; optional google.protobuf.Timestamp end_time = 12; + + // When set to 1D or 7D, serve from the persisted workload_profile_cache + // snapshot for that window instead of computing live over start_time/end_time. + // UNSPECIFIED (default) preserves today's live-compute behavior. + ProfileWindow window = 13; } message GetWorkloadProfilesResponse { repeated WorkloadProfileResult workload_profiles = 1; } +message GetWorkloadProfileAvailabilityRequest { + string team_id = 1; + string cluster_id = 2; +} + +// ProfileWindowAvailability summarizes the cached-snapshot state for a single +// profile window. available reflects both presence (workload_count > 0) and +// freshness (latest_computed_at within the window's staleness threshold). +message ProfileWindowAvailability { + bool available = 1; + google.protobuf.Timestamp latest_computed_at = 2; + int32 workload_count = 3; +} + +message GetWorkloadProfileAvailabilityResponse { + ProfileWindowAvailability window_1d = 1; + ProfileWindowAvailability window_7d = 2; +} + message WorkloadProfileResult { string kind = 1; string uid = 2; @@ -39,6 +71,17 @@ message WorkloadProfileResult { ProfilingClassification classification = 4; double confidence = 5; ProfileDataQuality data_quality = 6; + + // The window over which this profile's distributions were computed. + google.protobuf.Timestamp window_start = 7; + google.protobuf.Timestamp window_end = 8; + + // distribution_source identifies how the percentile distributions were + // derived. "exact_timeseries" = exact percentiles over the deduplicated + // busiest-pod-per-minute series (engine path); "sketch" = GK sketch + // aggregates (tail may collapse onto max — do not label as P99 on fleet + // screens). + string distribution_source = 9; } message ContainerProfileResult { @@ -200,6 +243,45 @@ message ContainerProfileSnapshot { bool insufficient_data = 12; int64 current_cpu_request_millicores = 13; int64 current_memory_request_bytes = 14; + // Container-level startup timing (scheduled -> Ready condition). + double avg_time_to_ready_ms = 15; + double p50_time_to_ready_ms = 16; + double p75_time_to_ready_ms = 17; + double p95_time_to_ready_ms = 18; + double p99_time_to_ready_ms = 19; + double p999_time_to_ready_ms = 20; + double max_time_to_ready_ms = 21; + // Container-level startup timing (container create -> Running state). + double avg_time_to_running_ms = 22; + double p50_time_to_running_ms = 23; + double p75_time_to_running_ms = 24; + double p95_time_to_running_ms = 25; + double p99_time_to_running_ms = 26; + double p999_time_to_running_ms = 27; + double max_time_to_running_ms = 28; +} + +// WorkloadPeerConnectivity describes one outbound (egress) internal +// workload-to-workload traffic edge from the profiled workload to a destination +// workload in the same cluster, aggregated over the profile window. Only +// internal cluster traffic is represented here (destination workload +// name/namespace populated); external egress is out of scope. +message WorkloadPeerConnectivity { + // Stable owner-workload UID of the destination, resolved at ingestion. Used + // for stable peer identity — name/namespace alone can collide across workload + // replacements. + string dst_workload_uid = 1; + string dst_workload_name = 2; + string dst_namespace = 3; + // traffic_type mirrors models.TrafficType (e.g. INTERNAL_SAME_NODE, + // INTERNAL_SAME_AZ, INTERNAL_CROSS_AZ). Kept as a string to match the + // ClickHouse-stored classification. + string traffic_type = 4; + // Total transmit/receive bytes over the profile window for this edge. + int64 tx_bytes = 5; + int64 rx_bytes = 6; + // Total network cost attributed to this edge over the window. + google.type.Money cost = 7; } message WorkloadProfileSnapshot { @@ -209,4 +291,34 @@ message WorkloadProfileSnapshot { ProfileDataQuality data_quality = 4; google.protobuf.Timestamp computed_at = 5; string ui_url = 6; + // Workload-level startup aggregates, pooled across every container of every + // pod in the window. Mirrors WorkloadHealthSummary's startup fields. + double avg_time_to_ready_ms = 7; + double p50_time_to_ready_ms = 8; + double p75_time_to_ready_ms = 9; + double p95_time_to_ready_ms = 10; + double p99_time_to_ready_ms = 11; + double p999_time_to_ready_ms = 12; + double max_time_to_ready_ms = 13; + // Always false from this pipeline: the batched cluster-wide fetch does not + // compute a previous-period comparison, matching the existing precedent in + // GetWorkloadHealthSummaries's cluster-list handler. + bool startup_degraded = 14; + // False when no container_startup_lifecycles rows matched this workload in + // the window — i.e. no pod lifecycle transitions (Pending, ContainerCreating, + // Running, or Ready) were observed for it, so the zero-valued timing fields + // above mean "no data" rather than a real zero-latency startup. + // + // Reflects workload-level (time_to_ready_ms) presence only. A workload can + // have has_startup_data=false with all *_time_to_ready_ms fields zero, while + // its containers[].{avg,p50,...}_time_to_running_ms are still populated — + // e.g. containers that reached Running but never became Ready in the + // window. Do not use this flag to gate reads of container-level + // *_time_to_running_ms; check each container's own fields instead. + bool has_startup_data = 15; + + // peers carries the top outbound internal workload-to-workload traffic edges + // from this workload over the profile window (capped, ranked by tx+rx bytes). + // Only internal cluster traffic is included; external egress is excluded. + repeated WorkloadPeerConnectivity peers = 16; } diff --git a/internal/proto/api/v1/recommendation.proto b/internal/proto/api/v1/recommendation.proto index 97db482..1c8c34e 100644 --- a/internal/proto/api/v1/recommendation.proto +++ b/internal/proto/api/v1/recommendation.proto @@ -12,6 +12,7 @@ import "google/type/money.proto"; import "api/v1/common.proto"; import "api/v1/instance.proto"; import "api/v1/k8s.proto"; +import "api/v1/hpa_connector.proto"; import "api/v1/profiling.proto"; service K8sRecommendationService { @@ -121,6 +122,26 @@ service K8sRecommendationService { rpc DeleteNodePolicy(DeleteNodePolicyRequest) returns (DeleteNodePolicyResponse); rpc SuggestedNodePolicy(SuggestedNodePolicyRequest) returns (SuggestedNodePolicyResponse); rpc SuggestedKarpenterConfig(SuggestedKarpenterConfigRequest) returns (SuggestedKarpenterConfigResponse); + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + rpc SuggestNodePolicyImprovements(SuggestNodePolicyImprovementsRequest) returns (SuggestNodePolicyImprovementsResponse); + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + rpc ListClusterNodePolicySuggestions(ListClusterNodePolicySuggestionsRequest) returns (ListClusterNodePolicySuggestionsResponse); // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. rpc GenerateNodePoliciesFromKarpenter(GenerateNodePoliciesFromKarpenterRequest) returns (GenerateNodePoliciesFromKarpenterResponse); @@ -128,14 +149,66 @@ service K8sRecommendationService { // k8s_nodes metadata for clusters without Karpenter/dzkarp. rpc GenerateNodePoliciesFromNodeGroups(GenerateNodePoliciesFromNodeGroupsRequest) returns (GenerateNodePoliciesFromNodeGroupsResponse); + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + rpc GetNodeGroupsCheckpointStatus(GetNodeGroupsCheckpointStatusRequest) returns (GetNodeGroupsCheckpointStatusResponse); + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + rpc SetNodePolicyCheckpointLabel(SetNodePolicyCheckpointLabelRequest) returns (SetNodePolicyCheckpointLabelResponse); + + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + rpc EnableCheckpointForPolicy(EnableCheckpointForPolicyRequest) returns (EnableCheckpointForPolicyResponse); + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // policy. The FE polls this while a batch is in flight so the toggle CTA can + // render "9/10 labelled, 1 failed". + rpc GetCheckpointApplyStatus(GetCheckpointApplyStatusRequest) returns (GetCheckpointApplyStatusResponse); + + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + rpc GetClusterCheckpointLabelCoverage(GetClusterCheckpointLabelCoverageRequest) returns (GetClusterCheckpointLabelCoverageResponse); + + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + rpc ListNodeGroupCheckpointLabelState(ListNodeGroupCheckpointLabelStateRequest) returns (ListNodeGroupCheckpointLabelStateResponse); + // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. rpc GetNodeAnnotationReadiness(GetNodeAnnotationReadinessRequest) returns (GetNodeAnnotationReadinessResponse); + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + rpc DetectClusterAutoscaler(DetectClusterAutoscalerRequest) returns (DetectClusterAutoscalerResponse); + // Migration wizard state management rpc GetMigrationState(GetMigrationStateRequest) returns (GetMigrationStateResponse); rpc UpdateMigrationState(UpdateMigrationStateRequest) returns (UpdateMigrationStateResponse); + // Karpenter migration wizard + rpc GetKarpenterMigrationState(GetKarpenterMigrationStateRequest) returns (GetKarpenterMigrationStateResponse); + rpc UpdateKarpenterMigrationState(UpdateKarpenterMigrationStateRequest) returns (UpdateKarpenterMigrationStateResponse); + rpc DetectKarpenterOwnershipConflicts(DetectKarpenterOwnershipConflictsRequest) returns (DetectKarpenterOwnershipConflictsResponse); + rpc AcknowledgeKarpenterOwnershipConflict(AcknowledgeKarpenterOwnershipConflictRequest) returns (AcknowledgeKarpenterOwnershipConflictResponse); + rpc GetKarpenterSourceResources(GetKarpenterSourceResourcesRequest) returns (GetKarpenterSourceResourcesResponse); + rpc GetKarpenterAdoptionStatus(GetKarpenterAdoptionStatusRequest) returns (GetKarpenterAdoptionStatusResponse); + // NodePool validation phone-home rpc ReportNodePoolValidation(ReportNodePoolValidationRequest) returns (ReportNodePoolValidationResponse); rpc GetNodePoolValidations(GetNodePoolValidationsRequest) returns (GetNodePoolValidationsResponse); @@ -150,6 +223,7 @@ service K8sRecommendationService { rpc GetInstanceSizes(GetInstanceSizesRequest) returns (GetInstanceSizesResponse); rpc GetInstanceCategories(GetInstanceCategoriesRequest) returns (GetInstanceCategoriesResponse); + rpc GetInstanceShapes(GetInstanceShapesRequest) returns (GetInstanceShapesResponse); rpc GetInstanceCPUs(GetInstanceCPUsRequest) returns (GetInstanceCPUsResponse); rpc GetInstanceTypeNames(GetInstanceTypeNamesRequest) returns (GetInstanceTypeNamesResponse); @@ -159,6 +233,11 @@ service K8sRecommendationService { rpc CreatePodDisruptionBudget(CreatePodDisruptionBudgetRequest) returns (CreatePodDisruptionBudgetResponse); // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) rpc GetPDBRecommendationForWorkload(GetPDBRecommendationForWorkloadRequest) returns (GetPDBRecommendationForWorkloadResponse); + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + rpc ListWorkloadStructuralHealth(ListWorkloadStructuralHealthRequest) returns (ListWorkloadStructuralHealthResponse); // Storage Recommendation Policies rpc CreateStorageRecommendationPolicy(CreateStorageRecommendationPolicyRequest) returns (CreateStorageRecommendationPolicyResponse); @@ -194,11 +273,32 @@ service K8sRecommendationService { rpc CreateWorkloadOptimizationPolicy(CreateWorkloadOptimizationPolicyRequest) returns (CreateWorkloadOptimizationPolicyResponse); rpc ListWorkloadOptimizationPolicies(ListWorkloadOptimizationPoliciesRequest) returns (ListWorkloadOptimizationPoliciesResponse); rpc GetWorkloadOptimizationPolicy(GetWorkloadOptimizationPolicyRequest) returns (GetWorkloadOptimizationPolicyResponse); + rpc GetWorkloadOptimizationPolicyByWorkload(GetWorkloadOptimizationPolicyByWorkloadRequest) returns (GetWorkloadOptimizationPolicyByWorkloadResponse); rpc UpdateWorkloadOptimizationPolicy(UpdateWorkloadOptimizationPolicyRequest) returns (UpdateWorkloadOptimizationPolicyResponse); + // The sole way to change an existing policy's disabled state. See message doc. + rpc ToggleWorkloadOptimizationPolicyDisabled(ToggleWorkloadOptimizationPolicyDisabledRequest) returns (ToggleWorkloadOptimizationPolicyDisabledResponse); rpc DeleteWorkloadOptimizationPolicy(DeleteWorkloadOptimizationPolicyRequest) returns (DeleteWorkloadOptimizationPolicyResponse); + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + rpc PreviewWorkloadOptimizationPolicyMatches(PreviewWorkloadOptimizationPolicyMatchesRequest) returns (PreviewWorkloadOptimizationPolicyMatchesResponse); + + // Scheduler Policies: CRUD + targeting preview + rpc CreateSchedulerPolicy(CreateSchedulerPolicyRequest) returns (CreateSchedulerPolicyResponse); + rpc ListSchedulerPolicies(ListSchedulerPoliciesRequest) returns (ListSchedulerPoliciesResponse); + rpc UpdateSchedulerPolicy(UpdateSchedulerPolicyRequest) returns (UpdateSchedulerPolicyResponse); + rpc ToggleSchedulerPolicyDisabled(ToggleSchedulerPolicyDisabledRequest) returns (ToggleSchedulerPolicyDisabledResponse); + rpc DeleteSchedulerPolicy(DeleteSchedulerPolicyRequest) returns (DeleteSchedulerPolicyResponse); + rpc PreviewSchedulerPolicyTargets(PreviewSchedulerPolicyTargetsRequest) returns (PreviewSchedulerPolicyTargetsResponse); + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + rpc ListSchedulerPolicyEnrollments(ListSchedulerPolicyEnrollmentsRequest) returns (ListSchedulerPolicyEnrollmentsResponse); // MPA V3: Workload Rules (CRUD) rpc UpsertManualWorkloadRule(UpsertManualWorkloadRuleRequest) returns (UpsertManualWorkloadRuleResponse); + // The sole way to change an EXISTING rule's disabled state. See message doc. + rpc ToggleWorkloadRuleDisabled(ToggleWorkloadRuleDisabledRequest) returns (ToggleWorkloadRuleDisabledResponse); rpc PreviewWorkloadRule(PreviewWorkloadRuleRequest) returns (PreviewWorkloadRuleResponse); rpc GetWorkloadRulesByPolicy(GetWorkloadRulesByPolicyRequest) returns (GetWorkloadRulesByPolicyResponse); rpc ListWorkloadRules(ListWorkloadRulesRequest) returns (ListWorkloadRulesResponse); @@ -206,11 +306,64 @@ service K8sRecommendationService { rpc GetWorkloadRuleByWorkload(GetWorkloadRuleByWorkloadRequest) returns (GetWorkloadRuleByWorkloadResponse); rpc GetWorkloadByWorkloadRule(GetWorkloadByWorkloadRuleRequest) returns (GetWorkloadByWorkloadRuleResponse); rpc DeleteWorkloadRule(DeleteWorkloadRuleRequest) returns (DeleteWorkloadRuleResponse); + rpc DeleteAllWorkloadRules(DeleteAllWorkloadRulesRequest) returns (DeleteAllWorkloadRulesResponse); + rpc BulkDeleteWorkloadRules(BulkDeleteWorkloadRulesRequest) returns (BulkDeleteWorkloadRulesResponse); + rpc BulkToggleWorkloadRulesDisabled(BulkToggleWorkloadRulesDisabledRequest) returns (BulkToggleWorkloadRulesDisabledResponse); rpc GetWorkloadContainerNames(GetWorkloadContainerNamesRequest) returns (GetWorkloadContainerNamesResponse); rpc BatchAutoOptimizeWorkloads(BatchAutoOptimizeWorkloadsRequest) returns (BatchAutoOptimizeWorkloadsResponse); + rpc BatchUpsertManualWorkloadRules(BatchUpsertManualWorkloadRulesRequest) returns (BatchUpsertManualWorkloadRulesResponse); + rpc BatchPreviewWorkloadRules(BatchPreviewWorkloadRulesRequest) returns (BatchPreviewWorkloadRulesResponse); + rpc ApplyOneTimeOptimization(ApplyOneTimeOptimizationRequest) returns (ApplyOneTimeOptimizationResponse); + + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + rpc DeleteRuleAndApplyRecommendation(DeleteRuleAndApplyRecommendationRequest) returns (DeleteRuleAndApplyRecommendationResponse); // Get current node pool config status and recent apply history for a cluster rpc GetNodeRecommendationStatus(GetNodeRecommendationStatusRequest) returns (GetNodeRecommendationStatusResponse); + + // ---- Snapshot policies (resilience) — spec §5 ---- + rpc CreateSnapshotPolicies(CreateSnapshotPoliciesRequest) returns (CreateSnapshotPoliciesResponse); + rpc ListSnapshotPolicies(ListSnapshotPoliciesRequest) returns (ListSnapshotPoliciesResponse); + rpc UpdateSnapshotPolicy(UpdateSnapshotPolicyRequest) returns (UpdateSnapshotPolicyResponse); + rpc DeleteSnapshotPolicy(DeleteSnapshotPolicyRequest) returns (DeleteSnapshotPolicyResponse); + rpc CreateSnapshotPolicyTargets(CreateSnapshotPolicyTargetsRequest) returns (CreateSnapshotPolicyTargetsResponse); + rpc ListSnapshotPolicyTargets(ListSnapshotPolicyTargetsRequest) returns (ListSnapshotPolicyTargetsResponse); + rpc UpdateSnapshotPolicyTarget(UpdateSnapshotPolicyTargetRequest) returns (UpdateSnapshotPolicyTargetResponse); + rpc DeleteSnapshotPolicyTarget(DeleteSnapshotPolicyTargetRequest) returns (DeleteSnapshotPolicyTargetResponse); + + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + rpc CreateForensicSnapshotPolicies(CreateForensicSnapshotPoliciesRequest) returns (CreateForensicSnapshotPoliciesResponse); + rpc ListForensicSnapshotPolicies(ListForensicSnapshotPoliciesRequest) returns (ListForensicSnapshotPoliciesResponse); + rpc UpdateForensicSnapshotPolicy(UpdateForensicSnapshotPolicyRequest) returns (UpdateForensicSnapshotPolicyResponse); + rpc DeleteForensicSnapshotPolicy(DeleteForensicSnapshotPolicyRequest) returns (DeleteForensicSnapshotPolicyResponse); + rpc CreateForensicSnapshotPolicyTargets(CreateForensicSnapshotPolicyTargetsRequest) returns (CreateForensicSnapshotPolicyTargetsResponse); + rpc ListForensicSnapshotPolicyTargets(ListForensicSnapshotPolicyTargetsRequest) returns (ListForensicSnapshotPolicyTargetsResponse); + rpc UpdateForensicSnapshotPolicyTarget(UpdateForensicSnapshotPolicyTargetRequest) returns (UpdateForensicSnapshotPolicyTargetResponse); + rpc DeleteForensicSnapshotPolicyTarget(DeleteForensicSnapshotPolicyTargetRequest) returns (DeleteForensicSnapshotPolicyTargetResponse); + // Arms a forensic capture run: the ONLY way run_generation moves. + rpc TriggerForensicSnapshotRun(TriggerForensicSnapshotRunRequest) returns (TriggerForensicSnapshotRunResponse); + + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + rpc ListReferencedAuthentications(ListReferencedAuthenticationsRequest) returns (ListReferencedAuthenticationsResponse); + + // ---- Targeting preview + read model + delivery status ---- + rpc PreviewSnapshotPolicyTargetMatches(PreviewSnapshotPolicyTargetMatchesRequest) returns (PreviewSnapshotPolicyTargetMatchesResponse); + rpc PreviewForensicSnapshotPolicyTargetMatches(PreviewForensicSnapshotPolicyTargetMatchesRequest) returns (PreviewForensicSnapshotPolicyTargetMatchesResponse); + rpc GetSnapshotPolicyTargetRenderedScope(GetSnapshotPolicyTargetRenderedScopeRequest) returns (GetSnapshotPolicyTargetRenderedScopeResponse); + rpc GetForensicSnapshotPolicyTargetRenderedScope(GetForensicSnapshotPolicyTargetRenderedScopeRequest) returns (GetForensicSnapshotPolicyTargetRenderedScopeResponse); + rpc GetSnapshotRecommendationStatus(GetSnapshotRecommendationStatusRequest) returns (GetSnapshotRecommendationStatusResponse); + rpc GetForensicSnapshotRecommendationStatus(GetForensicSnapshotRecommendationStatusRequest) returns (GetForensicSnapshotRecommendationStatusResponse); + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + rpc PreviewSnapshotRecommendationConfig(PreviewSnapshotRecommendationConfigRequest) returns (PreviewSnapshotRecommendationConfigResponse); + rpc PreviewForensicSnapshotRecommendationConfig(PreviewForensicSnapshotRecommendationConfigRequest) returns (PreviewForensicSnapshotRecommendationConfigResponse); } message GetRecommendationsRequest { @@ -340,12 +493,10 @@ message GetPreviewWorkloadRecommendationRequest { // Moment in time for which the recommendations are requested // If not set, the current time is used google.protobuf.Timestamp timestamp = 8; - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - google.protobuf.Duration vpa_lookback = 9; - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - google.protobuf.Duration hpa_lookback = 10; + // 9, 10: removed vpa_lookback / hpa_lookback — never read by either engine. + // The metrics window comes from the policy's loopback_period_seconds. + reserved 9, 10; + reserved "vpa_lookback", "hpa_lookback"; bool include_deleted = 21; } @@ -362,12 +513,10 @@ message GetPreviewWorkloadRecommendationsRequest { // Moment in time for which the recommendations are requested // If not set, the current time is used google.protobuf.Timestamp timestamp = 5; - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - google.protobuf.Duration vpa_lookback = 6; - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - google.protobuf.Duration hpa_lookback = 7; + // 6, 7: removed vpa_lookback / hpa_lookback — never read by either engine. + // The metrics window comes from the policy's loopback_period_seconds. + reserved 6, 7; + reserved "vpa_lookback", "hpa_lookback"; bool include_deleted = 21; } @@ -725,8 +874,10 @@ message WorkloadPolicyTarget { optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; // Target specific workload kinds optional RegexPattern namespace_pattern = 17; // Target namespaces by name pattern + repeated string workload_names_not_in = 18; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 19; // Exclude specific workload kinds - repeated string node_group_names = 21; // target workloads running on specific nodes + repeated string node_group_names = 21 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. repeated string cluster_ids = 31; @@ -751,8 +902,10 @@ message CreateWorkloadPolicyTargetRequest { optional RegexPattern name_pattern = 14; // Target workloads by name pattern optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; - repeated string node_group_names = 17; + repeated string node_group_names = 17 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 18; // Target namespaces by name pattern + repeated string workload_names_not_in = 19; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 20; // Exclude specific workload kinds repeated string cluster_ids = 21; } @@ -798,8 +951,10 @@ message UpdateWorkloadPolicyTargetRequest { optional RegexPattern name_pattern = 14; // Target workloads by name pattern optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; - repeated string node_group_names = 17; + repeated string node_group_names = 17 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 18; // Target namespaces by name pattern + repeated string workload_names_not_in = 19; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 20; // Exclude specific workload kinds optional string policy_id = 21; // should only be set when target needs to be attached to diff policy @@ -851,8 +1006,10 @@ message PreviewWorkloadPolicyTargetMatchesRequest { optional RegexPattern name_pattern = 6; // Target workloads by name pattern optional LabelSelector annotation_selector = 7; // Target workloads by annotations repeated string workload_names = 8; - repeated string node_group_names = 9; + repeated string node_group_names = 9 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 10; // Target namespaces by name pattern + repeated string workload_names_not_in = 11; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 12; // Exclude specific workload kinds } message PreviewWorkloadPolicyTargetMatchesResponse { @@ -872,10 +1029,24 @@ message GetPreviewWorkloadPolicyTargetRecommendationsRequest { repeated string workload_names = 9; repeated string node_group_names = 10; optional RegexPattern namespace_pattern = 11; // Target namespaces by name pattern + repeated string workload_names_not_in = 12; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 13; // Exclude specific workload kinds bool include_deleted = 21; repeated string cluster_ids = 31; + + // Priority of the previewed target; used to determine who wins when a + // competing target exists for the same workload. When absent, collision + // detection is skipped and collisions_by_workload_uid is empty. + optional int32 priority = 32; +} + +message WorkloadCollisionInfo { + string policy_id = 1; + string policy_name = 2; + string target_id = 3; + string target_name = 4; } message GetPreviewWorkloadPolicyTargetRecommendationsResponse { @@ -883,6 +1054,12 @@ message GetPreviewWorkloadPolicyTargetRecommendationsResponse { repeated WorkloadItem workload_items = 2; // Map from workload UID to aggregated percentile summaries across all containers map workload_percentiles = 3; + // Workloads where a competing policy's target beats the previewed target. + // Absent entries mean the current policy wins or no competing target exists. + map collisions_by_workload_uid = 4; + // UIDs of workloads skipped because they are managed by optimization rules (MPA v2). + // Policy-based optimization cannot be applied to these workloads. + repeated string rule_managed_workload_uids = 5; } // WorkloadPercentileSummary aggregates percentile metrics across all containers of a workload. @@ -1019,6 +1196,26 @@ message BalanceGetRecommendationsRequest { // Sent when RuleEvaluatorController generates a recommendation from evaluating a WorkloadRule WorkloadRecommendation in_cluster_recommendation = 21; + // Snapshot policies (spec §8): periodic full snapshot of the + // dakr-managed criu.org CR statuses from the cluster. The operator + // emits no Kubernetes Events — CR status is the entire runtime + // observability channel. dakr ingests with full-sync semantics + // (upsert reported, soft-delete unreported). + SnapshotCRStatusReport snapshot_cr_status_report = 31; + + // Periodic full-sync report of scheduler enrollment state observed + // in-cluster: original-scheduler captures at first application. + // Full-sync semantics mirror SnapshotCRStatusReport. Revert acks do + // NOT ride this message — they use apply with + // RECOMMENDATION_TYPE_SCHEDULER_POLICY and the enrollment id. + SchedulerEnrollmentReport scheduler_enrollment_report = 32; + + // Fail-open scheduler revert events observed by the admission + // failsafe: pods steered away from an unhealthy tracked scheduler at + // CREATE time. Batched per stream tick, replica-local (each tunr + // replica reports only what its own webhook process observed). + SchedulerRevertEventReport scheduler_revert_event_report = 33; + // health check APIs OperatorHealth operator_health = 71; AgentHealth agent_health = 81; @@ -1058,6 +1255,19 @@ message BalanceGetRecommendationsResponse { // KarpenterSettings CRD push-down KarpenterSettingsRecommendation karpenter_settings = 62; + + // Snapshot policy CRD bundles (checkpoint-restore-operator, spec §7) + SnapshotRecommendation snapshot_recommendation = 63; + ForensicSnapshotRecommendation forensic_snapshot_recommendation = 64; + + // HPA connector CRD push-down + BatchHPAConnectors batch_hpa_connectors = 65; + + // Full desired scheduler-policy set for this cluster plus pending + // revert instructions. Hash-gated full-sync push (see + // scheduler_policy_delivery.go); tunr reconciles it into the + // cluster-scoped SchedulerPolicy CRD and executes reverts. + SchedulerPolicySync scheduler_policy_sync = 66; } string request_id = 99; // optional } @@ -1112,15 +1322,58 @@ message WorkloadRule { // in-place pod vertical scaling instead of triggering pod restarts. bool use_in_place_vertical_scaling = 70; + // Opt-in: allow an in-place resize to LOWER a container's memory limit. + // Only consulted when use_in_place_vertical_scaling is true, and it never + // relaxes the Kubernetes version gate — a decrease still additionally + // requires a cluster new enough to accept one. Default false because + // shrinking a live container's memory limit can OOM-kill it. + bool allow_in_place_memory_limit_decrease = 71; + // UI display fields (not sent to cluster, only used for listing) string status = 80; // "active" or "inactive" string sync_status = 81; // "pending", "synced", or "failed" string current_source = 82; // "crd", "policy", "auto_optimization", "manual", "pulumi_manual", "pulumi_auto", "terraform_manual", "terraform_auto" google.protobuf.Timestamp created_at = 83; google.protobuf.Timestamp updated_at = 84; + // True when the underlying workload (cluster_id, namespace, kind, name) + // is no longer present in the cluster. Populated by ListWorkloadRules + // at read time via a presence lookup against the workload tables — NOT + // persisted on the rule itself. Orthogonal to `status` (which reflects + // whether the rule's policy is enabled) — an Active rule can be + // orphaned if its workload was deleted, and will be cleaned up by the + // orphan janitor after a grace period. + bool is_orphaned = 85; // Per-container resource configurations (VPA). When empty, workload-level rules apply to all containers. repeated ContainerResourceRuleConfig containers = 90; + + // JVM heap optimization overrides for this rule. + JVMHeapRuleConfig jvm_heap_rule = 91; + + // Per-rule override of the JVM CPU startup floor (millicores). Standalone — + // deliberately NOT inside jvm_heap_rule and not gated by its enabled flag + // (the floor is always-on for detected JVMs). Unset = inherit policy / + // system default (75m). Explicit 0 = floor disabled for this rule. + optional int64 jvm_cpu_startup_floor_millicores = 92; + + // Rule-wide on/off switch, independent of `status`/`sync_status`. A + // disabled rule still exists (status stays "active") but every CP loop + // and the in-cluster operator treat it as a full no-op: no further + // regeneration, no evaluation, no emergency OOM/throttle response. + bool disabled = 93; + + // Per-rule override of the metrics lookback window (seconds). Unset = + // inherit the owning policy's window, else the 7-day default. + // + // Mirrored onto the CRD for visibility only — the operator evaluates off + // zxporter's rolling 5-minute window and never queries history. + optional int32 lookback_period_seconds = 94; + + // KEDA ScaledObject template authored by dakr and carried to tunr. + // When set, tunr owns the ScaledObject lifecycle (create/update/delete) + // rather than generating its own HPA. Renumbered 94→95 on the main merge + // (main took 94 for lookback_period_seconds). + optional KEDAScaledObjectTemplate keda_scaled_object = 95; } message ResourceRuleConfig { @@ -1140,6 +1393,57 @@ message ResourceRuleConfig { // Whether to actively remove limits from workloads. bool limits_removal_enabled = 13; + + // Human-readable annotations from the engine: clamp messages, pmax / + // throttle / OOM floor activation, and "request exceeds existing limit" + // warnings. Surfaced through PreviewWorkloadRule so the UI can show why + // the produced BaseRequest differs from the user's expectation. Not + // persisted — recomputed on every generation/preview. + repeated string notes = 14; + + // Recommendation floor (rules/v2, request only): the recommended request + // is never lowered below floor_percent% (1-100) of initial_request, the + // cached immutable baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. initial_request is editable + // through the generic manual-rule surface like min_request (no special + // protection). Unset floor_percent = floor disabled. Resolved in the + // in-cluster tunr evaluator, not pre-resolved by dakr. + optional int64 initial_request = 15; + optional int64 floor_percent = 16; + + // Recommendation ceiling (rules/v2, request only): the recommended request + // is never raised above ceiling_percent% (1-1000) of initial_request. The + // mirror of floor_percent; a ceiling below 100 is intentionally allowed as + // a baseline-relative cap distinct from max_request. Unset = ceiling + // disabled. Resolved in the in-cluster tunr evaluator, not pre-resolved by + // dakr. + optional int64 ceiling_percent = 17; + + // Limit floor/ceiling (rules/v2, limit only): the recommended limit is + // never lowered below limit_floor_percent% (1-100) nor raised above + // limit_ceiling_percent% (1-1000) of initial_limit, the cached immutable + // initial-limit baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. Applied only when limits + // adjustment is enabled and limits removal is not; the recommended + // request always wins over the limit ceiling (the limit is never clamped + // below the request). Unset = bound disabled. Resolved in the in-cluster + // tunr evaluator, not pre-resolved by dakr. + optional int64 initial_limit = 18; + optional int64 limit_floor_percent = 19; + optional int64 limit_ceiling_percent = 20; + + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + optional bool request_use_rss = 21; + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + optional bool limit_use_rss = 22; + + // Memory-only: request-equivalent baseline on the *limit* basis (bytes). The + // generator emits this only when the limit basis differs from the request + // basis (RSS vs working set); 0 otherwise, meaning "derive the limit as + // request × limit_multiplier" (byte-identical default). NOT pre-multiplied. + // Consumed by the in-cluster tunr evaluator's normal-mode baseline path. + int64 base_limit = 23; } message HPAMetricTrigger { @@ -1150,6 +1454,7 @@ message HPAMetricTrigger { map metadata = 5; // Free-form key-value for external scalers (e.g. serverAddress, query for Prometheus) optional string server_address = 6; // Frontend-friendly: Prometheus server URL (packed into metadata by service layer) optional string query = 7; // Frontend-friendly: PromQL query (packed into metadata by service layer) + optional string connector_id = 8; // References HPAConnector by dakr-side UUID } // HPABehavior, HPAScalingRules, HPAScalingPolicy are defined in common.proto @@ -1172,6 +1477,21 @@ message ContainerResourceConfig { // Carried so the UI can surface profiling's per-container percentile // pick alongside the workload-level chip. optional float target_percentile = 8; + + // Human-readable annotations from the engine for this container. + // See ResourceRuleConfig.notes for semantics. + repeated string notes = 9; + + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + optional bool request_use_rss = 10; + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + optional bool limit_use_rss = 11; + + // Memory-only: request-equivalent baseline on the *limit* basis (bytes), + // emitted only when the limit basis differs from the request basis; 0 + // otherwise. See ResourceRuleConfig.base_limit for full semantics. + int64 base_limit = 12; } // Per-container resource rule config with CPU/Memory/GPU. @@ -1182,21 +1502,31 @@ message ContainerResourceRuleConfig { ContainerResourceConfig gpu_rule = 4; } +// JVMHeapRuleConfig mirrors the policy-level JVM heap knobs as per-rule overrides. +// Gated by enabled; the optional knobs are overrides — unset = use the default. +message JVMHeapRuleConfig { + bool enabled = 1; + optional float target_percentile = 2; + optional float headroom_multiplier = 3; + optional float non_heap_overhead_percent = 4; + optional int64 non_heap_overhead_bytes = 5; + optional int64 min_heap_bytes = 6; + optional int64 max_heap_bytes = 7; + bool prefer_container_support = 8; +} + message HPARuleConfig { + reserved 4, 5, 12; + reserved "target_utilization", "primary_metric", "target_memory_utilization"; bool enabled = 1; optional int32 min_replicas = 2; optional int32 max_replicas = 3; - optional float target_utilization = 4; - optional HPAMetricType primary_metric = 5; optional float max_replica_change_percent = 6; repeated HPAMetricTrigger metrics = 7; optional HPABehavior behavior = 8; optional string composite_formula = 9; optional HPAFallback fallback = 10; optional int32 scale_down_cooldown_seconds = 11; - // Target memory utilization (0.0-1.0). Separate from target_utilization (CPU) - // to allow independent tuning per resource. - optional float target_memory_utilization = 12; } message EmergencyResponseConfig { @@ -1209,6 +1539,48 @@ message EmergencyResponseConfig { float cpu_throttling_multiplier = 7; } +// KEDAScaledObjectTemplate is the user-authored KEDA ScaledObject configuration +// carried from dakr to the in-cluster tunr operator. tunr materialises it into +// a live ScaledObject and owns the lifecycle (create/update/delete). +message KEDAScaledObjectTemplate { + repeated KEDATrigger triggers = 1; + optional int32 min_replica_count = 2; + optional int32 max_replica_count = 3; + optional int32 idle_replica_count = 4; + optional int32 polling_interval = 5; + optional int32 cooldown_period = 6; + optional int32 initial_cooldown_period = 7; + optional KEDAFallback fallback = 8; + optional KEDAAdvanced advanced = 9; +} + +message KEDATrigger { + string type = 1; + string name = 2; + map metadata = 3; + string metric_type = 4; + optional KEDAAuthenticationRef authentication_ref = 5; + bool use_cached_metrics = 6; +} + +message KEDAAuthenticationRef { + string name = 1; + string kind = 2; +} + +message KEDAFallback { + int32 failure_threshold = 1; + int32 replicas = 2; + string behavior = 3; +} + +message KEDAAdvanced { + bool restore_to_original_replica_count = 1; + // advanced_behavior_json carries the k8s HorizontalPodAutoscalerBehavior as an + // opaque JSON string so dakr never re-models k8s types; tunr unmarshals it. + string advanced_behavior_json = 2; +} + // PercentileValues contains pre-computed percentile values for a single resource axis message PercentileValues { int64 p50 = 1; @@ -1247,6 +1619,11 @@ message BatchWorkloadRules { repeated string rule_ids_to_delete = 2; // rule IDs whose CRDs should be deleted from cluster } +message BatchHPAConnectors { + repeated HPAConnector connectors = 1; + repeated string connector_ids_to_delete = 2; +} + message WorkloadWithActiveRecommendations { repeated WorkloadIdentifier workloads = 1; // picking this pattern since caller has to iterate over the list anyway // TODO support pagination @@ -1328,6 +1705,43 @@ message GetPDBRecommendationForWorkloadResponse { optional GenericResourceRecommendation recommendation = 1; } +// StructuralHealthFinding is a single structural-health finding for a workload, +// composed from either disruption-fragility or a net-new structural check (e.g. +// topology-concentration). See dakr/services/structuralhealth. +message StructuralHealthFinding { + // "DISRUPTION_FRAGILITY" | "TOPOLOGY_CONCENTRATION" + string check_type = 1; + // "HIGH" | "MEDIUM" + string severity = 2; + // e.g. "NO_PDB_MULTI_REPLICA" (fragility) or "ALL_REPLICAS_ONE_NODE" (topology) + string reason_code = 3; + google.protobuf.Timestamp first_seen_at = 4; + // Check-specific structured payload (e.g. replica_count/pdb_name for + // fragility findings, node_count for topology findings), JSON-encoded since + // its shape varies per check type rather than being modeled as a oneof. + string detail_json = 5; +} + +// WorkloadStructuralHealth is one workload's fully composed set of open +// structural-health findings across every check type. +message WorkloadStructuralHealth { + string cluster_id = 1; + string namespace = 2; + string kind = 3; // "Deployment" | "StatefulSet" + string name = 4; + string uid = 5; + repeated StructuralHealthFinding findings = 6; +} + +message ListWorkloadStructuralHealthRequest { + string cluster_id = 1; + string team_id = 2; +} + +message ListWorkloadStructuralHealthResponse { + repeated WorkloadStructuralHealth workloads = 1; +} + message ReconcileWorkload { K8sObjectKind kind = 1; string workload_name = 2; @@ -1487,6 +1901,20 @@ message ContainerRecommendation { ResourceRecommendation recommended_limit = 5; double optimization_score = 6; + + // Per-element env var mutations for this container (merge key: name). + // The operator merges these into the live container.Env; entries not + // referenced here are left untouched. + repeated EnvVarMutation env_mutations = 11; + + // Per-flag command/arg mutations for this container. Used to carry + // command-line directives (e.g. JVM -Xmx) already lowered by the control + // plane into a concrete flag edit. + repeated CommandArgMutation command_arg_mutations = 12; + + // Whether this container was observed OOM-killed, driving the memory + // recommendation. + bool oom_triggered = 13; } message KedaScaledObjectRecommendation { @@ -1516,6 +1944,55 @@ enum ActionToTake { ACTION_TO_TAKE_IGNORE = 2; // dont fuck with this } +// MutationAction is the per-element analog of ActionToTake for list/map-shaped +// fields (env vars, nodeSelector, tolerations, command/arg flags). The action +// lives on each element so the operator can merge deltas into the live spec +// instead of replacing the whole list. IGNORE is implicit: omit the element. +enum MutationAction { + MUTATION_ACTION_UNSPECIFIED = 0; + MUTATION_ACTION_UPSERT = 1; // add the element, or replace the one matching the merge key + MUTATION_ACTION_REMOVE = 2; // delete the element matching the merge key +} + +// ArgTarget selects which container field a CommandArgMutation edits. +enum ArgTarget { + ARG_TARGET_UNSPECIFIED = 0; + ARG_TARGET_ARGS = 1; // container.args + ARG_TARGET_COMMAND = 2; // container.command +} + +// EnvVarMutation is a per-element edit to a container's env list. Merge key is +// `name`. value_from (secret/configMap refs) is intentionally deferred. +message EnvVarMutation { + MutationAction action = 1; + string name = 2; // merge key + optional string value = 3; // literal value for UPSERT +} + +// CommandArgMutation is a per-flag edit to a container's command or args list. +// The control plane lowers higher-level intent (e.g. JVM heap sizing) into this +// concrete flag edit so the operator stays generic. +message CommandArgMutation { + MutationAction action = 1; + ArgTarget target = 2; // command vs args + string flag = 3; // e.g. "-Xmx" + optional string value = 4; // e.g. "512m"; empty for valueless flags +} + +// NodeSelectorMutation is a per-key edit to the pod's nodeSelector map. +message NodeSelectorMutation { + MutationAction action = 1; + string key = 2; // merge key + optional string value = 3; // value for UPSERT +} + +// TolerationMutation is a per-element edit to the pod's tolerations list. +// Element identity is the full tuple. +message TolerationMutation { + MutationAction action = 1; + Toleration toleration = 2; +} + // The pod this Toleration is attached to tolerates any taint that matches // the triple using the matching operator . message Toleration { @@ -1659,6 +2136,15 @@ message VerticalScalingOptimizationTarget { // Whether to actively remove limits from workloads (CPU only for now). // Takes precedence over limits_adjustment_enabled when true. bool limits_removal_enabled = 42; + + // Memory-only: when true, size the memory REQUEST recommendation from RSS + // (resident set size) instead of the default working set. Ignored for CPU/GPU. + optional bool request_use_rss = 43; + + // Memory-only: when true, the limit is derived from an RSS-based recommendation + // instead of the default working-set recommendation (the Limit multiplier still + // applies to whichever basis is selected). Ignored for CPU/GPU. + optional bool limit_use_rss = 44; } message HorizontalScalingOptimizationTarget { @@ -1779,10 +2265,8 @@ message WorkloadRecommendationPolicy { // Minutes to wait between applying recommendations (prevents thrashing) optional int32 cooldown_minutes = 96; - // Deprecated: no longer used. The legacy policy flow no longer creates workload rules. - // Workload rules are created via auto-optimization or the new WorkloadOptimizationPolicy flow. - // Field retained for wire-compatibility; will be reserved in a future cleanup. - bool enable_incluster_mpa = 97; + reserved 97; + reserved "enable_incluster_mpa"; // Feature flag: Enable In-Place Pod Vertical Scaling for this policy. // Requires Kubernetes >= v1.33 on all attached clusters. @@ -1790,6 +2274,13 @@ message WorkloadRecommendationPolicy { // without triggering rolling restarts. bool enable_in_place_vertical_scaling = 103; + // Opt-in escape hatch for the riskiest half of in-place scaling: allowing a + // resize to LOWER a container's memory limit on a running pod. Gated behind + // enable_in_place_vertical_scaling and, independently, behind the cluster's + // Kubernetes version — this flag only ever removes DevZero's own refusal, it + // never makes an unsupported cluster accept the decrease. Default false. + bool allow_in_place_memory_limit_decrease = 121; + // Policy-driven automation: enable PDB creation for workloads under this policy bool pdb_enabled = 98; @@ -1801,6 +2292,53 @@ message WorkloadRecommendationPolicy { optional float pmax_ratio_threshold = 101; // default: 3.0 optional google.protobuf.Timestamp deleted_at = 102; + + // JVM heap optimization. Gated by jvm_heap_optimization_enabled; the optional + // knobs are overrides — unset means "use the current system default". + bool jvm_heap_optimization_enabled = 104; + optional float jvm_heap_target_percentile = 105; + optional float jvm_heap_headroom_multiplier = 106; + optional float jvm_non_heap_overhead_percent = 107; + optional int64 jvm_non_heap_overhead_bytes = 108; + optional int64 jvm_min_heap_bytes = 109; + optional int64 jvm_max_heap_bytes = 110; + bool jvm_prefer_container_support = 111; + + // Minimum CPU request (millicores) for detected JVM containers, protecting + // JVM startup (classloading, JIT warmup, agent instrumentation) from CPU + // starvation under node contention. Standalone knob — part of the always-on + // "respect JVM state" path, NOT gated by jvm_heap_optimization_enabled. + // Unset = system default (75m). Explicit 0 = floor disabled (only the + // generic CPU minimum applies). + optional int64 jvm_cpu_startup_floor_millicores = 112; + + // Recommendation floor percentage (per resource, request only): the + // recommended request is never lowered below pct% (1-100) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). Unset = floor disabled. + optional int64 cpu_floor_percent = 113; + optional int64 memory_floor_percent = 114; + + // Recommendation ceiling percentage (per resource, request only): the + // recommended request is never raised above pct% (1-1000) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). A ceiling below 100 is intentionally + // allowed as a baseline-relative cap distinct from max_request. Unset = + // ceiling disabled. + optional int64 cpu_ceiling_percent = 115; + optional int64 memory_ceiling_percent = 116; + + // Limit floor/ceiling percentage (per resource, limit only): the + // recommended limit is never lowered below the floor pct (1-100) nor + // raised above the ceiling pct (1-1000) of the container's immutable + // initial-limit baseline (workload_resource_baselines). Applied only when + // that resource's limits adjustment is enabled and limits removal is not; + // the recommended request always wins over the limit ceiling (the limit + // is never clamped below the request). Unset = bound disabled. + optional int64 cpu_limit_floor_percent = 117; + optional int64 memory_limit_floor_percent = 118; + optional int64 cpu_limit_ceiling_percent = 119; + optional int64 memory_limit_ceiling_percent = 120; } message GetPolicyRecommendedDefaultsRequest { @@ -1836,6 +2374,22 @@ message BalanceApplyRecommendationResponse { optional string error = 4; // Optional live migration metadata, populated when recommendation used live migration. optional LiveMigrationResult live_migration_result = 5; + // image_changed signals the operator retired this recommendation because the + // target workload's container image changed since it was applied (a new + // release), so its image-tied tuned values (env/cmd/nodeSelector/toleration) + // were not pinned onto the new image. The control plane records this as + // Superseded — not a failure — so the optimizer re-derives a fresh + // recommendation for the new image. Only set for spec-mutating workload recs. + bool image_changed = 6; + // applied_at is the terminal-phase timestamp the operator stamped on the + // WorkloadRecommendation CRD (Status.AppliedAt). For MPA v2 (rule-based) + // recommendations, the control plane's DB row primary key is derived from + // recommendation_id + applied_at (see k8sconverters.DeriveWorkloadRecommendationID), + // so this is required to target the correct row for this apply cycle instead + // of the workload's static, un-derived recommendation_id. Unset for legacy + // (non-rule) recommendations and older operators — callers must fall back + // to recommendation_id in that case. + optional google.protobuf.Timestamp applied_at = 7; } // LiveMigrationResult provides structured metadata about a live migration attempt. @@ -1855,6 +2409,13 @@ message LiveMigrationResult { string target_node = 6; // Checkpoint image size in bytes. int64 checkpoint_size_bytes = 7; + // Whether checkpoint/restore or the recommendation itself was intentionally + // skipped (for example, because live migration is unsupported, the workload + // had no running Pods, or there was no effective resource change). + bool skipped = 8; + // Stable, human-readable reason the operation was skipped. Empty when + // skipped is false. + string skip_reason = 9; } message NodeGroupReference { @@ -1920,10 +2481,15 @@ message WorkloadRecommendation { bool use_live_migration = 21; LiveMigDeletionPropagation del_prop = 22; - optional string reasoning = 31; + // Why this recommendation was generated, set once at creation. For + // recommendations with no rule_id (policy-based / one-time), this is + // never touched again after generation — see `success`/`error` for the + // operator's terminal outcome instead. rule_id (MPA v2) rows may still + // have the operator's post-hoc status message appended. + optional string reasoning = 31; repeated Toleration current_tolerations = 41; - repeated Toleration recommended_tolerations = 42; + repeated Toleration recommended_tolerations = 42 [deprecated = true]; // superseded by toleration_mutations (per-element merge) optional RecommendationStatus status = 51; @@ -1935,6 +2501,20 @@ message WorkloadRecommendation { optional string rule_id = 73; + // CurrentSource of the governing WorkloadRule (MPA v2), e.g. "auto_optimization", + // "policy", "manual". Only set when rule_id is populated. Mirrors WorkloadRule.current_source + // so the recommendations list can show/link the governing rule without a second RPC. + optional string rule_source = 104; + + // The original spec.recommendation_id from the WorkloadRecommendation CRD. For MPA v2 + // (rule-based) rows, recommendation_id (field 1, this message's row ID) is deliberately + // re-derived per apply cycle so each evaluation gets its own history row — but audit log + // entries and live-migration checkpoint/restore events are always stamped with this + // original, un-derived ID. Clients querying audit logs or C/R status/events for a + // recommendation MUST use this field, not recommendation_id, or the query returns nothing + // for MPA v2 rows. Equal to recommendation_id for legacy rows (which never derive it). + optional string source_recommendation_id = 105; + ActionToTake replica_count_action = 81; // suggests if operator should set recommended_replica_count // Result of live migration when this recommendation was applied with use_live_migration (populated after apply). @@ -1943,6 +2523,12 @@ message WorkloadRecommendation { // Error message when status is failed or apply failed. optional string error = 83; + // Operator's terminal status message for any non-failure outcome (applied, + // or superseded via image-changed/skip). Mirrors `error` for the + // non-failure side. Only populated for recommendations with no rule_id + // (policy-based and one-time recs) — see reasoning field note below. + optional string success = 106; + // Backend-computed cost impact (current vs recommended). optional CostImpact cost_impact = 91; @@ -1951,8 +2537,159 @@ message WorkloadRecommendation { // without triggering rolling restarts (requires k8s >= v1.33). bool use_in_place_vertical_scaling = 92; + // Whether the operator may lower a container's memory limit while applying + // this recommendation in place. Copied from the owning rule/policy at + // generation time so the operator's apply-time preflight can decide without + // re-reading the rule. Independent of, and additional to, the cluster + // version check. + bool allow_in_place_memory_limit_decrease = 109; + // Impact score (0-1) indicating optimization opportunity. Higher = more waste. double impact_score = 93; + + // Pod-scoped per-element nodeSelector mutations (merge key: key). + repeated NodeSelectorMutation node_selector_mutations = 101; + + // Pod-scoped per-element toleration mutations. Supersedes the deprecated + // recommended_tolerations full-list field. + repeated TolerationMutation toleration_mutations = 102; + + // Container image (keyed by container name) the recommendation was derived + // from — the "source" release. The operator compares this against a + // workload's live images to detect that a new release shipped and retire a + // recommendation whose tuned values (resources, JVM heap, …) were computed + // for the old image, so they are not pinned onto the new one (e.g. a stale + // -Xmx that could OOM the new build). + map source_images = 103; + + // Force-restart directive when no resource fields changed but a restart + // was still requested (e.g. re-apply after an image change). + ActionToTake restart_action_to_take = 107; + + // Structured reasoning payload (insights, per-container deltas, HPA + // context, decision trace). Only populated for mpav1 (policy_id set) + // recommendations generated after this field shipped; absent for mpav2, + // one-time, and historical rows — consumers fall back to `reasoning`. + optional ReasoningDetails reasoning_details = 108; +} + +// ReasoningDetails is the structured form of a recommendation's `reasoning` +// prose. schema_version tracks the payload shape (currently 1). +message ReasoningDetails { + int32 schema_version = 1; + repeated ReasoningInsight insights = 2; + repeated ReasoningContainerChange container_changes = 3; + optional ReasoningReplicas replicas = 4; + repeated ReasoningDecision decisions = 5; + double confidence_score = 6; + double risk_score = 7; + double effective_deadband_percent = 8; +} + +enum ReasoningInsightSeverity { + REASONING_INSIGHT_SEVERITY_UNSPECIFIED = 0; + REASONING_INSIGHT_SEVERITY_INFO = 1; + REASONING_INSIGHT_SEVERITY_LOW = 2; + REASONING_INSIGHT_SEVERITY_MEDIUM = 3; + REASONING_INSIGHT_SEVERITY_HIGH = 4; + REASONING_INSIGHT_SEVERITY_CRITICAL = 5; +} + +enum ReasoningInsightType { + REASONING_INSIGHT_TYPE_UNSPECIFIED = 0; + REASONING_INSIGHT_TYPE_PATTERN = 1; + REASONING_INSIGHT_TYPE_ANOMALY = 2; + REASONING_INSIGHT_TYPE_TREND = 3; + REASONING_INSIGHT_TYPE_OPTIMIZATION = 4; + REASONING_INSIGHT_TYPE_RISK = 5; + REASONING_INSIGHT_TYPE_PROFILE = 6; +} + +enum ReasoningDecisionKind { + REASONING_DECISION_KIND_UNSPECIFIED = 0; + REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE = 1; + REASONING_DECISION_KIND_POLICY_CONFLICT = 2; + REASONING_DECISION_KIND_POLICY_FLOOR = 3; + REASONING_DECISION_KIND_POLICY_CEILING = 4; + REASONING_DECISION_KIND_PLATFORM_FLOOR = 5; + REASONING_DECISION_KIND_SAFETY_FLOOR = 6; + REASONING_DECISION_KIND_SUPPRESSION = 7; + REASONING_DECISION_KIND_FEATURE_DOWNGRADE = 8; + REASONING_DECISION_KIND_MODIFICATION = 9; + REASONING_DECISION_KIND_NORMALIZATION = 10; + REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR = 11; + REASONING_DECISION_KIND_POLICY_LIMIT_CEILING = 12; +} + +message ReasoningEvidence { + string type = 1; + string description = 2; + double confidence = 3; +} + +message ReasoningInsight { + string id = 1; + ReasoningInsightType type = 2; + ReasoningInsightSeverity severity = 3; + double confidence = 4; + string title = 5; + string description = 6; + string impact = 7; + repeated ReasoningEvidence evidence = 8; +} + +// Raw units: millicores for CPU, bytes for memory. Before = actuals at +// generation time, after = final recommendation. Percent changes are for +// the consumer to compute (avoids the legacy divide-by-zero Inf%). +message ReasoningResourceEdge { + int64 request_before = 1; + int64 request_after = 2; + int64 limit_before = 3; + int64 limit_after = 4; +} + +message ReasoningContainerChange { + string container = 1; + ReasoningResourceEdge cpu = 2; + ReasoningResourceEdge memory = 3; + ReasoningResourceEdge gpu = 4; + bool oom_triggered = 5; +} + +message ReasoningUtilization { + double cpu_current = 1; + double cpu_target = 2; + double memory_current = 3; + double memory_target = 4; +} + +message ReasoningHistoricalPattern { + string pattern = 1; + bool is_oscillating = 2; + double change_frequency = 3; +} + +message ReasoningReplicas { + int32 current = 1; + int32 recommended = 2; + int32 min = 3; + int32 max = 4; + string reason = 5; + string primary_metric = 6; + ReasoningUtilization utilization = 7; + string workload_type = 8; + ReasoningHistoricalPattern historical_pattern = 9; +} + +message ReasoningDecision { + ReasoningDecisionKind kind = 1; + string container = 2; // empty = workload-scoped + string resource = 3; // cpu | memory | gpu | "" + string field = 4; // request | limit | replicas | "" + optional int64 intended = 5; + optional int64 actual = 6; + string constraint = 7; // open-ended machine-readable cause token + string message = 8; } enum LiveMigDeletionPropagation { @@ -2160,6 +2897,77 @@ message GenerateNodePoliciesFromNodeGroupsResponse { repeated NodePolicy policies = 1; repeated NodePolicyTarget targets = 2; repeated WorkloadCompatibilityWarning warnings = 3; + // eligibility carries per-node-group "may this be migrated?" information + // computed from the current node observations. The wizard reads this to + // disable Step 3 rows for groups the operator must NOT migrate, with a + // tooltip explaining why. Keyed by group name (matches NodePolicy.name) + // and populated for every discovered group — including groups that are + // already managed by an existing node policy, which carry the + // "already_migrated" reason and have NO corresponding entry in policies. + repeated NodeGroupMigrationEligibility eligibility = 4; +} + +// NodeGroupMigrationEligibility flags a node group as not-safe-to-migrate +// for the CAS-migration wizard. Eligibility is preview-time only — it +// describes the *current* state of the source pool, not a property of the +// generated NodePolicy, so it's surfaced alongside the policies rather +// than embedded in NodePolicy itself. +message NodeGroupMigrationEligibility { + // group_name matches NodePolicy.name (the source node group's name). + string group_name = 1; + // migratable=false means the wizard MUST disable this row in Step 3 + // (BLOCKING reason present). True (or absent) means safe-to-migrate; + // an ADVISORY reason may still be present, in which case the wizard + // should show a non-blocking yellow caveat next to the row. + bool migratable = 2; + // reasons documents why migration is blocked OR carries caveats. + // Stable identifier strings the wizard maps to human-readable messages. + // + // Blocking reasons (force migratable=false; row is disabled): + // "system_pool" — AKS pool with kubernetes.azure.com/mode=system + // or GKE pool with cloud.google.com/gke-system-only=true + // or the GKE system-only taint + // (CriticalAddonsOnly=true:NoSchedule). AKS + // requires ≥1 System pool to keep kube-system + // schedulable; draining the last one bricks + // the control plane. + // "karpenter_ops_pool" — pool labelled devzero.io/karpenter-ops-pool=true + // by dz-installer (setup-azure.sh / + // setup-gcp.sh). Migrating the pool that runs + // karpenter itself is a chicken-and-egg — + // karpenter would have to drain itself. + // "azure_sku_restricted" — source pool runs an AKS-restricted VM size + // (Basic A-series, B1s/B1ms, F1/F1s, + // A0/A1/A1_v2). kp-azure refuses to provision + // these. No workaround at the policy layer. + // "azure_sku_confidential" — source pool runs a Confidential Compute + // SKU (DC* / EC*). kp-azure's isConfidential + // predicate excludes these. + // "already_migrated" — the group is already managed by a live node + // policy with a live target scoped to this + // cluster. Unlike the other reasons, such + // groups are excluded from the policies list + // entirely (regenerating would create a + // duplicate policy); the entry exists so the + // UI can explain why the group is absent. + // + // Advisory reasons (migratable stays true; show as caveat): + // "azure_sku_nvme_under_cig" — source pool's SKU is NVMe-only + // (Standard_D*ads_v6 / D*alds_v6 / E*ads_v6 etc). + // kp-azure's default CIG image source isn't + // NVMe-tagged, so the controller filters these + // SKUs out of its catalog. Migration still + // works because the generated NodePool only + // requires sku-family (instance-category) — + // karpenter picks a compatible non-NVMe SKU + // from the same family. Operator should know + // the launched nodes won't exactly match the + // source pool. + // "cast_ai_live_migration_pool" — the group hosts cast.ai + // live-migration components, which stop + // working once those components are disabled + // during this migration. + repeated string reasons = 3; } message GetNodeAnnotationReadinessRequest { @@ -2174,9 +2982,35 @@ message GetNodeAnnotationReadinessResponse { bool ready = 4; repeated string unannotated_node_names = 5; // supported is false when the cluster's cloud provider has no annotation - // schema yet (Azure / OCI today). The wizard renders a clear "not - // supported" state instead of polling indefinitely. + // schema yet (OCI today). The wizard renders a clear "not supported" + // state instead of polling indefinitely. bool supported = 6; + // aks_cluster_resource_group is the resource group that hosts the AKS + // managed-cluster resource (NOT the MC_* node RG). Surfaced here so the + // wizard's Step 5 / Step 7 commands (`az aks nodepool update/scale`) + // can drop the placeholder. Populated from + // devzero.io/azure-aks-cluster-rg on any annotated node. Empty when + // the cluster isn't Azure or when the controller wasn't configured + // with ARM_RESOURCE_GROUP — in either case the wizard falls back to + // the placeholder. + string aks_cluster_resource_group = 7; +} + +message DetectClusterAutoscalerRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DetectClusterAutoscalerResponse { + // One of: karpenter | cluster_autoscaler | cast_ai | transitioning | unmanaged. + // Plain string (not an enum) so new families ship without a proto bump, + // matching node_scheduling_health.proto's autoscaler_type convention. + string autoscaler_type = 1; + // Per-family raw booleans so the wizard can pick the SOURCE autoscaler even + // while autoscaler_type reads transitioning (mid-migration both are live). + bool has_karpenter = 2; + bool has_cluster_autoscaler = 3; + bool has_cast_ai = 4; } // Migration wizard state @@ -2207,6 +3041,94 @@ message UpdateMigrationStateResponse { string id = 1; } +// Karpenter migration wizard +message GetKarpenterMigrationStateRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetKarpenterMigrationStateResponse { + string id = 1; + string cluster_id = 2; + string status = 3; + int32 current_step = 4; + string state_json = 5; + google.protobuf.Timestamp created_at = 6; + google.protobuf.Timestamp updated_at = 7; +} + +message UpdateKarpenterMigrationStateRequest { + string team_id = 1; + string cluster_id = 2; + string status = 3; + int32 current_step = 4; + string state_json = 5; +} + +message UpdateKarpenterMigrationStateResponse { + string id = 1; +} + +message KarpenterOwnershipConflict { + string id = 1; + string resource_kind = 2; + string resource_name = 3; + string owner_tool = 4; + google.protobuf.Timestamp detected_at = 5; + google.protobuf.Timestamp acknowledged_at = 6; // unset if not yet acknowledged + string acknowledged_by = 7; +} + +message DetectKarpenterOwnershipConflictsRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DetectKarpenterOwnershipConflictsResponse { + repeated KarpenterOwnershipConflict conflicts = 1; // includes previously-acknowledged ones so the UI can show history + bool already_dev_zero_managed = 2; // true if karpDeployment.IsDevZeroManaged() — short-circuit signal for Detect step +} + +message AcknowledgeKarpenterOwnershipConflictRequest { + string team_id = 1; + string conflict_id = 2; + string acknowledged_by = 3; +} + +message AcknowledgeKarpenterOwnershipConflictResponse { + string id = 1; +} + +message KarpenterSourceResource { + string kind = 1; // "NodePool" | "EC2NodeClass" | "AKSNodeClass" | "GCENodeClass" + string name = 2; + string yaml = 3; +} + +message GetKarpenterSourceResourcesRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetKarpenterSourceResourcesResponse { + repeated KarpenterSourceResource resources = 1; +} + +message NodePoolAdoptionStatus { + string node_pool_name = 1; + bool ready = 2; +} + +message GetKarpenterAdoptionStatusRequest { + string team_id = 1; + string cluster_id = 2; + repeated string node_pool_names = 3; +} + +message GetKarpenterAdoptionStatusResponse { + repeated NodePoolAdoptionStatus statuses = 1; +} + // NodePool validation message ReportNodePoolValidationRequest { string cluster_id = 1; @@ -2262,6 +3184,77 @@ message UpdateNodePolicyResponse { NodePolicy policy = 1; } +// NodeGroupCheckpointState classifies a node group's checkpoint-restore status. +enum NodeGroupCheckpointState { + NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED = 0; + // Node group is not DevZero/dzkarp-managed (no matching node policy node + // pool). Customer is responsible for adding the checkpoint-node label. + NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED = 1; + // dz-managed (matches a policy's node pool) but no active node policy + // target for this cluster. + NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY = 2; + // dz-managed + active policy, but the policy lacks the + // dakr.devzero.io/checkpoint-node label. Eligible for the one-click CTA. + NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL = 3; + // dz-managed + active policy + label present. Intent declared; actual CRIU + // capability not (yet) verified. + NODE_GROUP_CHECKPOINT_STATE_CONFIGURED = 4; + // CONFIGURED and CRIU verified present on the node group's nodes. + NODE_GROUP_CHECKPOINT_STATE_ENABLED = 5; +} + +// CheckpointReason explains *why* a node group is stuck in CONFIGURED — surfaced +// as a tooltip modifier line, never as a distinct chip. Multiple reasons can be +// true at once; backend picks the most actionable one. +enum CheckpointReason { + CHECKPOINT_REASON_UNSPECIFIED = 0; + // dakr-operator on this cluster predates per-node SSA fan-out. Existing + // nodes won't be labeled until the operator upgrades. + CHECKPOINT_REASON_OPERATOR_OUTDATED = 1; + // Label applied, but no node has reported criu_configured=true yet. Most + // likely the customer hasn't deployed (or hasn't finished deploying) the + // CRIU DaemonSet. + CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED = 2; + // Some nodes joined recently (<5 min) and haven't been probed yet. State + // will resolve on the next operator tick. + CHECKPOINT_REASON_NEW_NODES_PROBING = 3; +} + +message NodeGroupCheckpointStatus { + NodeGroupCheckpointState state = 1; + // Associated node policy (empty when NOT_DZ_MANAGED). + string policy_id = 2; + string policy_name = 3; + // For scope disclosure on the CTA: all node pool names this policy compiles + // to / clusters it targets — toggling the label affects all of them. + repeated string shared_node_pool_names = 4; + repeated string shared_cluster_ids = 5; + // Why this NG is in CONFIGURED (vs ENABLED). UNSPECIFIED for non-CONFIGURED + // states. + CheckpointReason reason = 6; +} + +message GetNodeGroupsCheckpointStatusRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetNodeGroupsCheckpointStatusResponse { + // Keyed by node group name. + map by_node_group = 1; +} + +message SetNodePolicyCheckpointLabelRequest { + string team_id = 1; + string policy_id = 2; + // true adds dakr.devzero.io/checkpoint-node=true; false removes the key. + bool enabled = 3; +} + +message SetNodePolicyCheckpointLabelResponse { + bool success = 1; +} + message DeleteNodePolicyRequest { string team_id = 1; string policy_id = 2; @@ -2286,6 +3279,7 @@ message NodePolicy { LabelSelector instance_hypervisors = 13; // self explanatory LabelSelector instance_generations = 14; // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) LabelSelector instance_sizes = 15; // UI: Size; eg: Standard_D4s (Azure), large (AWS) + LabelSelector instance_shapes = 116; // GCP-only: standard/highcpu/highmem shape token LabelSelector instance_types = 16; // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this @@ -2298,6 +3292,7 @@ message NodePolicy { optional string instance_hypervisors_tip = 29; optional string instance_generations_tip = 30; optional string instance_sizes_tip = 31; + optional string instance_shapes_tip = 117; optional string instance_local_nvme_tip = 114; LabelSelector zones = 36; // abstract, per-cloud mapping @@ -2347,6 +3342,22 @@ message NodePolicy { google.protobuf.Timestamp created_at = 110; google.protobuf.Timestamp updated_at = 111; google.protobuf.Timestamp deleted_at = 112; + + // "dakr" (user-authored, pushed to cluster) or "cluster" (read-only, + // computed from Karpenter CRDs NOT labeled devzero.io/managed-by=dakr — i.e. + // anything dakr does not own; see repositories.scopeNotDakrManaged). + string source = 115; + // For source == "cluster" only: the cluster whose Karpenter NodePool this + // policy mirrors. A cluster-managed policy belongs to exactly one cluster and + // has no NodePolicyTargets, so this is the frontend's only way to scope it + // (e.g. for suggestions). Empty for dakr-authored policies. + string source_cluster_id = 118; + // For source == "cluster" only: NodePool requirement keys on the mirrored CRD + // that this message has no field for (Azure/GCP SKU keys, custom label + // requirements). Computed per request like source and source_cluster_id, never + // stored, and empty for dakr-authored policies — which are authoritative by + // construction, since dakr compiled the NodePool from them. + repeated string unrepresented_requirement_keys = 119; } message PreviewNodeRecommendationConfigRequest { @@ -2387,6 +3398,248 @@ message SuggestedKarpenterConfigResponse { map ng_to_suggested = 11; } +message SuggestNodePolicyImprovementsRequest { + string team_id = 1; + // Required. Suggestions are computed per (policy, cluster) pair: the evidence is the + // cluster's live NodePools/nodes/workloads attributed to this policy. + string cluster_id = 2; + // Stored policy to evaluate. Takes precedence over `policy`, mirroring + // PreviewNodeRecommendationConfigRequest. + string policy_id = 3; + // Inline draft to evaluate when `policy_id` is empty. Always computed live, never + // persisted. + NodePolicy policy = 4; + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + ProfileWindow window = 5; +} + +message SuggestNodePolicyImprovementsResponse { + NodePolicy original = 1; + // Deep copy of `original` with every suggestion applied — the "accept all" payload. + NodePolicy suggested = 2; + repeated NodePolicySuggestion suggestions = 3; + SuggestionContext context = 4; + google.protobuf.Timestamp computed_at = 5; + // False when the response was computed synchronously for this request rather than + // served from a precomputed row. + bool from_cache = 6; + // True when the served row predates the policy's current revision (or an engine + // rule-set change). A background refresh has been enqueued; clients should surface + // the computed_at staleness and may refetch shortly. Large clusters serve stale + // rather than recomputing in the request path. + bool stale = 7; +} + +message ListClusterNodePolicySuggestionsRequest { + string team_id = 1; + string cluster_id = 2; + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + ProfileWindow window = 3; +} + +message ListClusterNodePolicySuggestionsResponse { + repeated NodePolicySuggestionsForPolicy policies = 1; + // The oldest computed_at among the included policies — the bound a caller can trust + // the whole response by, even though each policy's own row has its own computed_at. + google.protobuf.Timestamp computed_at = 2; + // True when at least one policy has no row yet, or a row stale enough to recompute. + // A background refresh of the whole cluster has been enqueued; clients should + // surface staleness and may refetch shortly, the same contract as + // SuggestNodePolicyImprovementsResponse.stale. + bool stale = 3; +} + +// NodePolicySuggestionsForPolicy is one policy's entry in a cluster-wide suggestions +// list: everything ListClusterNodePolicySuggestions can say about a single policy +// without the original/suggested NodePolicy payload SuggestNodePolicyImprovements +// carries — that RPC is still where accepting a suggestion happens. +message NodePolicySuggestionsForPolicy { + string policy_id = 1; + string policy_name = 2; + // "dakr" or "cluster", mirroring NodePolicy.source — cluster-managed mirrors get + // suggestions surfaced here the same as dakr-authored policies, visualization-only: + // accepting one still routes to that mirror's own Karpenter manifest, not this RPC. + string policy_source = 3; + repeated NodePolicySuggestion suggestions = 4; + SuggestionContext context = 5; + google.protobuf.Timestamp computed_at = 6; + // True when this policy's own row is missing, predates its current revision, or + // predates an engine rule-set change — same definition as + // SuggestNodePolicyImprovementsResponse.stale, just scoped to this one policy. + bool stale = 7; +} + +// SuggestionGroup is the policy component a suggestion belongs to. The UI groups cards +// by this axis. +enum SuggestionGroup { + SUGGESTION_GROUP_UNSPECIFIED = 0; + SUGGESTION_GROUP_DISRUPTION = 1; + SUGGESTION_GROUP_REQUIREMENTS = 2; + SUGGESTION_GROUP_CAPACITY_TYPE = 3; + SUGGESTION_GROUP_ZONES = 4; + SUGGESTION_GROUP_LIMITS = 5; + SUGGESTION_GROUP_NODECLASS = 6; + SUGGESTION_GROUP_COMPATIBILITY = 7; + // SUGGESTION_GROUP_COVERAGE is the one group whose suggestions do not mutate this + // NodePolicy at all: field_path, current_value_yaml and suggested_value_yaml are all + // empty, and the suggestion never resolves to an Apply(). It surfaces workloads + // attributed to this pool that have no legacy (mpav1) WorkloadRecommendationPolicy + // coverage, which is a gap in DevZero's separate workload-optimization product, not a + // NodePolicy misconfiguration. + SUGGESTION_GROUP_COVERAGE = 8; +} + +// SuggestionFlavor is the benefit a suggestion delivers. The UI renders this as a chip +// alongside severity. +enum SuggestionFlavor { + SUGGESTION_FLAVOR_UNSPECIFIED = 0; + SUGGESTION_FLAVOR_COST = 1; + SUGGESTION_FLAVOR_RELIABILITY = 2; + SUGGESTION_FLAVOR_PERFORMANCE = 3; + SUGGESTION_FLAVOR_SECURITY = 4; + SUGGESTION_FLAVOR_BEST_PRACTICE = 5; + SUGGESTION_FLAVOR_COMPATIBILITY = 6; +} + +enum SuggestionSeverity { + SUGGESTION_SEVERITY_UNSPECIFIED = 0; + SUGGESTION_SEVERITY_INFO = 1; + SUGGESTION_SEVERITY_RECOMMENDED = 2; + SUGGESTION_SEVERITY_STRONG = 3; +} + +// EvidenceScope records what population an evidence item was measured against. POOL means +// the nodes attributed to this policy's live NodePools; CLUSTER is the cold-start +// fallback for policies with no live nodes yet. +enum EvidenceScope { + EVIDENCE_SCOPE_UNSPECIFIED = 0; + EVIDENCE_SCOPE_POOL = 1; + EVIDENCE_SCOPE_CLUSTER = 2; +} + +message NodePolicySuggestion { + // Stable rule identifier, e.g. "disruption.consolidation_policy". Stable across + // engine versions so the frontend can special-case rendering per rule. + string rule_id = 1; + SuggestionGroup group = 2; + SuggestionFlavor flavor = 3; + SuggestionSeverity severity = 4; + // NodePolicy field the suggestion mutates, as a proto field path relative to + // NodePolicy, e.g. "disruption.consolidate_after", "capacity_types" or "limits.cpu". + // This names the FIRST (or only) field the suggestion changes; additional_field_changes + // below carries the rest for the rare suggestion that changes more than one. Two + // guarantees the per-card accept in the UI depends on, over the union of this path and + // every additional_field_changes[].field_path. First, the paths name exactly what this + // suggestion changes and nothing more: taking `original` and copying only these paths' + // values out of `suggested` yields the same policy as applying this one suggestion, so a + // card can be accepted on its own. Second, at most one suggestion per response claims a + // given path, and no claimed path is an ancestor of another — "limits" and "limits.cpu" + // never both appear — so accepting one card can never carry a neighbouring card's change + // with it. A rule with a finding on fields that do not belong together emits separate + // suggestions instead of naming their parent. + // + // Empty for a SUGGESTION_GROUP_COVERAGE suggestion, the one deliberate exception: it names + // no field because it does not mutate this NodePolicy at all. current_value_yaml and + // suggested_value_yaml are empty for the same reason. + string field_path = 5; + string title = 6; + // Detailed explanation of why this change is being suggested, written against the + // cited evidence. Rendered as the card body. + string rationale = 7; + // Display-ready YAML renderings of the field's current and suggested values, for + // field_path above. + string current_value_yaml = 8; + string suggested_value_yaml = 9; + repeated SuggestionEvidence evidence = 10; + // A directly attributable, non-overlapping monthly saving: a price delta (spot vs + // on-demand, gp2 vs gp3, a cheaper eligible candidate) applied to a known quantity. Safe + // to sum across every suggestion in a response, including others on the same policy, + // because each rule that sets this draws from its own independent price comparison — + // never from a shared, policy-wide figure two rules could both cite. + optional double estimated_monthly_savings_usd = 11; + // Additional NodePolicy fields this suggestion mutates together with field_path, when + // loosening several selector fields as one combination fits the population better than + // loosening any single one. Empty for almost every suggestion; see field_path's comment + // for the guarantees that apply across the whole set. + repeated SuggestionFieldChange additional_field_changes = 12; + // The most this suggestion could save if fully realized, for a rule whose saving is real + // but not directly attributable to this one change: reclaiming a pool's idle capacity + // (disruption.consolidation_policy, disruption.consolidate_after, disruption.budgets, + // requirements.size_mismatch) all draw the same ceiling from that pool's own idle spend, + // since each only widens Karpenter's ability to reclaim it rather than guaranteeing it + // does. Unlike estimated_monthly_savings_usd, this is NOT safe to sum across a policy: + // when more than one suggestion on the same policy sets it, the true ceiling is the + // maximum across them, not their total, because they are bounds on the same underlying + // capacity rather than independent savings. A rule never sets both this and + // estimated_monthly_savings_usd on the same suggestion. + optional double upper_bound_monthly_savings_usd = 13; +} + +// SuggestionFieldChange is one additional NodePolicy field a suggestion mutates, beyond +// field_path/current_value_yaml/suggested_value_yaml on NodePolicySuggestion, which always +// name the first (or only) one. Almost every suggestion touches exactly one field and +// leaves NodePolicySuggestion.additional_field_changes empty; only a combination-search +// suggestion (currently just requirements.overpinned) populates it. +message SuggestionFieldChange { + string field_path = 1; + string current_value_yaml = 2; + string suggested_value_yaml = 3; +} + +// SuggestionEvidence is one observed data point cited by a suggestion, e.g. +// label="p95 CPU utilization (7d)", value="22%", detail="across 14 nodes managed by +// nodepool workers-a". +message SuggestionEvidence { + string label = 1; + string value = 2; + string detail = 3; + EvidenceScope scope = 4; + // The workloads this citation names, in the order they appear in `detail` and in + // the rationale. Carries the identity behind the "namespace/name" text so the UI + // can open each one's drawer, which needs the uid and kind that the display + // string drops. Empty for citations about nodes or pricing rather than + // workloads, and for a workload whose metadata read missed it (the display + // string falls back to a bare uid there, and the drawer needs the kind too). + repeated SuggestionWorkloadRef workloads = 5; +} + +// SuggestionWorkloadRef identifies one workload named by a suggestion well enough +// to open its drawer: the panel takes uid, kind and the cluster the suggestion was +// computed for. +message SuggestionWorkloadRef { + string uid = 1; + // Kubernetes kind as written on the owner ("Deployment", "StatefulSet"), not the + // K8sObjectKind enum: this is passed straight to GetWorkload, which matches on + // the string. + string kind = 2; + string namespace = 3; + string name = 4; + // Exactly the text this workload appears as in `detail` and in the rationale, so + // the UI links the same token the sentence was written with instead of + // reassembling one and hoping it matches. + string display = 5; +} + +// SuggestionContext describes the evidence population a suggestion run was computed +// against, so the UI can qualify the results ("based on 14 nodes across 2 nodepools, +// last 7d, 23 workload profiles"). +message SuggestionContext { + ProfileWindow window = 1; + // Live NodePool names attributed to the policy via the dakr.devzero.io/node-policy-id + // annotation. Empty on cold-start. + repeated string matched_node_pools = 2; + int32 node_count = 3; + EvidenceScope evidence_scope = 4; + // Number of fresh workload profile snapshots that informed the run. + int32 workload_profile_count = 5; + // For cluster-managed policies only: NodePool requirement keys present on the + // customer's CRD that this policy view cannot represent (Azure/GCP SKU keys, + // custom label requirements). Non-empty means both the suggestions and the + // compiled preview describe a partial picture of the real NodePool, and the + // UI should say so. Always empty for dakr-authored policies. + repeated string unrepresented_requirement_keys = 6; +} + message GetAvailableKindsByTargetingFiltersRequest { string team_id = 1; repeated string cluster_ids = 2; @@ -2601,6 +3854,14 @@ message GetInstanceSizesResponse { repeated InstanceSize instance_sizes = 1; } +message GetInstanceShapesRequest { + repeated string cloud_providers = 1; // Cloud provider names (e.g., "aws", "azure", "gcp") +} + +message GetInstanceShapesResponse { + repeated InstanceShape instance_shapes = 1; +} + // -- Submessages -- message InstanceFamily { @@ -2608,6 +3869,11 @@ message InstanceFamily { string provider_name = 2; } +message InstanceShape { + string name = 1; + string provider_name = 2; +} + message InstanceSize { string name = 1; string provider_name = 2; @@ -2755,6 +4021,7 @@ message AzureNodeClassSpec { map tags = 5; optional AzureKubeletConfiguration kubelet = 6; optional int32 max_pods = 7; + optional string image_version = 8; } message AzureKubeletConfiguration { @@ -2832,6 +4099,89 @@ message RawKarpenterSpec { string nodeclass_yaml = 2; } +// SnapshotRecommendation delivers one rendered resilience-family config +// (spec §7): the multi-doc criu.org/v1 apply bundle compiled by the render +// worker — anchor ConfigMap first, then CheckpointSchedule / +// CheckpointRestoreOperator CRs sorted by name. tunr applies it verbatim +// under the dz-snapshot-crds prune stream; the config ID is echoed back in +// the apply ACK. +message SnapshotRecommendation { + bytes compiled_resources_yaml = 1; + string snapshot_cfg_id = 2; + string content_hash = 3; +} + +// ForensicSnapshotRecommendation is the forensic-family twin +// (ForensicSnapshotChain CRs, dz-forensic-crds prune stream). Kept separate +// from SnapshotRecommendation so neither family's apply can ever prune the +// other's resources (spec §7). +message ForensicSnapshotRecommendation { + bytes compiled_resources_yaml = 1; + string forensic_cfg_id = 2; + string content_hash = 3; +} + +// SnapshotCRStatusReport carries the current statuses of every dakr-managed +// criu.org CR on the cluster (tunr-side reporter, spec §8). +message SnapshotCRStatusReport { + repeated SnapshotCRStatus resources = 1; +} + +// SnapshotCRStatus is one CR's identity + raw status subtree. Annotations +// carry the dakr.devzero.io policy/target ID keys the compiler stamped; +// status_json is the CR's .status marshaled verbatim (dakr parses). +message SnapshotCRStatus { + string kind = 1; + string name = 2; + string namespace = 3; + string uid = 4; + map annotations = 5; + bytes status_json = 6; +} + +// SnapshotCRRuntimeStatus is one CR's ingested runtime state, projected for +// reads. One shape serves both families; family-irrelevant fields are unset. +message SnapshotCRRuntimeStatus { + string cluster_id = 1; + string kind = 2; + string name = 3; + string namespace = 4; + // ForensicSnapshotChain only: Pending/Running/Completed/Failed. + string phase = 11; + int32 snapshot_count = 12; + int32 attempt_count = 13; + int32 failure_count = 14; + // CheckpointSchedule only. INTERVAL-TRIGGER-ONLY counter: checkpoints + // fired by annotation/threshold/event triggers never bump it — label + // this "interval activity", or trigger-only schedules read as dead. + int32 checkpoints_created = 21; + string error_message = 31; + // lastCheckpointTime (schedules) / lastSnapshotTime (chains). + google.protobuf.Timestamp last_activity_time = 41; + google.protobuf.Timestamp start_time = 42; + google.protobuf.Timestamp completion_time = 43; + // When dakr last ingested this CR's status. + google.protobuf.Timestamp observed_at = 44; +} + +// SnapshotPolicyTargetStatus aggregates a target's ingested CR statuses +// (capped; ordered namespace, name). +message SnapshotPolicyTargetStatus { + repeated SnapshotCRRuntimeStatus resources = 1; +} + +// SnapshotPrereqs surfaces cluster prerequisites derivable from already- +// ingested state (spec §7). CRIU-on-nodes and container-runtime checkpoint +// support need node-level probing no collector performs yet — deferred; a +// cluster can pass these checks and still fail applies for those reasons +// (surfaced through apply events). +message SnapshotPrereqs { + string kubernetes_version = 1; + // Kubernetes >= 1.30 (ContainerCheckpoint enabled by default). + bool kubernetes_version_supported = 2; + bool metrics_server_present = 3; +} + message NodeRecommendation { AWSKarpenterSpec aws = 1; AKSKarpenterSpec aks = 2; @@ -2927,6 +4277,10 @@ enum RecommendationType { RECOMMENDATION_TYPE_PVC_STORAGE = 5; RECOMMENDATION_TYPE_WORKLOAD_RULE = 6; RECOMMENDATION_TYPE_KARPENTER_SETTINGS = 7; + RECOMMENDATION_TYPE_SNAPSHOT_CRD = 8; + RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD = 9; + RECOMMENDATION_TYPE_HPA_CONNECTOR = 10; + RECOMMENDATION_TYPE_SCHEDULER_POLICY = 11; } enum HPAMetricType { @@ -3285,14 +4639,22 @@ message ListWorkloadCPUThrottleEventsResponse { // MPA V3: Workload Optimization Policy messages // ============================================================================ +// StringSetSelector is an include/exclude selector for a set of string values. +// If In is non-empty, the value must match one entry. NotIn entries are always +// excluded. Both empty = match all. +message StringSetSelector { + repeated string in = 1; + repeated string not_in = 2; +} + message WorkloadOptimizationPolicyProto { string id = 1; string team_id = 2; string name = 3; optional string description = 4; - bool enabled = 5; + bool disabled = 5; repeated string cluster_ids = 6; - repeated string namespace_selector = 7; + optional StringSetSelector namespace_selector = 7; google.protobuf.Timestamp created_at = 8; google.protobuf.Timestamp updated_at = 9; map cluster_names = 10; // cluster_id → display name @@ -3308,19 +4670,63 @@ message WorkloadOptimizationPolicyProto { optional string defragmentation_schedule = 16; bool live_migration_enabled = 17; bool use_in_place_vertical_scaling = 18; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 32; // HPA: when true, WorkloadRules generated from this policy have HPA // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. bool hpa_enabled = 19; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 20; + optional LabelSelector label_selector = 21; + optional RegexPattern name_pattern = 22; + optional RegexPattern namespace_pattern = 23; + + // How far back to analyze CPU/memory/GPU usage when generating rules from + // this policy. Unset = 7 days. Clamped to the team's tier cap on write. + optional int32 lookback_period_seconds = 24; + // Generic (workload-level, no-per-container) optimization settings this + // policy applies to every rule it generates — the same shape a manual + // rule's ManualRuleFields carries. Unset sub-fields mean "not configured + // for this axis"; the engine computes it as if this policy had no + // constraint at all. + ResourceRuleConfig cpu_rule = 25; + ResourceRuleConfig memory_rule = 26; + ResourceRuleConfig gpu_rule = 27; + HPARuleConfig hpa_rule = 28; + JVMHeapRuleConfig jvm_heap_rule = 29; + optional int64 jvm_cpu_startup_floor_millicores = 30; + EmergencyResponseConfig emergency_response = 31; +} + +// GenericOptimizationSettings bundles the optional, workload-level (no +// per-container) resource/HPA/JVM/emergency settings a +// WorkloadOptimizationPolicy can apply to every rule it generates. Mirrors +// ManualRuleFields but omits fields that only make sense for a single +// concrete rule (containers, disabled, startup_period_seconds). Sent as a +// single optional block on create/update: omitted entirely means "leave +// every one of these columns unset/unchanged"; present means apply whichever +// sub-fields are themselves set, exactly like ManualRuleFields already does +// for a manual rule. +message GenericOptimizationSettings { + ResourceRuleConfig cpu_rule = 1; + ResourceRuleConfig memory_rule = 2; + ResourceRuleConfig gpu_rule = 3; + HPARuleConfig hpa_rule = 4; + JVMHeapRuleConfig jvm_heap_rule = 5; + optional int64 jvm_cpu_startup_floor_millicores = 6; + EmergencyResponseConfig emergency_response = 7; } message CreateWorkloadOptimizationPolicyRequest { string team_id = 1; string name = 2; optional string description = 3; - bool enabled = 4; + bool disabled = 4; repeated string cluster_ids = 5; - repeated string namespace_selector = 6; + optional StringSetSelector namespace_selector = 6; // Scheduling & Triggers repeated ActionTrigger action_triggers = 7; @@ -3333,8 +4739,25 @@ message CreateWorkloadOptimizationPolicyRequest { optional string defragmentation_schedule = 12; bool live_migration_enabled = 13; bool use_in_place_vertical_scaling = 14; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 31; bool hpa_enabled = 15; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 16; + optional LabelSelector label_selector = 17; + optional RegexPattern name_pattern = 18; + optional RegexPattern namespace_pattern = 19; + + // Metrics lookback window in seconds. Unset = 7 days. + optional int32 lookback_period_seconds = 20; + // Optional. Omitted entirely (the field's zero-value nil pointer) means + // every new resource/HPA/JVM/emergency column is left at NULL — the + // policy relies purely on engine auto-computation. When present, only + // the sub-fields actually populated within it are written. + GenericOptimizationSettings settings = 30; } message CreateWorkloadOptimizationPolicyResponse { @@ -3343,6 +4766,11 @@ message CreateWorkloadOptimizationPolicyResponse { message ListWorkloadOptimizationPoliciesRequest { string team_id = 1; + // Optional. When set, restricts the listing to policies that target this + // cluster — either explicitly via cluster_ids, or implicitly via an empty + // cluster_ids array (which means "all clusters" and therefore applies + // to this cluster too). + string cluster_id = 2; } message ListWorkloadOptimizationPoliciesResponse { @@ -3358,14 +4786,35 @@ message GetWorkloadOptimizationPolicyResponse { WorkloadOptimizationPolicyProto policy = 1; } +// GetWorkloadOptimizationPolicyByWorkload looks up the optimization policy +// attached to a workload's rule in a single hop. Returns found = false when +// no rule exists for those coordinates or the rule has no policy attached. +message GetWorkloadOptimizationPolicyByWorkloadRequest { + string team_id = 1; + string cluster_id = 2; + string namespace = 3; + string kind = 4; + string workload_name = 5; +} + +message GetWorkloadOptimizationPolicyByWorkloadResponse { + WorkloadOptimizationPolicyProto policy = 1; +} + message UpdateWorkloadOptimizationPolicyRequest { + // 5 was "disabled", 21 was "rule_action" — disable transitions for an + // existing policy now go exclusively through + // ToggleWorkloadOptimizationPolicyDisabled, never through this general + // update. Reserved so the numbers can't be silently reused with different + // semantics. + reserved 5, 21; + string team_id = 1; string policy_id = 2; optional string name = 3; optional string description = 4; - optional bool enabled = 5; repeated string cluster_ids = 6; - repeated string namespace_selector = 7; + optional StringSetSelector namespace_selector = 7; // Scheduling & Triggers repeated ActionTrigger action_triggers = 8; @@ -3378,38 +4827,412 @@ message UpdateWorkloadOptimizationPolicyRequest { optional string defragmentation_schedule = 13; optional bool live_migration_enabled = 14; optional bool use_in_place_vertical_scaling = 15; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + optional bool allow_in_place_memory_limit_decrease = 31; optional bool hpa_enabled = 16; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 17; + optional LabelSelector label_selector = 18; + optional RegexPattern name_pattern = 19; + optional RegexPattern namespace_pattern = 20; + + // Metrics lookback window in seconds. Omitting it leaves the stored window + // alone rather than resetting it. A change reaches the policy's rules on + // their next generation pass. + optional int32 lookback_period_seconds = 22; + // Optional. Omitted entirely means leave every existing + // resource/HPA/JVM/emergency setting on this policy untouched — the same + // "only update when the client explicitly sends a value" convention + // already used above for cron_schedule/cooldown_minutes/etc. When + // present, each sub-field within it (cpu_rule, hpa_rule, ...) is applied + // independently: a sub-field left unset inside a present `settings` + // block leaves that axis's current value untouched too, exactly + // mirroring how ManualRuleFields already behaves for a manual rule edit. + GenericOptimizationSettings settings = 30; +} + +// ToggleWorkloadOptimizationPolicyDisabled is the sole way to change an +// existing policy's disabled state (creation sets the initial value directly +// via CreateWorkloadOptimizationPolicyRequest.disabled). Splitting this out +// from the general update keeps the branchy "what happens to a policy's +// existing rules when it goes disabled" logic in one place, not entangled +// with unrelated field updates. +message ToggleWorkloadOptimizationPolicyDisabledRequest { + string team_id = 1; + string policy_id = 2; + bool disabled = 3; + // Only consulted when transitioning enabled -> disabled. Unspecified + // defaults to KEEP (detach) — never a silent hard delete. Ignored when + // enabling, or when the policy is already in the requested state. + optional WorkloadRuleAction rule_action = 4; +} + +message ToggleWorkloadOptimizationPolicyDisabledResponse { + WorkloadOptimizationPolicyProto policy = 1; } message UpdateWorkloadOptimizationPolicyResponse { WorkloadOptimizationPolicyProto policy = 1; } +// WorkloadRuleAction is what should happen to a policy's already-generated +// rules when the policy is disabled. Modeled as an enum (not a bool) because +// KEEP/REMOVE won't stay the only two options. +enum WorkloadRuleAction { + WORKLOAD_RULE_ACTION_UNSPECIFIED = 0; + // Detach: rules survive and keep optimizing, but revert to + // auto_optimization ownership instead of being regenerated by this policy. + WORKLOAD_RULE_ACTION_KEEP = 1; + // Delete the rules and their in-cluster CRDs; workloads are no longer + // optimized by them. + WORKLOAD_RULE_ACTION_REMOVE = 2; + // Detach AND disable: same detach semantics as KEEP, but the rules become + // full no-ops (disabled=true) until manually re-enabled. Re-enabling this + // policy does NOT automatically re-enable them. + WORKLOAD_RULE_ACTION_DISABLE = 3; +} + message DeleteWorkloadOptimizationPolicyRequest { + // 3 was "delete_rules" (bool) — replaced by the same 3-way rule_action + // used by ToggleWorkloadOptimizationPolicyDisabled, so deleting a policy + // supports KEEP/DISABLE/REMOVE for its rules, not just keep-or-remove. + reserved 3; + string team_id = 1; string policy_id = 2; - bool delete_rules = 3; // if true, delete associated rules; if false, detach (set policy_id=null) + // Controls what happens to the policy's already-generated rules. + // Unspecified/omitted defaults to KEEP (detach) — never a silent hard + // delete. + optional WorkloadRuleAction rule_action = 4; } message DeleteWorkloadOptimizationPolicyResponse {} +// PreviewWorkloadOptimizationPolicyMatches: dry-run targeting preview. Mirrors +// CreateWorkloadOptimizationPolicyRequest's targeting fields exactly (plus +// optional policy_id) — deliberately excludes operational fields (triggers, +// scheduling, HPA/scaling flags) since those don't affect which workloads +// match, only what happens once a rule is generated for them. +message PreviewWorkloadOptimizationPolicyMatchesRequest { + string team_id = 1; + // Optional. Set in edit mode so matches already owned by this policy can + // be distinguished from matches owned by a different policy. Omit in + // create mode, where there is no "this policy" yet. + optional string policy_id = 2; + repeated string cluster_ids = 3; + optional StringSetSelector namespace_selector = 4; + optional StringSetSelector kind_selector = 5; + optional LabelSelector label_selector = 6; + optional RegexPattern name_pattern = 7; + optional RegexPattern namespace_pattern = 8; +} + +enum WorkloadOptimizationPolicyMatchStatus { + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED = 0; + // No workload_rule exists yet for this workload — saving the policy as + // configured would create one. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE = 1; + // A rule already exists and is owned by this policy (edit mode only) — + // saving would leave it as-is (recalibration happens on its own cadence). + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY = 2; + // Matched the selector, but a manually-managed rule already exists — + // this policy will never touch it. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL = 3; + // Matched the selector, but a CRD-managed (kubectl-applied) rule already + // exists — this policy will never touch it. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD = 4; + // Matched the selector, but a different policy already owns the rule — + // this policy will not steal it. See owning_policy_id/owning_policy_name. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY = 5; +} + +message WorkloadOptimizationPolicyMatch { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string name = 4; + string uid = 5; + WorkloadOptimizationPolicyMatchStatus status = 6; + // Populated only when status = SKIPPED_OWNED_BY_OTHER_POLICY. + optional string owning_policy_id = 7; + optional string owning_policy_name = 8; +} + +message PreviewWorkloadOptimizationPolicyMatchesResponse { + // Capped (see total_matched vs. total_returned below) — ordered by + // cluster, namespace, kind, name. + repeated WorkloadOptimizationPolicyMatch matched_workloads = 1; + // Total workloads that matched the selector across all requested + // clusters, before the cap was applied. + int32 total_matched = 2; + // How many of total_matched are actually included in matched_workloads. + // total_returned < total_matched means the result was capped — narrow the + // targeting to see the rest. + int32 total_returned = 3; +} + // ============================================================================ -// MPA V3: Workload Rule listing messages +// Scheduler Policies: CRUD, preview, and stream sync messages // ============================================================================ -message GetWorkloadRulesByPolicyRequest { - string team_id = 1; - string policy_id = 2; +message SchedulerPolicyTargetProto { + string id = 1; // empty on create; set on update to preserve identity + repeated string cluster_ids = 2; // empty = all team clusters + StringSetSelector namespace_selector = 3; + StringSetSelector kind_selector = 4; + LabelSelector label_selector = 5; + RegexPattern name_pattern = 6; + RegexPattern namespace_pattern = 7; } -message GetWorkloadRulesByPolicyResponse { - repeated WorkloadRule managed_rules = 1; - repeated WorkloadRule excluded_rules = 2; - map cluster_names = 3; +message SchedulerPolicyProto { + string id = 1; + string team_id = 2; + string name = 3; + optional string description = 4; + bool disabled = 5; + string scheduler_name = 6; + bool override_custom_scheduler = 7; + repeated SchedulerPolicyTargetProto targets = 8; + google.protobuf.Timestamp created_at = 9; + google.protobuf.Timestamp updated_at = 10; + // set while a delete waits for revert acks (spec 4.5) + optional google.protobuf.Timestamp delete_requested_at = 11; + // live enrollment count, filled by List (not persisted) + int32 enrolled_workloads = 12; + map cluster_names = 13; // cluster_id -> display name, union of target clusters +} + +message CreateSchedulerPolicyRequest { + string team_id = 1; + string name = 2; + optional string description = 3; + bool override_custom_scheduler = 4; + repeated SchedulerPolicyTargetProto targets = 5; } +message CreateSchedulerPolicyResponse { SchedulerPolicyProto policy = 1; } -message ListWorkloadRulesRequest { +message ListSchedulerPoliciesRequest { + string team_id = 1; + // When set, only policies with at least one live target covering this + // cluster are returned. Omitted (unset) returns every policy for the + // team, unfiltered. + optional string cluster_id = 2; +} +message ListSchedulerPoliciesResponse { repeated SchedulerPolicyProto policies = 1; } + +message UpdateSchedulerPolicyRequest { + string team_id = 1; + string policy_id = 2; + optional string name = 3; + optional string description = 4; + optional bool override_custom_scheduler = 5; + // full replacement of the target set (targets with ids are updated, + // without ids created, missing ones removed) — omitted (empty) list + // means "leave targets unchanged", carried by this flag: + bool replace_targets = 6; + repeated SchedulerPolicyTargetProto targets = 7; +} +message UpdateSchedulerPolicyResponse { SchedulerPolicyProto policy = 1; } + +message ToggleSchedulerPolicyDisabledRequest { + string team_id = 1; + string policy_id = 2; + bool disabled = 3; +} +message ToggleSchedulerPolicyDisabledResponse { + SchedulerPolicyProto policy = 1; + // active enrollments flipped to pending_revert by disabling + int32 reverts_initiated = 2; +} + +message DeleteSchedulerPolicyRequest { + string team_id = 1; + string policy_id = 2; + // force skips reverts: enrollments are abandoned in place (spec 4.5) + bool force = 3; +} +message DeleteSchedulerPolicyResponse { + // DELETED: no live enrollments existed (or force) — policy soft-deleted now. + // REVERTING: reverts initiated; delete finalizes when acks arrive. + enum Outcome { + OUTCOME_UNSPECIFIED = 0; + OUTCOME_DELETED = 1; + OUTCOME_REVERTING = 2; + } + Outcome outcome = 1; + int32 reverts_initiated = 2; +} + +message PreviewSchedulerPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; // set when editing, for diff classification + repeated SchedulerPolicyTargetProto targets = 3; +} +message SchedulerPolicyTargetMatch { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string name = 4; + enum Status { + STATUS_UNSPECIFIED = 0; + NEW_ENROLLMENT = 1; // would enroll + ALREADY_ENROLLED_THIS_POLICY = 2; // no change + ENROLLED_BY_OTHER_POLICY = 3; // precedence: stays with its owner + } + Status status = 5; + optional string owning_policy_id = 6; + optional string owning_policy_name = 7; + // workload spec's current schedulerName ("" = unset/default) + string current_scheduler = 8; +} +message PreviewSchedulerPolicyTargetsResponse { + repeated SchedulerPolicyTargetMatch matched_workloads = 1; + int32 total_matched = 2; + int32 total_returned = 3; // capped at 500, deterministic prefix + // Count over the FULL match set (like total_matched), not just the + // capped/returned prefix: matches whose current_scheduler is neither + // empty nor default-scheduler. + int32 custom_scheduler_count = 4; +} + +message ListSchedulerPolicyEnrollmentsRequest { + string team_id = 1; + string policy_id = 2; +} +message SchedulerPolicyEnrollment { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string workload_name = 4; + enum State { + STATE_UNSPECIFIED = 0; + STATE_ACTIVE = 1; + STATE_PENDING_REVERT = 2; + STATE_REVERTED = 3; + STATE_ABANDONED = 4; + } + State state = 5; + // Original scheduler captured in the workload's baseline. Unset when no + // baseline row exists yet (spec 3.3); an empty string is a real value — + // the baseline captured the field as unset on the workload, not "unknown". + optional string original_scheduler_name = 6; + google.protobuf.Timestamp enrolled_at = 7; + optional google.protobuf.Timestamp unenrolled_at = 8; +} +message ListSchedulerPolicyEnrollmentsResponse { + repeated SchedulerPolicyEnrollment enrollments = 1; + map cluster_names = 2; // cluster_id -> display name +} + +message SchedulerPolicySync { + repeated SchedulerPolicyProto policies = 1; + repeated SchedulerRevertInstruction reverts = 2; + // Opaque fingerprint of (policies, reverts, scheduler_settings); tunr + // echoes it in its next enrollment report so dakr can log convergence. + // Not used for correctness. + string sync_fingerprint = 3; + // Rendered dz-scheduler-config.yaml content for this cluster, when a + // settings row exists. Unset when the cluster has no persisted + // SchedulerSettings row — tunr must leave the helm-managed ConfigMap + // untouched in that case, not apply a rendered-defaults config. + SchedulerConfigPayload scheduler_settings = 4; +} + +message SchedulerConfigPayload { + // Complete dz-scheduler-config.yaml content, rendered by dakr. + string rendered_config = 1; + google.protobuf.Timestamp updated_at = 2; +} + +message SchedulerRevertInstruction { + string enrollment_id = 1; // ack correlation id for apply + string namespace = 2; + string kind = 3; + string workload_name = 4; + // literal value to restore; empty string means remove the field + // (baseline recorded the scheduler as unset). tunr prefers the + // on-workload annotation and uses this as fallback (spec 4.5 step 2). + string original_scheduler_name = 5; +} + +message SchedulerEnrollmentReport { + message Observation { + string namespace = 1; + string kind = 2; + string workload_name = 3; + string policy_id = 4; + // pre-mutation scheduler observed at first application; "" = field + // was unset in the workload spec + string original_scheduler_name = 5; + } + repeated Observation observations = 1; + // Echo of the SchedulerPolicySync.sync_fingerprint tunr last applied. + // dakr compares this against the sending stream's current delivery-state + // fingerprint and logs a divergence once per report (Debug/Info) -- + // informational only, never rejected: a stale echo just means tunr's + // report raced an in-flight sync push and will self-correct on the next + // tick. + string sync_fingerprint = 2; + // Full image ref of the running dz-scheduler container (registry/repo:tag), + // as read from the dz-scheduler Deployment's first container. Informational, + // and the version gate the config renderer (#9978) uses to decide which + // rendered-config shape a cluster can accept. "" = unknown or the + // Deployment was not found (scheduler disabled, or not yet observed). + string scheduler_image = 3; +} + +// SchedulerRevertEventReport carries fail-open scheduler revert events +// observed by tunr's admission failsafe: pods steered away from an +// unhealthy tracked scheduler at CREATE time. Pod-level and transient -- +// the owning workload stays enrolled; dakr records these as the negative +// signal for scheduler-impact observability. Batched per stream tick; +// dropped_events counts buffer overflow drops since the last report. +message SchedulerRevertEventReport { + message Event { + string namespace = 1; + string pod_name = 2; + // Owning controller identity when resolvable from ownerRefs at + // admission time; empty for bare pods. + string workload_kind = 3; + string workload_name = 4; + // scheduler-policy id annotation value if the pod carried one. + string policy_id = 5; + string from_scheduler = 6; + string to_scheduler = 7; + // Why the scheduler was considered unhealthy at revert time. + SchedulerUnhealthyReason reason = 8; + google.protobuf.Timestamp occurred_at = 9; + } + repeated Event events = 1; + uint32 dropped_events = 2; +} + +enum SchedulerUnhealthyReason { + SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED = 0; + SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED = 1; + SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK = 2; +} + +// ============================================================================ +// MPA V3: Workload Rule listing messages +// ============================================================================ + +message GetWorkloadRulesByPolicyRequest { + string team_id = 1; + string policy_id = 2; +} + +message GetWorkloadRulesByPolicyResponse { + repeated WorkloadRule managed_rules = 1; + repeated WorkloadRule excluded_rules = 2; + map cluster_names = 3; +} + +message ListWorkloadRulesRequest { string team_id = 1; optional string cluster_id = 2; } @@ -3469,6 +5292,52 @@ message DeleteWorkloadRuleRequest { message DeleteWorkloadRuleResponse {} +message DeleteAllWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DeleteAllWorkloadRulesResponse {} + +// BulkDeleteWorkloadRules deletes an explicit set of rules within a single +// cluster (e.g. a UI multi-select), triggering CRD removal for each. Scoped +// to cluster_id so the server can validate ownership once and reject any +// rule_ids that don't belong to that cluster, rather than trusting the caller. +message BulkDeleteWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated string rule_ids = 3; +} + +message BulkDeleteWorkloadRulesResponse { + int32 deleted_count = 1; +} + +// BulkToggleWorkloadRulesDisabled flips the disabled flag on an explicit set +// of rules within a single cluster (e.g. a UI multi-select) — each rule +// switches to whatever it currently is NOT, independently of the others, so +// a single call can disable some and enable others in one request. Mirrors +// BulkDeleteWorkloadRules's scoping: rule_ids that do not belong to +// cluster_id are silently excluded rather than erroring. +message BulkToggleWorkloadRulesDisabledRequest { + string team_id = 1; + string cluster_id = 2; + repeated string rule_ids = 3; +} + +message BulkToggleWorkloadRulesDisabledResponse { + int32 updated_count = 1; +} + +message DeleteRuleAndApplyRecommendationRequest { + string team_id = 1; + string rule_id = 2; + string workload_uid = 3; + WorkloadRecommendation workload_recommendation = 4; +} + +message DeleteRuleAndApplyRecommendationResponse {} + // ManualRuleFields carries the user-configurable rule fields shared by the // Upsert and Preview RPCs. Extracted as its own message so the two request // messages stay shape-aligned and the Go conversion logic has a single entry @@ -3488,8 +5357,35 @@ message ManualRuleFields { optional string defragmentation_schedule = 12; bool live_migration_enabled = 13; bool use_in_place_vertical_scaling = 14; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 20; // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. repeated ContainerResourceRuleConfig containers = 15; + // JVM heap optimization overrides for this rule. + JVMHeapRuleConfig jvm_heap_rule = 16; + + // Per-rule override of the JVM CPU startup floor (millicores). See + // WorkloadRule.jvm_cpu_startup_floor_millicores for semantics. + optional int64 jvm_cpu_startup_floor_millicores = 17; + + // Rule-wide on/off switch. Only valid when creating a brand-new rule via + // UpsertManualWorkloadRule — the request is REJECTED with an error if this + // is set while updating an existing rule. Use ToggleWorkloadRuleDisabled + // to change an existing rule's disabled state. See WorkloadRule.disabled + // for runtime semantics. optional (not plain bool) so the server can tell + // "omitted" apart from "explicitly false" and enforce the create-only rule. + optional bool disabled = 18; + + // Per-rule metrics lookback override. Unset inherits the owning policy's + // window, else the 7-day default. + optional int32 lookback_period_seconds = 19; + + // KEDA ScaledObject template authored by the user via the manual-rule form. + // Mirrors WorkloadRule.keda_scaled_object; written through by UpsertManualWorkloadRule. + // Field 20 is taken by main's allow_in_place_memory_limit_decrease (added on the + // main merge), so keda_scaled_object is 21. + optional KEDAScaledObjectTemplate keda_scaled_object = 21; } // WorkloadRuleSource identifies who created/last-modified a WorkloadRule. @@ -3531,6 +5427,19 @@ message UpsertManualWorkloadRuleResponse { WorkloadRule rule = 1; } +// ToggleWorkloadRuleDisabled is the sole way to change an EXISTING rule's +// disabled state. UpsertManualWorkloadRule only honors ManualRuleFields.disabled +// when creating a brand-new rule; every other transition goes through here. +message ToggleWorkloadRuleDisabledRequest { + string team_id = 1; + string rule_id = 2; + bool disabled = 3; +} + +message ToggleWorkloadRuleDisabledResponse { + WorkloadRule rule = 1; +} + // PreviewWorkloadRuleRequest mirrors the upsert request but does not // persist anything; returns a side-by-side preview instead. message PreviewWorkloadRuleRequest { @@ -3544,6 +5453,14 @@ message PreviewWorkloadRuleRequest { string workload_uid = 6; ManualRuleFields fields = 10; + + // Optional. Set when this preview is being driven by a + // WorkloadOptimizationPolicy rather than a manual draft (e.g. the policy + // targeting preview's per-row rule detail) — applies the policy's + // operational overrides (currently just hpa_enabled=false, which can only + // disable HPA, never force it on — same clamp real rule generation + // applies) to the materialized pass. Has no effect on engine_projection. + optional string policy_id = 11; } message PreviewWorkloadRuleResponse { @@ -3567,6 +5484,12 @@ message PreviewWorkloadRuleResponse { // workload not yet emitting metrics, etc.). FE renders the materialized // draft + observed view without an engine column. string engine_projection_unavailable_reason = 4; + + // The persisted DB rule for this workload. Null when no rule has been saved + // yet (create mode). Frontend fills ALL form fields directly from this when + // present; falls back to engine_projection for create-mode prefill. + // Engine suggestion chips always compare against engine_projection. + WorkloadRule db_rule = 5; } message GetWorkloadContainerNamesRequest { @@ -3608,6 +5531,78 @@ message BatchAutoOptimizeWorkloadsResponse { repeated BatchAutoOptimizeWorkloadResult results = 1; } +// Identifies a workload by namespace/kind/name. Shared by batch RPCs +// (BatchUpsertManualWorkloadRules, BatchPreviewWorkloadRules). +// workload_uid is only needed for preview (the profiling service uses it). +message BatchWorkloadEntry { + string namespace = 1; + string kind = 2; + string name = 3; + optional string workload_uid = 5; +} + +message BatchUpsertManualWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated BatchWorkloadEntry workloads = 3; + bool auto_generate = 4; + ManualRuleFields fields = 5; // shared across all workloads (only used when auto_generate=false) + WorkloadRuleSource source = 6; +} + +message BatchUpsertManualWorkloadRuleResult { + string namespace = 1; + string kind = 2; + string name = 3; + bool success = 4; + string error = 5; + WorkloadRule rule = 6; +} + +message BatchUpsertManualWorkloadRulesResponse { + repeated BatchUpsertManualWorkloadRuleResult results = 1; +} + +// Batch preview — applies the same ManualRuleFields to multiple workloads +// and returns per-workload previews without persisting anything. +message BatchPreviewWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated BatchWorkloadEntry workloads = 3; + ManualRuleFields fields = 4; // shared across all workloads +} + +message BatchPreviewWorkloadRuleResult { + string namespace = 1; + string kind = 2; + string name = 3; + bool success = 4; + string error = 5; + WorkloadRule materialized_rule = 6; + WorkloadRule engine_projection = 7; + WorkloadProfileResult profile = 8; + string engine_projection_unavailable_reason = 9; +} + +message BatchPreviewWorkloadRulesResponse { + repeated BatchPreviewWorkloadRuleResult results = 1; +} + +// ApplyOneTimeOptimization runs the MPA v2 engine for a workload and immediately +// creates a WorkloadRecommendation (no WorkloadRule persisted). Only allowed when +// no WorkloadRule already exists for the workload — the frontend disables the +// button in edit mode to enforce this at the UI layer too. +message ApplyOneTimeOptimizationRequest { + string team_id = 1; + string cluster_id = 2; + string namespace = 3; + string kind = 4; + string name = 5; + string workload_uid = 6; +} + +message ApplyOneTimeOptimizationResponse {} + // WorkloadProfileManifest is the authoritative key set for a single emit cycle // of profile snapshots for a (cluster, window) pair. The server sends exactly // one manifest followed by zero or more BatchWorkloadProfiles, all tagged with @@ -3653,3 +5648,599 @@ message GetNodeRecommendationStatusResponse { NodeRecommendationConfig current_config = 1; repeated NodeConfigApplyEvent history = 2; } + +// EnableCheckpointForPolicyRequest is the orchestration request for the C/R +// toggle on a node policy. enabled=true sets dakr.devzero.io/checkpoint-node +// on the policy template AND enqueues per-node label patches for all live nodes +// in the policy's matched groups. enabled=false unsets the label and enqueues +// the corresponding unset patches. +message EnableCheckpointForPolicyRequest { + string team_id = 1; + string policy_id = 2; + bool enabled = 3; +} + +message EnableCheckpointForPolicyResponse { + // UUID grouping the enqueued per-node patches; empty when no live nodes + // needed enqueueing (policy template still got patched). + string batch_id = 1; + uint32 enqueued_nodes = 2; + // cluster_ids whose live nodes were NOT enqueued because their dakr + // operator reports a version lower than MinVersionNodeLabelApply (the + // operator release carrying the Node `patch` RBAC verb + the + // dakr.devzero.io/* allowlist for SSA). The policy template was still + // patched for these clusters, so newly-provisioned nodes inherit the + // label via the NodePool template; existing nodes will be picked up the + // next time the user re-runs this action after the operator upgrade. + repeated string skipped_clusters = 3; +} + +message GetCheckpointApplyStatusRequest { + string team_id = 1; + string policy_id = 2; +} + +message GetCheckpointApplyStatusResponse { + // batch_id of the most-recent EnableCheckpointForPolicy batch for the + // supplied policy, or empty when no batch exists yet. + string batch_id = 1; + uint32 pending = 2; + uint32 applied = 3; + uint32 failed = 4; + // rejected lumps every other terminal status (superseded, blocked, ignored, + // and the operator's Rejected) — the UI surfaces them collectively as "did + // not apply". + uint32 rejected = 5; + repeated NodeApplyFailure failures = 6; +} + +message NodeApplyFailure { + string node_name = 1; + string error = 2; +} + +// NodeCheckpointLabelState describes the last-known per-node apply outcome for +// the checkpoint-restore label. PENDING/FAILED reflect the most recent +// generic_resource_recommendations row; NONE means we have no apply attempt +// on record for the node — has_label may still be true (label inherited via +// the Karpenter NodePool template, or set manually). +enum NodeCheckpointLabelState { + NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED = 0; + NODE_CHECKPOINT_LABEL_STATE_NONE = 1; + NODE_CHECKPOINT_LABEL_STATE_PENDING = 2; + NODE_CHECKPOINT_LABEL_STATE_APPLIED = 3; + NODE_CHECKPOINT_LABEL_STATE_FAILED = 4; + // REJECTED lumps every other terminal status (superseded, blocked, ignored) + // — the UI surfaces them collectively as "did not apply". + NODE_CHECKPOINT_LABEL_STATE_REJECTED = 5; +} + +message GetClusterCheckpointLabelCoverageRequest { + string team_id = 1; + string cluster_id = 2; +} + +message NodeGroupCheckpointLabelCoverage { + string node_pool_name = 1; + // total_nodes counts live nodes in the group whose node_group_name maps to + // a policy attached to this cluster via an enabled NodePolicyTarget. Nodes + // outside any policy's scope are excluded. + uint32 total_nodes = 2; + uint32 labeled_nodes = 3; + uint32 pending_nodes = 4; + uint32 failed_nodes = 5; + // ready_nodes = label applied AND criu_configured AND agent heartbeat fresh + // (<5 min). Drives the "Active · X/Y ready" / "Awaiting runtime · X/Y ready" + // NG-row subtext. + uint32 ready_nodes = 6; +} + +message GetClusterCheckpointLabelCoverageResponse { + repeated NodeGroupCheckpointLabelCoverage groups = 1; +} + +message ListNodeGroupCheckpointLabelStateRequest { + string team_id = 1; + string cluster_id = 2; + string node_pool_name = 3; +} + +message NodeCheckpointLabelEntry { + string node_name = 1; + bool has_label = 2; + NodeCheckpointLabelState last_apply_state = 3; + string last_error = 4; + // criu_configured = dakr-operator's last probe found criu installed on this + // node. Pair with criu_heartbeat_fresh — a true value with a stale heartbeat + // is not trustworthy. + bool criu_configured = 5; + // criu_heartbeat_fresh = agent_healths.last_ping_at within the last 5 min. + // FE renders "Active" only when has_label + criu_configured + this. + bool criu_heartbeat_fresh = 6; +} + +message ListNodeGroupCheckpointLabelStateResponse { + repeated NodeCheckpointLabelEntry nodes = 1; +} + +// --------------------------------------------------------------------------- +// Snapshot policies (resilience) + forensic snapshot policies (runtime +// security) — spec: dakr/docs/superpowers/specs/2026-07-02-snapshot-policies-design.md +// --------------------------------------------------------------------------- + +message SnapshotPercentBounds { + optional int32 upper = 1; + optional int32 lower = 2; +} + +message SnapshotResourceThreshold { + optional SnapshotPercentBounds cpu_percent = 1; + optional SnapshotPercentBounds memory_percent = 2; + optional int32 poll_interval_seconds = 3; +} + +// CheckpointSchedule behavior (triggers only — scope lives on the target). +message SnapshotSchedulePolicySpec { + optional int64 interval_seconds = 1; + optional SnapshotResourceThreshold resource_threshold = 2; + // Values: NodeDrain | PodEviction | Preemption (validated server-side; the CRD has no enum). + repeated string on_kubernetes_events = 3; + bool on_annotation = 4; +} + +message SnapshotGlobalRetention { + optional bool retain_orphan = 1; + optional int32 max_checkpoints_per_namespace = 2; + optional int32 max_checkpoints_per_pod = 3; + optional int32 max_checkpoints_per_container = 4; + // Sizes are integer MB; the compiler renders them as "Mi" quantities. + optional int32 max_checkpoint_size_mb = 5; + optional int32 max_total_size_per_namespace_mb = 6; + optional int32 max_total_size_per_pod_mb = 7; + optional int32 max_total_size_per_container_mb = 8; +} + +message SnapshotContainerRetentionPolicy { + string namespace = 1; + string pod = 2; + string container = 3; + optional bool retain_orphan = 4; + optional int32 max_checkpoints = 5; + optional int32 max_checkpoint_size_mb = 6; + optional int32 max_total_size_mb = 7; +} + +message SnapshotPodRetentionPolicy { + string namespace = 1; + string pod = 2; + optional bool retain_orphan = 3; + optional int32 max_checkpoints = 4; + optional int32 max_checkpoint_size_mb = 5; + optional int32 max_total_size_mb = 6; +} + +message SnapshotNamespaceRetentionPolicy { + string namespace = 1; + optional bool retain_orphan = 2; + optional int32 max_checkpoints = 3; + optional int32 max_checkpoint_size_mb = 4; + optional int32 max_total_size_mb = 5; +} + +// CheckpointRestoreOperator behavior (cluster-wide retention/GC config). +message SnapshotRetentionPolicySpec { + string checkpoint_directory = 1; + bool apply_policies_immediately = 2; + optional SnapshotGlobalRetention global_retention = 3; + repeated SnapshotContainerRetentionPolicy container_policies = 4; + repeated SnapshotPodRetentionPolicy pod_policies = 5; + repeated SnapshotNamespaceRetentionPolicy namespace_policies = 6; +} + +message SnapshotPolicy { + string policy_id = 1; + string team_id = 2; + string name = 3; + string description = 4; + oneof spec { + SnapshotSchedulePolicySpec schedule = 11; + SnapshotRetentionPolicySpec retention = 12; + } + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} + +enum ForensicPostSnapshotAction { + FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED = 0; + FORENSIC_POST_SNAPSHOT_ACTION_NONE = 1; + FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD = 2; +} + +message ForensicSnapshotPolicy { + string policy_id = 1; + string team_id = 2; + string name = 3; + string description = 4; + optional int64 interval_seconds = 11; + optional int32 max_snapshots = 12; + optional int64 max_duration_seconds = 13; + string hash_algorithm = 14; + ForensicPostSnapshotAction post_snapshot_action = 15; + // Read-only: 0 = never triggered. Mutable only via + // TriggerForensicSnapshotRun. Create rejects non-zero values; Update + // ignores the field entirely (round-tripped entities carry it). + int32 run_generation = 16; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} + +// Scope shared by both target families. Non-nil criteria combine with AND. +// Empty cluster_ids = NO clusters (deliberately inverted from WorkloadPolicyTarget). +message SnapshotTargetScope { + repeated string cluster_ids = 1; + repeated string namespaces = 11; + optional LabelSelector namespace_selector = 12; + optional RegexPattern namespace_pattern = 13; + optional LabelSelector workload_selector = 14; + optional LabelSelector annotation_selector = 15; + repeated string workload_names = 16; + optional RegexPattern name_pattern = 17; + repeated K8sObjectKind kind_filter = 18; + repeated string node_group_names = 19; + // Passed verbatim into the CR's spec.selector; operators restricted to + // In/NotIn/Exists/DoesNotExist (validated server-side). + optional LabelSelector pod_selector = 21; + repeated string container_names = 22; +} + +// NOTE: the spec's target-level runtime `status` field (§8) is deliberately +// absent — phase 6 (status ingestion) adds it as a backward-compatible field +// at tag 120, mirroring NodePolicyTarget.status. +message SnapshotPolicyTarget { + string target_id = 1; + string policy_id = 2; + string team_id = 3; + string name = 4; + string description = 5; + int32 priority = 6; + bool enabled = 7; + SnapshotTargetScope scope = 11; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; + // Ingested runtime status of the target's compiled CRs (spec §8). + // Populated by ListSnapshotPolicyTargets; unset when nothing ingested. + SnapshotPolicyTargetStatus status = 120; +} + +message ForensicSnapshotPolicyTarget { + string target_id = 1; + string policy_id = 2; + string team_id = 3; + string name = 4; + string description = 5; + int32 priority = 6; + bool enabled = 7; + SnapshotTargetScope scope = 11; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; + // Ingested runtime status of the target's compiled chain CRs (spec §8). + SnapshotPolicyTargetStatus status = 120; +} + +// ---- CRUD: snapshot policies ---- +message CreateSnapshotPoliciesRequest { + string team_id = 1; + repeated SnapshotPolicy policies = 2; // policy_id/timestamps ignored +} +message CreateSnapshotPoliciesResponse { + repeated SnapshotPolicy policies = 1; +} +message ListSnapshotPoliciesRequest { + string team_id = 1; + int32 limit = 2; + int32 offset = 3; +} +message ListSnapshotPoliciesResponse { + repeated SnapshotPolicy policies = 1; + int64 total = 2; +} +message UpdateSnapshotPolicyRequest { + string team_id = 1; + SnapshotPolicy policy = 2; +} +message UpdateSnapshotPolicyResponse { + SnapshotPolicy policy = 1; +} +message DeleteSnapshotPolicyRequest { + string team_id = 1; + string policy_id = 2; +} +message DeleteSnapshotPolicyResponse { + bool success = 1; +} + +// ---- CRUD: snapshot policy targets ---- +message CreateSnapshotPolicyTargetsRequest { + string team_id = 1; + repeated SnapshotPolicyTarget targets = 2; // target_id/timestamps ignored +} +message CreateSnapshotPolicyTargetsResponse { + repeated SnapshotPolicyTarget targets = 1; +} +message ListSnapshotPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; + int32 limit = 3; + int32 offset = 4; +} +message ListSnapshotPolicyTargetsResponse { + repeated SnapshotPolicyTarget targets = 1; + int64 total = 2; +} +message UpdateSnapshotPolicyTargetRequest { + string team_id = 1; + SnapshotPolicyTarget target = 2; +} +message UpdateSnapshotPolicyTargetResponse { + SnapshotPolicyTarget target = 1; +} +message DeleteSnapshotPolicyTargetRequest { + string team_id = 1; + repeated string target_ids = 2; +} +message DeleteSnapshotPolicyTargetResponse { + bool success = 1; +} + +// ---- CRUD: forensic snapshot policies + targets (mirrors above) ---- +message CreateForensicSnapshotPoliciesRequest { + string team_id = 1; + repeated ForensicSnapshotPolicy policies = 2; +} +message CreateForensicSnapshotPoliciesResponse { + repeated ForensicSnapshotPolicy policies = 1; +} +message ListForensicSnapshotPoliciesRequest { + string team_id = 1; + int32 limit = 2; + int32 offset = 3; +} +message ListForensicSnapshotPoliciesResponse { + repeated ForensicSnapshotPolicy policies = 1; + int64 total = 2; +} +message UpdateForensicSnapshotPolicyRequest { + string team_id = 1; + ForensicSnapshotPolicy policy = 2; +} +message UpdateForensicSnapshotPolicyResponse { + ForensicSnapshotPolicy policy = 1; +} +message DeleteForensicSnapshotPolicyRequest { + string team_id = 1; + string policy_id = 2; +} +message DeleteForensicSnapshotPolicyResponse { + bool success = 1; +} +message CreateForensicSnapshotPolicyTargetsRequest { + string team_id = 1; + repeated ForensicSnapshotPolicyTarget targets = 2; +} +message CreateForensicSnapshotPolicyTargetsResponse { + repeated ForensicSnapshotPolicyTarget targets = 1; +} +message ListForensicSnapshotPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; + int32 limit = 3; + int32 offset = 4; +} +message ListForensicSnapshotPolicyTargetsResponse { + repeated ForensicSnapshotPolicyTarget targets = 1; + int64 total = 2; +} +message UpdateForensicSnapshotPolicyTargetRequest { + string team_id = 1; + ForensicSnapshotPolicyTarget target = 2; +} +message UpdateForensicSnapshotPolicyTargetResponse { + ForensicSnapshotPolicyTarget target = 1; +} +message DeleteForensicSnapshotPolicyTargetRequest { + string team_id = 1; + repeated string target_ids = 2; +} +message DeleteForensicSnapshotPolicyTargetResponse { + bool success = 1; +} + +// ---- Forensic run trigger ---- +message TriggerForensicSnapshotRunRequest { + string team_id = 1; + string policy_id = 2; +} +message TriggerForensicSnapshotRunResponse { + int32 run_generation = 1; +} + +// ---- Targeting preview (shared resolver, spec §6) ---- +message SnapshotResolvedWorkload { + K8sObjectKind kind = 1; + string name = 2; + string uid = 3; + optional LabelSelector pod_selector = 4; // from the workload's pod template + // Summed container resource requests + replicas from the workload spec, + // for the preview's workload table. Zero when the kind has no typed spec + // (Pod, CRDs) or the field is absent (DaemonSet/Job have no replica count). + int32 replicas = 5; + int64 cpu_request_millicores = 6; + int64 memory_request_bytes = 7; +} +message SnapshotResolvedNamespace { + string namespace = 1; + // Present only when workload-scope criteria were used; empty for + // pod_selector-passthrough targets. + repeated SnapshotResolvedWorkload workloads = 2; + bool pod_selector_passthrough = 3; +} +message SnapshotClusterScopePreview { + string cluster_id = 1; + repeated SnapshotResolvedNamespace namespaces = 2; + bool truncated = 3; // fan-out cap hit (spec §6) + string error = 4; // per-cluster resolution error (cluster missing, etc.) +} +message PreviewSnapshotPolicyTargetMatchesRequest { + string team_id = 1; + SnapshotTargetScope scope = 2; // unsaved target scope +} +message PreviewSnapshotPolicyTargetMatchesResponse { + repeated SnapshotClusterScopePreview clusters = 1; +} +message ForensicTargetOverlap { + string target_id = 1; + string policy_id = 2; + string cluster_id = 3; + string namespace = 4; + repeated string workload_uids = 5; +} +message PreviewForensicSnapshotPolicyTargetMatchesRequest { + string team_id = 1; + SnapshotTargetScope scope = 2; + // When previewing edits to an existing target, set this to its id so the + // target's persisted copy is not reported as overlapping itself. + optional string exclude_target_id = 3; +} +message PreviewForensicSnapshotPolicyTargetMatchesResponse { + repeated SnapshotClusterScopePreview clusters = 1; + // Enabled forensic targets whose rendered workloads intersect this scope + // (overlapping forensic captures race on DeletePod — spec §2). Computed + // against the rendered-scope read model, so overlaps reflect each + // target's matches as of its LAST RENDER (up to one render interval + // stale), not a live re-resolution. + repeated ForensicTargetOverlap overlaps = 2; +} + +// ---- Rendered scope (read model, spec §3.5) ---- +message SnapshotRenderedScopeRow { + string cluster_id = 1; + string policy_id = 2; + string target_id = 3; + string namespace = 4; + optional LabelSelector pod_selector = 5; + repeated string container_names = 6; + int32 workload_count = 7; + repeated SnapshotResolvedWorkload workloads = 8; + string config_id = 9; + optional int32 run_generation = 10; // forensic only + google.protobuf.Timestamp updated_at = 51; +} +message GetSnapshotPolicyTargetRenderedScopeRequest { + string team_id = 1; + oneof by { + string target_id = 2; + string policy_id = 3; + } + int32 limit = 4; + int32 offset = 5; +} +message GetSnapshotPolicyTargetRenderedScopeResponse { + repeated SnapshotRenderedScopeRow rows = 1; + int64 total = 2; +} +message GetForensicSnapshotPolicyTargetRenderedScopeRequest { + string team_id = 1; + oneof by { + string target_id = 2; + string policy_id = 3; + } + int32 limit = 4; + int32 offset = 5; +} +message GetForensicSnapshotPolicyTargetRenderedScopeResponse { + repeated SnapshotRenderedScopeRow rows = 1; + int64 total = 2; +} + +// ---- Delivery status (apply layer now; runtime status added in phase 6) ---- +message SnapshotConfigInfo { + string config_id = 1; + string cluster_id = 2; + string content_hash = 3; + string status = 4; // pending | applied | failed + string error = 5; + optional int32 run_generation = 6; // forensic only + string triggered_by = 7; // forensic only + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} +message SnapshotConfigApplyEventInfo { + string event_id = 1; + string config_id = 2; + string status = 3; + string error = 4; + google.protobuf.Timestamp applied_at = 51; + google.protobuf.Timestamp created_at = 52; +} +message GetSnapshotRecommendationStatusRequest { + string team_id = 1; + string cluster_id = 2; + int32 event_limit = 3; // default 20 +} +message GetSnapshotRecommendationStatusResponse { + optional SnapshotConfigInfo current_config = 1; + repeated SnapshotConfigApplyEventInfo events = 2; + // Ingested runtime status of the cluster's resilience-family CRs. + repeated SnapshotCRRuntimeStatus runtime = 3; + SnapshotPrereqs prereqs = 4; +} +message GetForensicSnapshotRecommendationStatusRequest { + string team_id = 1; + string cluster_id = 2; + int32 event_limit = 3; +} +message GetForensicSnapshotRecommendationStatusResponse { + optional SnapshotConfigInfo current_config = 1; + repeated SnapshotConfigApplyEventInfo events = 2; + // Ingested runtime status of the cluster's ForensicSnapshotChain CRs. + repeated SnapshotCRRuntimeStatus runtime = 3; +} + +// ---- Compiled-config preview (implemented in phase 3; Unimplemented now) ---- +message PreviewSnapshotRecommendationConfigRequest { + string team_id = 1; + string cluster_id = 2; +} +message PreviewSnapshotRecommendationConfigResponse { + string yaml = 1; +} +message PreviewForensicSnapshotRecommendationConfigRequest { + string team_id = 1; + string cluster_id = 2; +} +message PreviewForensicSnapshotRecommendationConfigResponse { + string yaml = 1; +} + +// ---- KEDA shared authentication ---- +message ListReferencedAuthenticationsRequest { + string team_id = 1; + string cluster_id = 2; +} + +// ReferencedAuthentication is a distinct KEDA authenticationRef observed +// across a cluster's active WorkloadRules. +// It carries no credential or secret data. +message ReferencedAuthentication { + string name = 1; + // kind is either TriggerAuthentication or ClusterTriggerAuthentication. + string kind = 2; + // used_by_count is the number of active WorkloadRules that reference this auth object. + int64 used_by_count = 3; + // namespaces lists the namespaces of the referencing WorkloadRules. + repeated string namespaces = 4; +} + +message ListReferencedAuthenticationsResponse { + repeated ReferencedAuthentication authentications = 1; +} diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 37aa365..18ca4a0 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -39,7 +39,7 @@ func (r *ResourceRuleConfigArgs) Annotate(a infer.Annotator) { // HPAMetricTriggerArgs configures a single metric source for the HPA. // Use this for Prometheus or custom metrics; CPU/Memory/Network triggers -// are auto-generated by the engine from primaryMetric / targetUtilization +// can be built-in (CPU/Memory/Network*) or external (prometheus, kafka, ...) // and should not be redeclared here. type HPAMetricTriggerArgs struct { Type string `pulumi:"type"` @@ -121,9 +121,6 @@ type HPARuleConfigArgs struct { Enabled bool `pulumi:"enabled,optional"` MinReplicas *int `pulumi:"minReplicas,optional"` MaxReplicas *int `pulumi:"maxReplicas,optional"` - TargetUtilization *float64 `pulumi:"targetUtilization,optional"` - TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization,optional"` - PrimaryMetric *string `pulumi:"primaryMetric,optional"` MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent,optional"` ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds,optional"` Metrics []HPAMetricTriggerArgs `pulumi:"metrics,optional"` @@ -137,12 +134,9 @@ func (h *HPARuleConfigArgs) Annotate(a infer.Annotator) { a.Describe(&h.Enabled, "Enable horizontal (replica) scaling. Example: true.") a.Describe(&h.MinReplicas, "Minimum number of replicas. Example: 2.") a.Describe(&h.MaxReplicas, "Maximum number of replicas. Example: 10.") - a.Describe(&h.TargetUtilization, "Target CPU utilization ratio (0-1). Example: 0.7.") - a.Describe(&h.TargetMemoryUtilization, "Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8.") - a.Describe(&h.PrimaryMetric, "Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'.") a.Describe(&h.MaxReplicaChangePercent, "Maximum percentage change in replica count per cycle. Example: 50.0.") a.Describe(&h.ScaleDownCooldownSeconds, "Seconds to wait between scale-down events. Example: 300.") - a.Describe(&h.Metrics, "Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here.") + a.Describe(&h.Metrics, "HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields.") a.Describe(&h.CompositeFormula, "Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'.") a.Describe(&h.Behavior, "Fine-grained scale-up and scale-down behavior policies.") a.Describe(&h.Fallback, "Replica fallback configuration when metrics are unavailable.") @@ -554,17 +548,6 @@ func hpaRuleConfigToProto(h *HPARuleConfigArgs) *apiv1.HPARuleConfig { v := int32(*h.MaxReplicas) p.MaxReplicas = &v } - if h.TargetUtilization != nil { - v := float32(*h.TargetUtilization) - p.TargetUtilization = &v - } - if h.TargetMemoryUtilization != nil { - v := float32(*h.TargetMemoryUtilization) - p.TargetMemoryUtilization = &v - } - if h.PrimaryMetric != nil { - p.PrimaryMetric = hpaMetricToProto(h.PrimaryMetric) - } if h.MaxReplicaChangePercent != nil { v := float32(*h.MaxReplicaChangePercent) p.MaxReplicaChangePercent = &v @@ -603,17 +586,6 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigArgs { v := int(*p.MaxReplicas) h.MaxReplicas = &v } - if p.TargetUtilization != nil { - v := float64(*p.TargetUtilization) - h.TargetUtilization = &v - } - if p.TargetMemoryUtilization != nil { - v := float64(*p.TargetMemoryUtilization) - h.TargetMemoryUtilization = &v - } - if p.PrimaryMetric != nil { - h.PrimaryMetric = hpaMetricFromProto(p.PrimaryMetric) - } if p.MaxReplicaChangePercent != nil { v := float64(*p.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &v diff --git a/provider/pkg/resources/workload_rule_test.go b/provider/pkg/resources/workload_rule_test.go index fb3502c..50430b9 100644 --- a/provider/pkg/resources/workload_rule_test.go +++ b/provider/pkg/resources/workload_rule_test.go @@ -538,16 +538,12 @@ func TestResourceRuleConfig_Nil(t *testing.T) { func TestHPARuleConfig_RoundTrip(t *testing.T) { minR := 1 maxR := 10 - util := 0.7 - metric := "cpu" maxChange := 50.0 h := &HPARuleConfigArgs{ - Enabled: true, - MinReplicas: &minR, - MaxReplicas: &maxR, - TargetUtilization: &util, - PrimaryMetric: &metric, + Enabled: true, + MinReplicas: &minR, + MaxReplicas: &maxR, MaxReplicaChangePercent: &maxChange, } @@ -564,9 +560,6 @@ func TestHPARuleConfig_RoundTrip(t *testing.T) { if back.MaxReplicas == nil || *back.MaxReplicas != maxR { t.Errorf("MaxReplicas: got %v, want %d", back.MaxReplicas, maxR) } - if back.PrimaryMetric == nil || *back.PrimaryMetric != metric { - t.Errorf("PrimaryMetric: got %v, want %q", back.PrimaryMetric, metric) - } if back.MaxReplicaChangePercent == nil || *back.MaxReplicaChangePercent != maxChange { t.Errorf("MaxReplicaChangePercent: got %v, want %f", back.MaxReplicaChangePercent, maxChange) } From 87586d61d377e7d2fb15680ad34febc3a7512f72 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 00:35:40 +0200 Subject: [PATCH 2/8] fix: real node-policy delete, replace-on-identity-change, safe defaults, NotFound handling, strict enums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NodePolicy.Delete now calls DeleteNodePolicy (the RPC exists and cascades targets server-side); it was a state-only no-op that left Karpenter NodePools running after 'pulumi destroy'. NodePolicy.Read also skips read-only source=="cluster" virtual policies that ListNodePolicies mixes in. - NodePolicyTarget.Delete disables the target via UpdateNodePolicyTarget (no delete RPC exists server-side) instead of silently leaving it enabled; clusterIds is validated to exactly one entry (the server rejects more). - WorkloadRule implements CustomDiff: changing clusterId/namespace/kind/name now replaces the resource. Update previously upserted a second rule server-side (the API keys on that 4-tuple) while state kept the old ID. - enabled on NodePolicyTarget and WorkloadPolicyTarget is now *bool with a default of true — omitting it used to silently create a DISABLED target while the docs said 'default true'. - Every Read returns an empty response on CodeNotFound (or not-found-in-list) so out-of-band deletions drop from state instead of failing refresh; every Delete tolerates CodeNotFound. - String enums (actionTriggers, detectionTriggers, kindFilter, selector operators, primaryMetric) are validated up front — the API silently drops unknown values, which previously produced policies with no triggers or targets matching every kind. Selector operators gain Gt/Lt mappings. - The retry interceptor now retries only idempotent (Get*/List*) RPCs: a transient failure on a Create whose first attempt landed server-side produced duplicate resources. - float32 values read back from the API convert via shortest-round-trip formatting (0.7 stays 0.7, not 0.699999988079071) — kills the perpetual diff after 'pulumi refresh'. enablePmaxProtection no longer materializes as &false when omitted. - Cluster.Update no longer silently rotates the cluster token when state has none (post-import): rotating on an unrelated change invalidated the running agent's credential. Imported clusters keep an empty token. Update also uses the same CustomName->Name fallback as Read. --- provider/pkg/provider/client.go | 20 +++- provider/pkg/provider/client_test.go | 54 +++++++-- provider/pkg/resources/cluster.go | 36 +++--- provider/pkg/resources/cluster_test.go | 31 +++-- .../pkg/resources/get_cluster_id_by_name.go | 8 +- .../resources/get_cluster_id_by_name_test.go | 2 +- provider/pkg/resources/node_policy.go | 27 ++++- provider/pkg/resources/node_policy_target.go | 56 +++++++-- .../pkg/resources/node_policy_target_test.go | 92 +++++++------- provider/pkg/resources/node_policy_test.go | 73 ++++++++++-- provider/pkg/resources/validation.go | 95 +++++++++++++++ provider/pkg/resources/workload_policy.go | 57 ++++++--- .../pkg/resources/workload_policy_target.go | 46 +++++-- .../resources/workload_policy_target_test.go | 6 +- .../pkg/resources/workload_policy_test.go | 4 +- provider/pkg/resources/workload_rule.go | 112 +++++++++++++----- provider/pkg/resources/workload_rule_test.go | 4 +- 17 files changed, 553 insertions(+), 170 deletions(-) create mode 100644 provider/pkg/resources/validation.go diff --git a/provider/pkg/provider/client.go b/provider/pkg/provider/client.go index efc07e9..eba2be0 100644 --- a/provider/pkg/provider/client.go +++ b/provider/pkg/provider/client.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "net/http" + "strings" "time" "connectrpc.com/connect" @@ -42,11 +43,28 @@ func authInterceptor(token string) connect.UnaryInterceptorFunc { } } +// isIdempotentProcedure reports whether an RPC is safe to retry after a +// transport-level failure. Only read-style RPCs qualify: a Create/Upsert whose +// first attempt actually landed server-side would be duplicated on retry +// (CreateNodePolicies without a client-set id always inserts a new row, and +// there is no name uniqueness). +func isIdempotentProcedure(procedure string) bool { + name := procedure + if i := strings.LastIndex(procedure, "/"); i >= 0 { + name = procedure[i+1:] + } + return strings.HasPrefix(name, "Get") || strings.HasPrefix(name, "List") +} + // retryInterceptor returns a Connect interceptor that retries transient errors -// (CodeUnavailable, CodeDeadlineExceeded) with exponential backoff. +// (CodeUnavailable, CodeDeadlineExceeded) with exponential backoff. Only +// idempotent (read-style) RPCs are retried. func retryInterceptor(maxAttempts int, initialDelay time.Duration) connect.UnaryInterceptorFunc { return func(next connect.UnaryFunc) connect.UnaryFunc { return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { + if !isIdempotentProcedure(req.Spec().Procedure) { + return next(ctx, req) + } delay := initialDelay for attempt := 0; attempt < maxAttempts; attempt++ { resp, err := next(ctx, req) diff --git a/provider/pkg/provider/client_test.go b/provider/pkg/provider/client_test.go index 1c0564c..13a8ab6 100644 --- a/provider/pkg/provider/client_test.go +++ b/provider/pkg/provider/client_test.go @@ -40,8 +40,7 @@ func TestRetryInterceptor_SuccessOnFirstAttempt(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -51,6 +50,27 @@ func TestRetryInterceptor_SuccessOnFirstAttempt(t *testing.T) { } } +// fakeIdempotentRequest wraps a connect request and reports a Get-style +// procedure, since retryInterceptor only retries idempotent (read) RPCs. +type fakeIdempotentRequest struct { + connect.AnyRequest + procedure string +} + +func (f *fakeIdempotentRequest) Spec() connect.Spec { + return connect.Spec{Procedure: f.procedure} +} + +func newIdempotentRequest() connect.AnyRequest { + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + return &fakeIdempotentRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sService/GetCluster"} +} + +func newMutatingRequest() connect.AnyRequest { + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + return &fakeIdempotentRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sRecommendationService/CreateNodePolicies"} +} + func TestRetryInterceptor_RetriesOnUnavailable(t *testing.T) { calls := 0 next := func(_ context.Context, _ connect.AnyRequest) (connect.AnyResponse, error) { @@ -61,8 +81,7 @@ func TestRetryInterceptor_RetriesOnUnavailable(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -79,8 +98,7 @@ func TestRetryInterceptor_DoesNotRetryOnPermissionDenied(t *testing.T) { return nil, connect.NewError(connect.CodePermissionDenied, errors.New("forbidden")) } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err == nil { t.Fatal("expected error, got nil") @@ -97,8 +115,7 @@ func TestRetryInterceptor_ExhaustsAllAttempts(t *testing.T) { return nil, connect.NewError(connect.CodeUnavailable, errors.New("always down")) } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err == nil { t.Fatal("expected error after exhausting retries") @@ -142,8 +159,7 @@ func TestRetryInterceptor_RetriesOnDeadlineExceeded(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -191,3 +207,21 @@ func TestClientsetGetSet(t *testing.T) { t.Error("Get should return the set ClientSet") } } + +// A transient failure on a mutating RPC must NOT be retried: if the first +// attempt landed server-side, a retry would create a duplicate resource. +func TestRetryInterceptor_DoesNotRetryMutations(t *testing.T) { + calls := 0 + next := func(_ context.Context, _ connect.AnyRequest) (connect.AnyResponse, error) { + calls++ + return nil, connect.NewError(connect.CodeUnavailable, errors.New("service down")) + } + + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newMutatingRequest()) + if err == nil { + t.Fatal("expected error") + } + if calls != 1 { + t.Errorf("expected exactly 1 call for a mutating RPC, got %d", calls) + } +} diff --git a/provider/pkg/resources/cluster.go b/provider/pkg/resources/cluster.go index ae37c48..4240d87 100644 --- a/provider/pkg/resources/cluster.go +++ b/provider/pkg/resources/cluster.go @@ -77,12 +77,15 @@ func (c *Cluster) Read(ctx context.Context, req infer.ReadRequest[ClusterArgs, C ClusterId: req.ID, })) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + // Deleted out of band — drop from state. + return infer.ReadResponse[ClusterArgs, ClusterState]{}, nil + } return infer.ReadResponse[ClusterArgs, ClusterState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetCluster: %w", err) } if resp.Msg.Cluster == nil { - return infer.ReadResponse[ClusterArgs, ClusterState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetCluster: cluster not found") + return infer.ReadResponse[ClusterArgs, ClusterState]{}, nil } // Prefer CustomName (user-set); fall back to the system-assigned Name. @@ -126,26 +129,21 @@ func (c *Cluster) Update(ctx context.Context, req infer.UpdateRequest[ClusterArg return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("UpdateCluster: empty response from server") } - token := req.State.Token - // Rotate the token if it is empty — this happens after `pulumi import`. - if token == "" { - resetResp, err := cs.ClusterMutationClient.ResetClusterToken(ctx, connect.NewRequest(&apiv1.ResetClusterTokenRequest{ - TeamId: cs.TeamID, - ClusterId: req.ID, - })) - if err != nil { - return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("ResetClusterToken: %w", err) - } - if resetResp.Msg.Token == "" { - return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("ResetClusterToken: server returned empty token") - } - token = resetResp.Msg.Token + // NOTE: the token is intentionally never rotated here. Rotating on update + // (the previous behavior when state had no token, e.g. after `pulumi + // import`) silently invalidated the credential the running in-cluster + // agent was using whenever an unrelated field changed. An imported + // cluster therefore has an empty token; rotate it deliberately from the + // DevZero UI (or by recreating the resource) if you need it in state. + name := updateResp.Msg.Cluster.CustomName + if name == "" { + name = updateResp.Msg.Cluster.Name } return infer.UpdateResponse[ClusterState]{ Output: ClusterState{ - ClusterArgs: ClusterArgs{Name: updateResp.Msg.Cluster.CustomName}, - Token: token, + ClusterArgs: ClusterArgs{Name: name}, + Token: req.State.Token, }, }, nil } @@ -161,7 +159,7 @@ func (c *Cluster) Delete(ctx context.Context, req infer.DeleteRequest[ClusterSta TeamId: cs.TeamID, ClusterId: req.ID, })) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { return infer.DeleteResponse{}, fmt.Errorf("DeleteCluster: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/cluster_test.go b/provider/pkg/resources/cluster_test.go index 2fa2cf4..948c42f 100644 --- a/provider/pkg/resources/cluster_test.go +++ b/provider/pkg/resources/cluster_test.go @@ -237,32 +237,41 @@ func TestCluster_Update_Success(t *testing.T) { } } -func TestCluster_Update_RotatesTokenWhenEmpty(t *testing.T) { +// The provider must never rotate the cluster token as a side effect of an +// unrelated update — that would silently invalidate the credential the +// running in-cluster agent is using. An imported cluster keeps an empty token. +func TestCluster_Update_DoesNotRotateToken(t *testing.T) { + rotated := false mut := &mockMutationClient{ - updateFn: func(_ context.Context, req *connect.Request[apiv1.UpdateClusterRequest]) (*connect.Response[apiv1.UpdateClusterResponse], error) { + updateFn: func(_ context.Context, _ *connect.Request[apiv1.UpdateClusterRequest]) (*connect.Response[apiv1.UpdateClusterResponse], error) { return connect.NewResponse(&apiv1.UpdateClusterResponse{ - Cluster: &apiv1.Cluster{CustomName: req.Msg.ClusterName}, + Cluster: &apiv1.Cluster{Id: "cluster-123", CustomName: "renamed"}, }), nil }, resetTokenFn: func(_ context.Context, _ *connect.Request[apiv1.ResetClusterTokenRequest]) (*connect.Response[apiv1.ResetClusterTokenResponse], error) { - return connect.NewResponse(&apiv1.ResetClusterTokenResponse{Token: "new-rotated-token"}), nil + rotated = true + return connect.NewResponse(&apiv1.ResetClusterTokenResponse{Token: "new-token"}), nil }, } withMockClientSet(t, mut, &mockK8SClient{}) c := &Cluster{} - // State.Token is empty — triggers rotation resp, err := c.Update(context.Background(), infer.UpdateRequest[ClusterArgs, ClusterState]{ ID: "cluster-123", - State: ClusterState{ClusterArgs: ClusterArgs{Name: "name"}, Token: ""}, - Inputs: ClusterArgs{Name: "name"}, + Inputs: ClusterArgs{Name: "renamed"}, + State: ClusterState{ClusterArgs: ClusterArgs{Name: "old"}, Token: ""}, }) - if err != nil { t.Fatalf("unexpected error: %v", err) } - if resp.Output.Token != "new-rotated-token" { - t.Errorf("token: got %q, want %q", resp.Output.Token, "new-rotated-token") + if rotated { + t.Fatal("expected token NOT to be rotated on update") + } + if resp.Output.Token != "" { + t.Fatalf("expected the (empty) state token to be preserved, got %q", resp.Output.Token) + } + if resp.Output.Name != "renamed" { + t.Fatalf("Name: got %q", resp.Output.Name) } } @@ -313,7 +322,7 @@ func TestCluster_Delete_Success(t *testing.T) { func TestCluster_Delete_APIError(t *testing.T) { mut := &mockMutationClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteClusterRequest]) (*connect.Response[apiv1.DeleteClusterResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockClientSet(t, mut, &mockK8SClient{}) diff --git a/provider/pkg/resources/get_cluster_id_by_name.go b/provider/pkg/resources/get_cluster_id_by_name.go index ccda7d9..e965ca9 100644 --- a/provider/pkg/resources/get_cluster_id_by_name.go +++ b/provider/pkg/resources/get_cluster_id_by_name.go @@ -56,9 +56,9 @@ func (f *GetClusterIdByName) Invoke(ctx context.Context, req infer.FunctionReque } rpcReq := &apiv1.GetClusterIDByNameRequest{ - TeamId: teamID, - Name: req.Input.Name, - Region: req.Input.Region, + TeamId: teamID, + Name: req.Input.Name, + Region: req.Input.Region, CloudProvider: req.Input.CloudProvider, } if req.Input.Liveness != nil { @@ -80,4 +80,4 @@ func (f *GetClusterIdByName) Invoke(ctx context.Context, req infer.FunctionReque return infer.FunctionResponse[GetClusterIDByNameResult]{ Output: GetClusterIDByNameResult{ClusterID: resp.Msg.Id}, }, nil -} \ No newline at end of file +} diff --git a/provider/pkg/resources/get_cluster_id_by_name_test.go b/provider/pkg/resources/get_cluster_id_by_name_test.go index 9ebd798..2956d80 100644 --- a/provider/pkg/resources/get_cluster_id_by_name_test.go +++ b/provider/pkg/resources/get_cluster_id_by_name_test.go @@ -234,4 +234,4 @@ func TestGetClusterIDByName_InvalidLiveness(t *testing.T) { if err == nil { t.Fatal("expected error for invalid liveness value") } -} \ No newline at end of file +} diff --git a/provider/pkg/resources/node_policy.go b/provider/pkg/resources/node_policy.go index 38aaf1e..0f245f8 100644 --- a/provider/pkg/resources/node_policy.go +++ b/provider/pkg/resources/node_policy.go @@ -444,7 +444,12 @@ func (n *NodePolicy) Read(ctx context.Context, req infer.ReadRequest[NodePolicyA fmt.Errorf("ListNodePolicies: %w", err) } + // ListNodePolicies also returns read-only virtual policies mirrored from + // non-dakr Karpenter resources (source == "cluster"); skip them. for _, p := range resp.Msg.Policies { + if p.Source != "" && p.Source != "dakr" { + continue + } if p.Id == req.ID { updatedArgs := nodePolicyProtoToArgs(p) return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{ @@ -455,8 +460,9 @@ func (n *NodePolicy) Read(ctx context.Context, req infer.ReadRequest[NodePolicyA } } - return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("ListNodePolicies: policy %q not found", req.ID) + // Deleted out of band — return an empty response so the engine drops the + // resource from state instead of failing the refresh. + return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{}, nil } func (n *NodePolicy) Update(ctx context.Context, req infer.UpdateRequest[NodePolicyArgs, NodePolicyState]) (infer.UpdateResponse[NodePolicyState], error) { @@ -485,8 +491,21 @@ func (n *NodePolicy) Update(ctx context.Context, req infer.UpdateRequest[NodePol }, nil } -// Delete removes the resource from Pulumi state only — no delete endpoint exists for NodePolicy. -func (n *NodePolicy) Delete(_ context.Context, _ infer.DeleteRequest[NodePolicyState]) (infer.DeleteResponse, error) { +// Delete removes the node policy via DeleteNodePolicy (which also cascades +// its targets server-side). A policy already gone is treated as deleted. +func (n *NodePolicy) Delete(ctx context.Context, req infer.DeleteRequest[NodePolicyState]) (infer.DeleteResponse, error) { + cs := clientset.Get() + if cs == nil { + return infer.DeleteResponse{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") + } + + _, err := cs.RecommendationClient.DeleteNodePolicy(ctx, connect.NewRequest(&apiv1.DeleteNodePolicyRequest{ + TeamId: cs.TeamID, + PolicyId: req.ID, + })) + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + return infer.DeleteResponse{}, fmt.Errorf("DeleteNodePolicy: %w", err) + } return infer.DeleteResponse{}, nil } diff --git a/provider/pkg/resources/node_policy_target.go b/provider/pkg/resources/node_policy_target.go index a315ead..b94636d 100644 --- a/provider/pkg/resources/node_policy_target.go +++ b/provider/pkg/resources/node_policy_target.go @@ -17,7 +17,7 @@ type NodePolicyTargetArgs struct { PolicyId string `pulumi:"policyId"` ClusterIds []string `pulumi:"clusterIds"` Description *string `pulumi:"description,optional"` - Enabled bool `pulumi:"enabled,optional"` + Enabled *bool `pulumi:"enabled,optional"` } // NodePolicyTargetState is the full persisted state (identical to args — no additional computed fields). @@ -29,17 +29,31 @@ type NodePolicyTargetState struct { func (s *NodePolicyTargetState) Annotate(a infer.Annotator) { a.Describe(&s.Name, "Human-friendly name for the target.") a.Describe(&s.PolicyId, "Node policy ID this target is attached to.") - a.Describe(&s.ClusterIds, "Cluster IDs where this node policy applies.") + a.Describe(&s.ClusterIds, "Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster.") a.Describe(&s.Description, "Free-form description of the target.") a.Describe(&s.Enabled, "Whether this target is active. Defaults to true.") + a.SetDefault(&s.Enabled, true) } // NodePolicyTarget is the resource implementation. type NodePolicyTarget struct{} +func validateNodePolicyTargetArgs(a NodePolicyTargetArgs) error { + if len(a.ClusterIds) == 0 { + return fmt.Errorf("clusterIds must name exactly one cluster") + } + if len(a.ClusterIds) > 1 { + return fmt.Errorf("clusterIds names %d clusters, but the DevZero API accepts at most one cluster per node policy target; create one target per cluster", len(a.ClusterIds)) + } + return nil +} + // ---------- CRUD ---------- func (n *NodePolicyTarget) Create(ctx context.Context, req infer.CreateRequest[NodePolicyTargetArgs]) (infer.CreateResponse[NodePolicyTargetState], error) { + if err := validateNodePolicyTargetArgs(req.Inputs); err != nil { + return infer.CreateResponse[NodePolicyTargetState]{}, err + } if req.DryRun { return infer.CreateResponse[NodePolicyTargetState]{Output: NodePolicyTargetState{NodePolicyTargetArgs: req.Inputs}}, nil } @@ -92,11 +106,15 @@ func (n *NodePolicyTarget) Read(ctx context.Context, req infer.ReadRequest[NodeP } } - return infer.ReadResponse[NodePolicyTargetArgs, NodePolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("ListNodePolicyTargets: target %q not found", req.ID) + // Deleted out of band — return an empty response so the engine drops the + // resource from state instead of failing the refresh. + return infer.ReadResponse[NodePolicyTargetArgs, NodePolicyTargetState]{}, nil } func (n *NodePolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]) (infer.UpdateResponse[NodePolicyTargetState], error) { + if err := validateNodePolicyTargetArgs(req.Inputs); err != nil { + return infer.UpdateResponse[NodePolicyTargetState]{}, err + } if req.DryRun { return infer.UpdateResponse[NodePolicyTargetState]{Output: NodePolicyTargetState{NodePolicyTargetArgs: req.Inputs}}, nil } @@ -121,21 +139,42 @@ func (n *NodePolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[N }, nil } -// Delete removes the resource from Pulumi state only — no delete endpoint exists for NodePolicyTarget. -func (n *NodePolicyTarget) Delete(_ context.Context, _ infer.DeleteRequest[NodePolicyTargetState]) (infer.DeleteResponse, error) { +// Delete disables the target. The API has no DeleteNodePolicyTarget RPC, and +// leaving the target enabled would keep applying the node policy after +// `pulumi destroy`, so the target is disabled and removed from state (the row +// itself remains in the backend). +func (n *NodePolicyTarget) Delete(ctx context.Context, req infer.DeleteRequest[NodePolicyTargetState]) (infer.DeleteResponse, error) { + cs := clientset.Get() + if cs == nil { + return infer.DeleteResponse{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") + } + + target := nodePolicyTargetArgsToProto(cs.TeamID, req.ID, req.State.NodePolicyTargetArgs) + target.Enabled = false + + _, err := cs.RecommendationClient.UpdateNodePolicyTarget(ctx, connect.NewRequest(&apiv1.UpdateNodePolicyTargetRequest{ + Target: target, + })) + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + return infer.DeleteResponse{}, fmt.Errorf("disable node policy target on destroy: %w", err) + } return infer.DeleteResponse{}, nil } // ---------- proto conversion ---------- func nodePolicyTargetArgsToProto(teamID, id string, a NodePolicyTargetArgs) *apiv1.NodePolicyTarget { + enabled := true + if a.Enabled != nil { + enabled = *a.Enabled + } t := &apiv1.NodePolicyTarget{ TargetId: id, TeamId: teamID, Name: a.Name, PolicyId: a.PolicyId, ClusterIds: a.ClusterIds, - Enabled: a.Enabled, + Enabled: enabled, } if a.Description != nil { t.Description = *a.Description @@ -144,11 +183,12 @@ func nodePolicyTargetArgsToProto(teamID, id string, a NodePolicyTargetArgs) *api } func nodePolicyTargetProtoToArgs(t *apiv1.NodePolicyTarget) NodePolicyTargetArgs { + enabled := t.Enabled a := NodePolicyTargetArgs{ Name: t.Name, PolicyId: t.PolicyId, ClusterIds: t.ClusterIds, - Enabled: t.Enabled, + Enabled: &enabled, } if t.Description != "" { a.Description = &t.Description diff --git a/provider/pkg/resources/node_policy_target_test.go b/provider/pkg/resources/node_policy_target_test.go index 4de9490..9e83b64 100644 --- a/provider/pkg/resources/node_policy_target_test.go +++ b/provider/pkg/resources/node_policy_target_test.go @@ -58,7 +58,7 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { if tgt.TeamId != "team-test" { t.Errorf("TeamId: got %q, want %q", tgt.TeamId, "team-test") } - if len(tgt.ClusterIds) != 2 { + if len(tgt.ClusterIds) != 1 { t.Errorf("ClusterIds: got %v", tgt.ClusterIds) } if !tgt.Enabled { @@ -71,7 +71,7 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { Name: "prod-target", PolicyId: "np-123", TeamId: "team-test", - ClusterIds: []string{"c-1", "c-2"}, + ClusterIds: []string{"c-1"}, Enabled: true, }, }, @@ -86,8 +86,8 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { Inputs: NodePolicyTargetArgs{ Name: "prod-target", PolicyId: "np-123", - ClusterIds: []string{"c-1", "c-2"}, - Enabled: true, + ClusterIds: []string{"c-1"}, + Enabled: boolPtr(true), }, }) if err != nil { @@ -242,7 +242,7 @@ func TestNodePolicyTarget_Read_Success(t *testing.T) { if resp.State.PolicyId != "np-123" { t.Errorf("PolicyId: got %q, want %q", resp.State.PolicyId, "np-123") } - if !resp.State.Enabled { + if resp.State.Enabled == nil || !*resp.State.Enabled { t.Error("Enabled should be true") } } @@ -258,9 +258,12 @@ func TestNodePolicyTarget_Read_NotFound(t *testing.T) { withMockNPTClientSet(t, rec) n := &NodePolicyTarget{} - _, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ID: "npt-missing"}) - if err == nil { - t.Fatal("expected error for not-found, got nil") + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ID: "npt-missing"}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected empty response (drop from state) for a target deleted out of band, got ID %q", resp.ID) } } @@ -325,7 +328,7 @@ func TestNodePolicyTarget_Update_Success(t *testing.T) { n := &NodePolicyTarget{} resp, err := n.Update(context.Background(), infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ ID: "npt-456", - Inputs: NodePolicyTargetArgs{Name: "updated-target", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: true}, + Inputs: NodePolicyTargetArgs{Name: "updated-target", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: boolPtr(true)}, }) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -351,12 +354,12 @@ func TestNodePolicyTarget_Update_Disable(t *testing.T) { n := &NodePolicyTarget{} resp, err := n.Update(context.Background(), infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ ID: "npt-456", - Inputs: NodePolicyTargetArgs{Name: "staging", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: false}, + Inputs: NodePolicyTargetArgs{Name: "staging", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: boolPtr(false)}, }) if err != nil { t.Fatalf("unexpected error: %v", err) } - if resp.Output.Enabled { + if resp.Output.Enabled != nil && *resp.Output.Enabled { t.Error("Enabled should be false after update") } } @@ -429,15 +432,37 @@ func TestNodePolicyTarget_Update_EmptyResponse(t *testing.T) { // ---------- Delete ---------- -func TestNodePolicyTarget_Delete_StateOnly(t *testing.T) { +// The API has no DeleteNodePolicyTarget RPC: destroy must disable the target +// so the node policy stops being applied. +func TestNodePolicyTarget_Delete_DisablesTarget(t *testing.T) { + disabled := false + rec := &mockRecommendationClientNPT{ + updateNodePolicyTargetFn: func(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyTargetRequest]) (*connect.Response[apiv1.UpdateNodePolicyTargetResponse], error) { + if req.Msg.Target.Enabled { + t.Error("expected the target to be disabled on destroy") + } + disabled = true + return connect.NewResponse(&apiv1.UpdateNodePolicyTargetResponse{Target: req.Msg.Target}), nil + }, + } + withMockNPTClientSet(t, rec) + n := &NodePolicyTarget{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyTargetState]{ - ID: "npt-456", - State: NodePolicyTargetState{}, + ID: "npt-456", + State: NodePolicyTargetState{NodePolicyTargetArgs: NodePolicyTargetArgs{ + Name: "prod-target", + PolicyId: "np-123", + ClusterIds: []string{"c-1"}, + Enabled: boolPtr(true), + }}, }) if err != nil { t.Fatalf("unexpected error: %v", err) } + if !disabled { + t.Fatal("expected UpdateNodePolicyTarget to be called with enabled=false") + } } func TestNodePolicyTarget_Delete_NilClientSet(t *testing.T) { @@ -447,8 +472,8 @@ func TestNodePolicyTarget_Delete_NilClientSet(t *testing.T) { n := &NodePolicyTarget{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyTargetState]{ID: "npt-456"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) + if err == nil { + t.Fatal("expected error when provider is not configured") } } @@ -461,7 +486,7 @@ func TestNodePolicyTarget_ProtoRoundtrip(t *testing.T) { PolicyId: "np-123", ClusterIds: []string{"c-1", "c-2", "c-3"}, Description: &desc, - Enabled: true, + Enabled: boolPtr(true), } proto := nodePolicyTargetArgsToProto("team-abc", "npt-456", input) @@ -497,40 +522,23 @@ func TestNodePolicyTarget_ProtoRoundtrip(t *testing.T) { if got.Description == nil || *got.Description != desc { t.Errorf("Description roundtrip failed") } - if !got.Enabled { + if got.Enabled == nil || !*got.Enabled { t.Error("Enabled roundtrip failed") } } -func TestNodePolicyTarget_MultipleClusterIds(t *testing.T) { - clusterIDs := []string{"c-us-east-1", "c-us-west-2", "c-eu-west-1"} - rec := &mockRecommendationClientNPT{ - createNodePolicyTargetsFn: func(_ context.Context, req *connect.Request[apiv1.CreateNodePolicyTargetsRequest]) (*connect.Response[apiv1.CreateNodePolicyTargetsResponse], error) { - tgt := req.Msg.Targets[0] - if len(tgt.ClusterIds) != 3 { - t.Errorf("expected 3 cluster IDs, got %d: %v", len(tgt.ClusterIds), tgt.ClusterIds) - } - return connect.NewResponse(&apiv1.CreateNodePolicyTargetsResponse{ - Targets: []*apiv1.NodePolicyTarget{ - {TargetId: "npt-multi", Name: "multi-cluster", PolicyId: "np-123", ClusterIds: clusterIDs}, - }, - }), nil - }, - } - withMockNPTClientSet(t, rec) - +// The API accepts at most one cluster per node policy target; the provider +// rejects multi-cluster targets before calling the API. +func TestNodePolicyTarget_MultipleClusterIds_Rejected(t *testing.T) { n := &NodePolicyTarget{} - resp, err := n.Create(context.Background(), infer.CreateRequest[NodePolicyTargetArgs]{ + _, err := n.Create(context.Background(), infer.CreateRequest[NodePolicyTargetArgs]{ Inputs: NodePolicyTargetArgs{ Name: "multi-cluster", PolicyId: "np-123", - ClusterIds: clusterIDs, + ClusterIds: []string{"c-us-east-1", "c-us-west-2", "c-eu-west-1"}, }, }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(resp.Output.ClusterIds) != 3 { - t.Errorf("ClusterIds: got %v", resp.Output.ClusterIds) + if err == nil { + t.Fatal("expected validation error for multiple cluster IDs") } } diff --git a/provider/pkg/resources/node_policy_test.go b/provider/pkg/resources/node_policy_test.go index c5eeb9e..cc2a5e4 100644 --- a/provider/pkg/resources/node_policy_test.go +++ b/provider/pkg/resources/node_policy_test.go @@ -18,6 +18,11 @@ type mockRecommendationClientNodePolicy struct { createNodePoliciesFn func(context.Context, *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) listNodePoliciesFn func(context.Context, *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) updateNodePolicyFn func(context.Context, *connect.Request[apiv1.UpdateNodePolicyRequest]) (*connect.Response[apiv1.UpdateNodePolicyResponse], error) + deleteNodePolicyFn func(context.Context, *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) +} + +func (m *mockRecommendationClientNodePolicy) DeleteNodePolicy(ctx context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + return m.deleteNodePolicyFn(ctx, req) } func (m *mockRecommendationClientNodePolicy) CreateNodePolicies(ctx context.Context, req *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) { @@ -198,11 +203,36 @@ func TestNodePolicy_Read_NotFound(t *testing.T) { withMockNodePolicyClientSet(t, rec) n := &NodePolicy{} - _, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ ID: "np-missing", }) - if err == nil { - t.Fatal("expected error for not-found, got nil") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected empty response (drop from state) for a policy deleted out of band, got ID %q", resp.ID) + } +} + +// ListNodePolicies mixes in read-only virtual policies mirrored from non-dakr +// Karpenter resources (source == "cluster"); Read must never adopt them. +func TestNodePolicy_Read_SkipsClusterSourcedPolicies(t *testing.T) { + rec := &mockRecommendationClientNodePolicy{ + listNodePoliciesFn: func(_ context.Context, _ *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) { + return connect.NewResponse(&apiv1.ListNodePoliciesResponse{ + Policies: []*apiv1.NodePolicy{{Id: "np-virtual", Name: "cluster-managed", Source: "cluster"}}, + }), nil + }, + } + withMockNodePolicyClientSet(t, rec) + + n := &NodePolicy{} + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ID: "np-virtual"}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected the cluster-sourced virtual policy to be skipped, got ID %q", resp.ID) } } @@ -339,8 +369,19 @@ func TestNodePolicy_Update_EmptyResponse(t *testing.T) { // ---------- Delete ---------- -func TestNodePolicy_Delete_StateOnly(t *testing.T) { - // Delete should always succeed without calling any API. +func TestNodePolicy_Delete_CallsAPI(t *testing.T) { + deleted := false + rec := &mockRecommendationClientNodePolicy{ + deleteNodePolicyFn: func(_ context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + if req.Msg.PolicyId != "np-123" { + t.Errorf("PolicyId: got %q, want %q", req.Msg.PolicyId, "np-123") + } + deleted = true + return connect.NewResponse(&apiv1.DeleteNodePolicyResponse{Success: true}), nil + }, + } + withMockNodePolicyClientSet(t, rec) + n := &NodePolicy{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ ID: "np-123", @@ -349,18 +390,34 @@ func TestNodePolicy_Delete_StateOnly(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } + if !deleted { + t.Fatal("expected DeleteNodePolicy to be called") + } +} + +func TestNodePolicy_Delete_ToleratesNotFound(t *testing.T) { + rec := &mockRecommendationClientNodePolicy{ + deleteNodePolicyFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("resource not found")) + }, + } + withMockNodePolicyClientSet(t, rec) + + n := &NodePolicy{} + if _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ID: "np-gone"}); err != nil { + t.Fatalf("expected NotFound to be tolerated, got: %v", err) + } } func TestNodePolicy_Delete_NilClientSet(t *testing.T) { - // Even with nil clientset, delete must succeed (state-only). prev := clientset.Get() clientset.Set(nil) t.Cleanup(func() { clientset.Set(prev) }) n := &NodePolicy{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ID: "np-123"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) + if err == nil { + t.Fatal("expected error when provider is not configured") } } diff --git a/provider/pkg/resources/validation.go b/provider/pkg/resources/validation.go new file mode 100644 index 0000000..f0b2d2a --- /dev/null +++ b/provider/pkg/resources/validation.go @@ -0,0 +1,95 @@ +package resources + +import ( + "fmt" + "sort" + "strings" +) + +// The DevZero API silently ignores unknown enum values (an unknown trigger is +// dropped, an unknown kind becomes UNSPECIFIED and matches nothing), so the +// provider validates every string-enum input up front and fails the operation +// with an actionable message instead. + +var ( + validActionTriggers = map[string]bool{ + "on_schedule": true, + "on_detection": true, + } + validDetectionTriggers = map[string]bool{ + "pod_creation": true, + "pod_update": true, + "pod_reschedule": true, + } + validKinds = map[string]bool{ + "Pod": true, "Job": true, "Deployment": true, "StatefulSet": true, + "DaemonSet": true, "ReplicaSet": true, "CronJob": true, + "ReplicationController": true, "Rollout": true, + } + validSelectorOperators = map[string]bool{ + "In": true, "NotIn": true, "Exists": true, "DoesNotExist": true, "Gt": true, "Lt": true, + } + validHPAMetrics = map[string]bool{ + "cpu": true, "memory": true, "gpu": true, "network_ingress": true, "network_egress": true, + } +) + +func sortedKeys(m map[string]bool) string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return strings.Join(keys, ", ") +} + +func validateEnumList(field string, values []string, valid map[string]bool) error { + for _, v := range values { + if !valid[v] { + return fmt.Errorf("%s: unknown value %q (valid values: %s)", field, v, sortedKeys(valid)) + } + } + return nil +} + +func validateSelector(field string, sel *LabelSelectorArgs) error { + if sel == nil { + return nil + } + for i, expr := range sel.MatchExpressions { + if !validSelectorOperators[expr.Operator] { + return fmt.Errorf("%s.matchExpressions[%d].operator: unknown value %q (valid values: %s)", field, i, expr.Operator, sortedKeys(validSelectorOperators)) + } + } + return nil +} + +func validateWorkloadPolicyArgs(a WorkloadPolicyArgs) error { + if err := validateEnumList("actionTriggers", a.ActionTriggers, validActionTriggers); err != nil { + return err + } + if err := validateEnumList("detectionTriggers", a.DetectionTriggers, validDetectionTriggers); err != nil { + return err + } + if a.HorizontalScaling != nil && a.HorizontalScaling.PrimaryMetric != nil && !validHPAMetrics[*a.HorizontalScaling.PrimaryMetric] { + return fmt.Errorf("horizontalScaling.primaryMetric: unknown value %q (valid values: %s)", *a.HorizontalScaling.PrimaryMetric, sortedKeys(validHPAMetrics)) + } + return nil +} + +func validateWorkloadPolicyTargetArgs(a WorkloadPolicyTargetArgs) error { + if err := validateEnumList("kindFilter", a.KindFilter, validKinds); err != nil { + return err + } + if err := validateSelector("namespaceSelector", a.NamespaceSelector); err != nil { + return err + } + return validateSelector("workloadSelector", a.WorkloadSelector) +} + +func validateWorkloadRuleArgs(a WorkloadRuleArgs) error { + if err := validateEnumList("actionTriggers", a.ActionTriggers, validActionTriggers); err != nil { + return err + } + return validateEnumList("detectionTriggers", a.DetectionTriggers, validDetectionTriggers) +} diff --git a/provider/pkg/resources/workload_policy.go b/provider/pkg/resources/workload_policy.go index 0bff12a..81eced6 100644 --- a/provider/pkg/resources/workload_policy.go +++ b/provider/pkg/resources/workload_policy.go @@ -3,6 +3,7 @@ package resources import ( "context" "fmt" + "strconv" "connectrpc.com/connect" "github.com/pulumi/pulumi-go-provider/infer" @@ -140,6 +141,10 @@ type WorkloadPolicy struct{} // ---------- CRUD ---------- func (w *WorkloadPolicy) Create(ctx context.Context, req infer.CreateRequest[WorkloadPolicyArgs]) (infer.CreateResponse[WorkloadPolicyState], error) { + if err := validateWorkloadPolicyArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadPolicyState]{}, err + } + if req.DryRun { return infer.CreateResponse[WorkloadPolicyState]{Output: WorkloadPolicyState{WorkloadPolicyArgs: req.Inputs}}, nil } @@ -178,12 +183,15 @@ func (w *WorkloadPolicy) Read(ctx context.Context, req infer.ReadRequest[Workloa PolicyId: req.ID, })) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{}, nil + } return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadRecommendationPolicy: %w", err) } if resp.Msg.Policy == nil { - return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadRecommendationPolicy: policy not found") + return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{}, nil } updatedArgs := protoToArgs(resp.Msg.Policy) @@ -195,6 +203,10 @@ func (w *WorkloadPolicy) Read(ctx context.Context, req infer.ReadRequest[Workloa } func (w *WorkloadPolicy) Update(ctx context.Context, req infer.UpdateRequest[WorkloadPolicyArgs, WorkloadPolicyState]) (infer.UpdateResponse[WorkloadPolicyState], error) { + if err := validateWorkloadPolicyArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadPolicyState]{}, err + } + if req.DryRun { return infer.UpdateResponse[WorkloadPolicyState]{Output: WorkloadPolicyState{WorkloadPolicyArgs: req.Inputs}}, nil } @@ -230,7 +242,7 @@ func (w *WorkloadPolicy) Delete(ctx context.Context, req infer.DeleteRequest[Wor TeamId: cs.TeamID, PolicyId: req.ID, })) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRecommendationPolicy: %w", err) } return infer.DeleteResponse{}, nil @@ -339,7 +351,7 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.StartupPeriodSeconds = &v } if p.MinChangePercent != nil { - v := float64(*p.MinChangePercent) + v := f32(*p.MinChangePercent) a.MinChangePercent = &v } if p.MinDataPoints != nil { @@ -347,15 +359,15 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.MinDataPoints = &v } if p.StabilityCvMax != nil { - v := float64(*p.StabilityCvMax) + v := f32(*p.StabilityCvMax) a.StabilityCvMax = &v } if p.HysteresisVsTarget != nil { - v := float64(*p.HysteresisVsTarget) + v := f32(*p.HysteresisVsTarget) a.HysteresisVsTarget = &v } if p.DriftDeltaPercent != nil { - v := float64(*p.DriftDeltaPercent) + v := f32(*p.DriftDeltaPercent) a.DriftDeltaPercent = &v } if p.MinVpaWindowDataPoints != nil { @@ -366,10 +378,12 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { v := int(*p.CooldownMinutes) a.CooldownMinutes = &v } - v := p.EnablePmaxProtection - a.EnablePmaxProtection = &v + if p.EnablePmaxProtection { + v := true + a.EnablePmaxProtection = &v + } if p.PmaxRatioThreshold != nil { - v := float64(*p.PmaxRatioThreshold) + v := f32(*p.PmaxRatioThreshold) a.PmaxRatioThreshold = &v } return a @@ -504,26 +518,26 @@ func verticalScalingFromProto(t *apiv1.VerticalScalingOptimizationTarget) *Verti v.MaxRequest = &x } if t.OverheadMultiplier != nil { - x := float64(*t.OverheadMultiplier) + x := f32(*t.OverheadMultiplier) v.OverheadMultiplier = &x } if t.TargetPercentile != nil { - x := float64(*t.TargetPercentile) + x := f32(*t.TargetPercentile) v.TargetPercentile = &x } if t.MaxScaleUpPercent != nil { - x := float64(*t.MaxScaleUpPercent) + x := f32(*t.MaxScaleUpPercent) v.MaxScaleUpPercent = &x } if t.MaxScaleDownPercent != nil { - x := float64(*t.MaxScaleDownPercent) + x := f32(*t.MaxScaleDownPercent) v.MaxScaleDownPercent = &x } if t.LimitsAdjustmentEnabled != nil { v.LimitsAdjustmentEnabled = t.LimitsAdjustmentEnabled } if t.LimitMultiplier != nil { - x := float64(*t.LimitMultiplier) + x := f32(*t.LimitMultiplier) v.LimitMultiplier = &x } if t.MinDataPoints != nil { @@ -586,7 +600,7 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MaxReplicas = &x } if t.TargetUtilization != nil { - x := float64(*t.TargetUtilization) + x := f32(*t.TargetUtilization) h.TargetUtilization = &x } if t.PrimaryMetric != nil { @@ -597,7 +611,7 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MinDataPoints = &x } if t.MaxReplicaChangePercent != nil { - x := float64(*t.MaxReplicaChangePercent) + x := f32(*t.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &x } return h @@ -646,3 +660,12 @@ func hpaMetricFromProto(m *apiv1.HPAMetricType) *string { } return &s } + +// f32(v) converts a float32 coming from the API into the float64 the Pulumi +// SDKs use, picking the shortest decimal that round-trips (so a stored 0.7 +// comes back as 0.7, not 0.699999988079071 — which would show as a perpetual +// diff after refresh). +func f32(v float32) float64 { + f, _ := strconv.ParseFloat(strconv.FormatFloat(float64(v), 'g', -1, 32), 64) + return f +} diff --git a/provider/pkg/resources/workload_policy_target.go b/provider/pkg/resources/workload_policy_target.go index 187605f..edef5ed 100644 --- a/provider/pkg/resources/workload_policy_target.go +++ b/provider/pkg/resources/workload_policy_target.go @@ -57,7 +57,7 @@ type WorkloadPolicyTargetArgs struct { ClusterIds []string `pulumi:"clusterIds"` Description *string `pulumi:"description,optional"` Priority int `pulumi:"priority,optional"` - Enabled bool `pulumi:"enabled,optional"` + Enabled *bool `pulumi:"enabled,optional"` WorkloadNames []string `pulumi:"workloadNames,optional"` NodeGroupNames []string `pulumi:"nodeGroupNames,optional"` KindFilter []string `pulumi:"kindFilter,optional"` @@ -79,7 +79,8 @@ func (s *WorkloadPolicyTargetState) Annotate(a infer.Annotator) { a.Describe(&s.ClusterIds, "Cluster IDs where this target applies.") a.Describe(&s.Description, "Free-form description of the target.") a.Describe(&s.Priority, "Evaluation priority; higher values take precedence when targets overlap.") - a.Describe(&s.Enabled, "Enable or disable this target.") + a.Describe(&s.Enabled, "Enable or disable this target. Defaults to true.") + a.SetDefault(&s.Enabled, true) a.Describe(&s.WorkloadNames, "Explicit list of workload names to include.") a.Describe(&s.NodeGroupNames, "Restrict matching to specific node groups by name.") a.Describe(&s.KindFilter, "Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod).") @@ -95,6 +96,10 @@ type WorkloadPolicyTarget struct{} // ---------- CRUD ---------- func (w *WorkloadPolicyTarget) Create(ctx context.Context, req infer.CreateRequest[WorkloadPolicyTargetArgs]) (infer.CreateResponse[WorkloadPolicyTargetState], error) { + if err := validateWorkloadPolicyTargetArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadPolicyTargetState]{}, err + } + if req.DryRun { return infer.CreateResponse[WorkloadPolicyTargetState]{Output: WorkloadPolicyTargetState{WorkloadPolicyTargetArgs: req.Inputs}}, nil } @@ -136,12 +141,15 @@ func (w *WorkloadPolicyTarget) Read(ctx context.Context, req infer.ReadRequest[W resp, err := cs.RecommendationClient.GetWorkloadPolicyTarget(ctx, getReq) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{}, nil + } return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadPolicyTarget: %w", err) } if resp.Msg.Target == nil { - return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadPolicyTarget: target not found") + return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{}, nil } updatedArgs := targetProtoToArgs(resp.Msg.Target) @@ -153,6 +161,10 @@ func (w *WorkloadPolicyTarget) Read(ctx context.Context, req infer.ReadRequest[W } func (w *WorkloadPolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]) (infer.UpdateResponse[WorkloadPolicyTargetState], error) { + if err := validateWorkloadPolicyTargetArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadPolicyTargetState]{}, err + } + if req.DryRun { return infer.UpdateResponse[WorkloadPolicyTargetState]{Output: WorkloadPolicyTargetState{WorkloadPolicyTargetArgs: req.Inputs}}, nil } @@ -191,7 +203,7 @@ func (w *WorkloadPolicyTarget) Delete(ctx context.Context, req infer.DeleteReque deleteReq.Header().Set("Authorization", "Bearer "+cs.Token) _, err := cs.RecommendationClient.DeleteWorkloadPolicyTarget(ctx, deleteReq) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadPolicyTarget: %w", err) } return infer.DeleteResponse{}, nil @@ -205,7 +217,7 @@ func targetArgsToCreateRequest(teamID string, a WorkloadPolicyTargetArgs) *apiv1 PolicyId: a.PolicyId, Name: a.Name, Priority: int32(a.Priority), - Enabled: a.Enabled, + Enabled: a.EnabledOrDefault(), ClusterIds: a.ClusterIds, WorkloadNames: a.WorkloadNames, NodeGroupNames: a.NodeGroupNames, @@ -229,7 +241,7 @@ func targetArgsToUpdateRequest(teamID, targetID string, a WorkloadPolicyTargetAr PolicyId: &policyID, Name: a.Name, Priority: int32(a.Priority), - Enabled: a.Enabled, + Enabled: a.EnabledOrDefault(), ClusterIds: a.ClusterIds, WorkloadNames: a.WorkloadNames, NodeGroupNames: a.NodeGroupNames, @@ -251,7 +263,7 @@ func targetProtoToArgs(t *apiv1.WorkloadPolicyTarget) WorkloadPolicyTargetArgs { PolicyId: t.PolicyId, ClusterIds: t.ClusterIds, Priority: int(t.Priority), - Enabled: t.Enabled, + Enabled: boolPtr(t.Enabled), WorkloadNames: t.WorkloadNames, NodeGroupNames: t.NodeGroupNames, KindFilter: kindFilterFromProto(t.KindFilter), @@ -389,6 +401,10 @@ func labelSelectorOperatorToProto(op string) commonv1.LabelSelectorOperator { return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_EXISTS case "DoesNotExist": return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST + case "Gt": + return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT + case "Lt": + return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_LT default: return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED } @@ -404,7 +420,21 @@ func labelSelectorOperatorFromProto(op commonv1.LabelSelectorOperator) string { return "Exists" case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST: return "DoesNotExist" + case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT: + return "Gt" + case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_LT: + return "Lt" default: return "" } } + +// EnabledOrDefault returns the effective enabled flag (default true). +func (a WorkloadPolicyTargetArgs) EnabledOrDefault() bool { + if a.Enabled == nil { + return true + } + return *a.Enabled +} + +func boolPtr(b bool) *bool { return &b } diff --git a/provider/pkg/resources/workload_policy_target_test.go b/provider/pkg/resources/workload_policy_target_test.go index fd46c40..b241fef 100644 --- a/provider/pkg/resources/workload_policy_target_test.go +++ b/provider/pkg/resources/workload_policy_target_test.go @@ -254,7 +254,7 @@ func TestWorkloadPolicyTarget_Read_Success(t *testing.T) { if resp.Inputs.Description == nil || *resp.Inputs.Description != desc { t.Errorf("description: got %v, want %q", resp.Inputs.Description, desc) } - if !resp.Inputs.Enabled { + if resp.Inputs.Enabled == nil || !*resp.Inputs.Enabled { t.Error("enabled should be true") } if resp.Inputs.Priority != 5 { @@ -279,7 +279,7 @@ func TestWorkloadPolicyTarget_Read_NilClientSet(t *testing.T) { func TestWorkloadPolicyTarget_Read_APIError(t *testing.T) { rec := &mockRecommendationClientFull{ getTargetFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.GetWorkloadPolicyTargetResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockTargetClientSet(t, rec) @@ -394,7 +394,7 @@ func TestWorkloadPolicyTarget_Delete_Success(t *testing.T) { func TestWorkloadPolicyTarget_Delete_APIError(t *testing.T) { rec := &mockRecommendationClientFull{ deleteTargetFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.DeleteWorkloadPolicyTargetResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockTargetClientSet(t, rec) diff --git a/provider/pkg/resources/workload_policy_test.go b/provider/pkg/resources/workload_policy_test.go index ca7ee4a..cfa5127 100644 --- a/provider/pkg/resources/workload_policy_test.go +++ b/provider/pkg/resources/workload_policy_test.go @@ -309,7 +309,7 @@ func TestWorkloadPolicy_Read_NilClientSet(t *testing.T) { func TestWorkloadPolicy_Read_APIError(t *testing.T) { rec := &mockRecommendationClient{ getFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.GetWorkloadRecommendationPolicyResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockRecommendationClientSet(t, rec) @@ -418,7 +418,7 @@ func TestWorkloadPolicy_Delete_Success(t *testing.T) { func TestWorkloadPolicy_Delete_APIError(t *testing.T) { rec := &mockRecommendationClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.DeleteWorkloadRecommendationPolicyResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockRecommendationClientSet(t, rec) diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 18ca4a0..1c86e2d 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -3,8 +3,11 @@ package resources import ( "context" "fmt" + "reflect" + "strings" "connectrpc.com/connect" + prov "github.com/pulumi/pulumi-go-provider" "github.com/pulumi/pulumi-go-provider/infer" apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" @@ -182,26 +185,26 @@ func (c *ContainerResourceRuleConfigArgs) Annotate(a infer.Annotator) { // WorkloadRuleArgs are the user-configurable inputs for a WorkloadRule resource. type WorkloadRuleArgs struct { - ClusterID string `pulumi:"clusterId"` - Namespace string `pulumi:"namespace"` - Kind string `pulumi:"kind"` - Name string `pulumi:"name"` - AutoGenerate *bool `pulumi:"autoGenerate,optional"` - CpuRule *ResourceRuleConfigArgs `pulumi:"cpuRule,optional"` - MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule,optional"` - GpuRule *ResourceRuleConfigArgs `pulumi:"gpuRule,optional"` - HpaRule *HPARuleConfigArgs `pulumi:"hpaRule,optional"` - EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse,optional"` - ActionTriggers []string `pulumi:"actionTriggers,optional"` - StartupPeriodSeconds *int `pulumi:"startupPeriodSeconds,optional"` - CronSchedule *string `pulumi:"cronSchedule,optional"` - CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` - DetectionTriggers []string `pulumi:"detectionTriggers,optional"` - SchedulerPlugins []string `pulumi:"schedulerPlugins,optional"` - DefragmentationSchedule *string `pulumi:"defragmentationSchedule,optional"` - LiveMigrationEnabled bool `pulumi:"liveMigrationEnabled,optional"` - UseInPlaceVerticalScaling bool `pulumi:"useInPlaceVerticalScaling,optional"` - Containers []ContainerResourceRuleConfigArgs `pulumi:"containers,optional"` + ClusterID string `pulumi:"clusterId"` + Namespace string `pulumi:"namespace"` + Kind string `pulumi:"kind"` + Name string `pulumi:"name"` + AutoGenerate *bool `pulumi:"autoGenerate,optional"` + CpuRule *ResourceRuleConfigArgs `pulumi:"cpuRule,optional"` + MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule,optional"` + GpuRule *ResourceRuleConfigArgs `pulumi:"gpuRule,optional"` + HpaRule *HPARuleConfigArgs `pulumi:"hpaRule,optional"` + EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse,optional"` + ActionTriggers []string `pulumi:"actionTriggers,optional"` + StartupPeriodSeconds *int `pulumi:"startupPeriodSeconds,optional"` + CronSchedule *string `pulumi:"cronSchedule,optional"` + CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` + DetectionTriggers []string `pulumi:"detectionTriggers,optional"` + SchedulerPlugins []string `pulumi:"schedulerPlugins,optional"` + DefragmentationSchedule *string `pulumi:"defragmentationSchedule,optional"` + LiveMigrationEnabled bool `pulumi:"liveMigrationEnabled,optional"` + UseInPlaceVerticalScaling bool `pulumi:"useInPlaceVerticalScaling,optional"` + Containers []ContainerResourceRuleConfigArgs `pulumi:"containers,optional"` } // Annotate provides SDK documentation for WorkloadRuleArgs fields. @@ -239,6 +242,10 @@ type WorkloadRule struct{} // ---------- CRUD ---------- func (w *WorkloadRule) Create(ctx context.Context, req infer.CreateRequest[WorkloadRuleArgs]) (infer.CreateResponse[WorkloadRuleState], error) { + if err := validateWorkloadRuleArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadRuleState]{}, err + } + if err := validateContainerRules(req.Inputs.Containers); err != nil { return infer.CreateResponse[WorkloadRuleState]{}, err } @@ -279,12 +286,15 @@ func (w *WorkloadRule) Read(ctx context.Context, req infer.ReadRequest[WorkloadR RuleId: req.ID, })) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{}, nil + } return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadRuleByID: %w", err) } if resp.Msg.Rule == nil { - return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadRuleByID: rule not found") + return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{}, nil } updatedArgs := ruleProtoToArgs(resp.Msg.Rule) @@ -296,6 +306,10 @@ func (w *WorkloadRule) Read(ctx context.Context, req infer.ReadRequest[WorkloadR } func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[WorkloadRuleArgs, WorkloadRuleState]) (infer.UpdateResponse[WorkloadRuleState], error) { + if err := validateWorkloadRuleArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadRuleState]{}, err + } + if err := validateContainerRules(req.Inputs.Containers); err != nil { return infer.UpdateResponse[WorkloadRuleState]{}, err } @@ -323,6 +337,44 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl }, nil } +// Diff implements infer.CustomDiff. The upsert API keys workload rules on +// (clusterId, namespace, kind, name): changing any of them through Update +// would create a second rule server-side while the Pulumi ID kept pointing at +// the old one. Mark those fields as requiring a replacement instead. +func (w *WorkloadRule) Diff(_ context.Context, req infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState]) (infer.DiffResponse, error) { + replaceOn := map[string]bool{ + "clusterId": true, + "namespace": true, + "kind": true, + "name": true, + } + + diff := map[string]prov.PropertyDiff{} + oldArgs := reflect.ValueOf(req.State.WorkloadRuleArgs) + newArgs := reflect.ValueOf(req.Inputs) + t := oldArgs.Type() + for i := 0; i < t.NumField(); i++ { + tag, ok := t.Field(i).Tag.Lookup("pulumi") + if !ok { + continue + } + name := strings.Split(tag, ",")[0] + if reflect.DeepEqual(oldArgs.Field(i).Interface(), newArgs.Field(i).Interface()) { + continue + } + kind := prov.Update + if replaceOn[name] { + kind = prov.UpdateReplace + } + diff[name] = prov.PropertyDiff{Kind: kind, InputDiff: true} + } + + return infer.DiffResponse{ + HasChanges: len(diff) > 0, + DetailedDiff: diff, + }, nil +} + func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[WorkloadRuleState]) (infer.DeleteResponse, error) { cs := clientset.Get() if cs == nil { @@ -333,7 +385,7 @@ func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[Workl TeamId: cs.TeamID, RuleId: req.ID, })) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRule: %w", err) } return infer.DeleteResponse{}, nil @@ -515,19 +567,19 @@ func resourceRuleConfigFromProto(p *apiv1.ResourceRuleConfig) *ResourceRuleConfi r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := float64(*p.LimitMultiplier) + v := f32(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := float64(*p.TargetPercentile) + v := f32(*p.TargetPercentile) r.TargetPercentile = &v } if p.MaxScaleUpPercent != nil { - v := float64(*p.MaxScaleUpPercent) + v := f32(*p.MaxScaleUpPercent) r.MaxScaleUpPercent = &v } if p.MaxScaleDownPercent != nil { - v := float64(*p.MaxScaleDownPercent) + v := f32(*p.MaxScaleDownPercent) r.MaxScaleDownPercent = &v } return r @@ -587,7 +639,7 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigArgs { h.MaxReplicas = &v } if p.MaxReplicaChangePercent != nil { - v := float64(*p.MaxReplicaChangePercent) + v := f32(*p.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &v } if p.ScaleDownCooldownSeconds != nil { @@ -835,11 +887,11 @@ func containerResourceConfigFromProto(p *apiv1.ContainerResourceConfig) *Resourc r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := float64(*p.LimitMultiplier) + v := f32(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := float64(*p.TargetPercentile) + v := f32(*p.TargetPercentile) r.TargetPercentile = &v } return r diff --git a/provider/pkg/resources/workload_rule_test.go b/provider/pkg/resources/workload_rule_test.go index 50430b9..ab52c09 100644 --- a/provider/pkg/resources/workload_rule_test.go +++ b/provider/pkg/resources/workload_rule_test.go @@ -311,7 +311,7 @@ func TestWorkloadRule_Read_NilClientSet(t *testing.T) { func TestWorkloadRule_Read_APIError(t *testing.T) { rec := &mockWorkloadRuleClient{ getFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadRuleByIDRequest]) (*connect.Response[apiv1.GetWorkloadRuleByIDResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockWorkloadRuleClientSet(t, rec) @@ -463,7 +463,7 @@ func TestWorkloadRule_Delete_NilClientSet(t *testing.T) { func TestWorkloadRule_Delete_APIError(t *testing.T) { rec := &mockWorkloadRuleClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadRuleRequest]) (*connect.Response[apiv1.DeleteWorkloadRuleResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockWorkloadRuleClientSet(t, rec) From 7d9adf3b7d43435df4c5cf03f742faf313dcba52 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 00:44:22 +0200 Subject: [PATCH 3/8] feat: align v1 workload policies, v2 workload rules, targets and node policies with the current API workloadPolicy (v1) new inputs: enableInPlaceVerticalScaling, allowInPlaceMemoryLimitDecrease, pdbEnabled, cpu/memory (limit) floor/ceiling percents, 9 JVM heap knobs, vertical requestUseRss/limitUseRss (memory only), horizontal networkTargetThroughputBytesPerSec, targetMemoryUtilization, compositeFormula, scaleDownCooldownSeconds. workloadPolicyTarget: annotationSelector, workloadNamesNotIn, kindFilterNotIn (validated); nodeGroupNames marked deprecated (unused upstream). workloadRule (v2): disabled (create via upsert; updates go through the ToggleWorkloadRuleDisabled RPC since the upsert rejects it), lookbackPeriodSeconds, per-axis initialRequest/floorPercent/ceilingPercent/ initialLimit/limitFloorPercent/limitCeilingPercent/requestUseRss/limitUseRss (also on container rules), hpaRule.metrics connectorId; metric metadata strips the serverAddress/query keys the backend folds in. nodePolicy: startupTaints, zonalShift (AWS only), instanceLocalNvme (AWS only), cloudProviderId, masterOverrideRoleName, azure.imageVersion (operator >= 1.8.4). --- provider/pkg/resources/node_policy.go | 56 +++++- provider/pkg/resources/validation.go | 8 +- provider/pkg/resources/workload_policy.go | 165 +++++++++++++++++- .../pkg/resources/workload_policy_target.go | 122 +++++++------ provider/pkg/resources/workload_rule.go | 91 +++++++++- 5 files changed, 378 insertions(+), 64 deletions(-) diff --git a/provider/pkg/resources/node_policy.go b/provider/pkg/resources/node_policy.go index 0f245f8..40161f8 100644 --- a/provider/pkg/resources/node_policy.go +++ b/provider/pkg/resources/node_policy.go @@ -298,6 +298,8 @@ type AzureNodeClassSpecArgs struct { Tags map[string]string `pulumi:"tags,optional"` Kubelet *AzureKubeletConfigurationArgs `pulumi:"kubelet,optional"` MaxPods *int `pulumi:"maxPods,optional"` + // Pinned node image version. Requires the DevZero node operator >= 1.8.4. + ImageVersion *string `pulumi:"imageVersion,optional"` } // Annotate provides SDK documentation for AzureNodeClassSpecArgs fields. @@ -345,8 +347,9 @@ type NodePolicyArgs struct { OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems,optional"` // Node metadata - Labels map[string]string `pulumi:"labels,optional"` - Taints []TaintArgs `pulumi:"taints,optional"` + Labels map[string]string `pulumi:"labels,optional"` + Taints []TaintArgs `pulumi:"taints,optional"` + StartupTaints []TaintArgs `pulumi:"startupTaints,optional"` // Policy configuration Disruption *DisruptionPolicyArgs `pulumi:"disruption,optional"` @@ -360,6 +363,15 @@ type NodePolicyArgs struct { Aws *AWSNodeClassSpecArgs `pulumi:"aws,optional"` Azure *AzureNodeClassSpecArgs `pulumi:"azure,optional"` + // AWS-only: behavior during an ARC zonal shift. + ZonalShift *ZonalShiftConfigArgs `pulumi:"zonalShift,optional"` + // AWS-only: ephemeral NVMe storage per node in GiB (karpenter.k8s.aws/instance-local-nvme). + InstanceLocalNvme *LabelSelectorArgs `pulumi:"instanceLocalNvme,optional"` + // Informational: 1 = AWS, 2 = Azure, 3 = GCP, 4 = OCI. Compilation always uses the target cluster's provider. + CloudProviderId *int `pulumi:"cloudProviderId,optional"` + // AWS fallback for aws.role when neither role nor instanceProfile is set. + MasterOverrideRoleName *string `pulumi:"masterOverrideRoleName,optional"` + // Raw Karpenter YAML (escape hatch for full customization) Raw []RawKarpenterSpecArgs `pulumi:"raw,optional"` } @@ -532,15 +544,31 @@ func nodePolicyArgsToProto(teamID, id string, a NodePolicyArgs) *apiv1.NodePolic CapacityTypes: labelSelectorToProto(a.CapacityTypes), OperatingSystems: labelSelectorToProto(a.OperatingSystems), Taints: taintsToProto(a.Taints), + StartupTaints: taintsToProto(a.StartupTaints), Disruption: disruptionPolicyToProto(a.Disruption), Limits: resourceLimitsToProto(a.Limits), Aws: awsNodeClassSpecToProto(a.Aws), Azure: azureNodeClassSpecToProto(a.Azure), Raw: rawKarpenterSpecsToProto(a.Raw), + InstanceLocalNvme: labelSelectorToProto(a.InstanceLocalNvme), } if a.Description != nil { p.Description = *a.Description } + if a.ZonalShift != nil { + p.ZonalShift = &apiv1.ZonalShiftConfig{ + RespectZonalShift: a.ZonalShift.RespectZonalShift, + EvictImpactedNodes: a.ZonalShift.EvictImpactedNodes, + AllowZoneFallback: a.ZonalShift.AllowZoneFallback, + } + } + if a.CloudProviderId != nil { + v := int64(*a.CloudProviderId) + p.CloudProviderId = &v + } + if a.MasterOverrideRoleName != nil { + p.MasterOverrideRoleName = *a.MasterOverrideRoleName + } return p } @@ -563,18 +591,38 @@ func nodePolicyProtoToArgs(p *apiv1.NodePolicy) NodePolicyArgs { CapacityTypes: labelSelectorFromProto(p.CapacityTypes), OperatingSystems: labelSelectorFromProto(p.OperatingSystems), Taints: taintsFromProto(p.Taints), + StartupTaints: taintsFromProto(p.StartupTaints), Disruption: disruptionPolicyFromProto(p.Disruption), Limits: resourceLimitsFromProto(p.Limits), Aws: awsNodeClassSpecFromProto(p.Aws), Azure: azureNodeClassSpecFromProto(p.Azure), Raw: rawKarpenterSpecsFromProto(p.Raw), + InstanceLocalNvme: labelSelectorFromProto(p.InstanceLocalNvme), } if p.Description != "" { a.Description = &p.Description } + if p.ZonalShift != nil { + a.ZonalShift = &ZonalShiftConfigArgs{ + RespectZonalShift: p.ZonalShift.RespectZonalShift, + EvictImpactedNodes: p.ZonalShift.EvictImpactedNodes, + AllowZoneFallback: p.ZonalShift.AllowZoneFallback, + } + } + a.CloudProviderId = int64PtrToIntPtr(p.CloudProviderId) + if p.MasterOverrideRoleName != "" { + a.MasterOverrideRoleName = &p.MasterOverrideRoleName + } return a } +// ZonalShiftConfigArgs configures behavior during an AWS ARC zonal shift (AWS only). +type ZonalShiftConfigArgs struct { + RespectZonalShift bool `pulumi:"respectZonalShift,optional"` + EvictImpactedNodes bool `pulumi:"evictImpactedNodes,optional"` + AllowZoneFallback bool `pulumi:"allowZoneFallback,optional"` +} + // ---------- taint helpers ---------- func taintsToProto(taints []TaintArgs) []*apiv1.Taint { @@ -1056,6 +1104,9 @@ func azureNodeClassSpecToProto(a *AzureNodeClassSpecArgs) *apiv1.AzureNodeClassS v := int32(*a.MaxPods) spec.MaxPods = &v } + if a.ImageVersion != nil { + spec.ImageVersion = a.ImageVersion + } return spec } @@ -1084,6 +1135,7 @@ func azureNodeClassSpecFromProto(spec *apiv1.AzureNodeClassSpec) *AzureNodeClass v := int(*spec.MaxPods) a.MaxPods = &v } + a.ImageVersion = spec.ImageVersion return a } diff --git a/provider/pkg/resources/validation.go b/provider/pkg/resources/validation.go index f0b2d2a..7c75e6d 100644 --- a/provider/pkg/resources/validation.go +++ b/provider/pkg/resources/validation.go @@ -81,10 +81,16 @@ func validateWorkloadPolicyTargetArgs(a WorkloadPolicyTargetArgs) error { if err := validateEnumList("kindFilter", a.KindFilter, validKinds); err != nil { return err } + if err := validateEnumList("kindFilterNotIn", a.KindFilterNotIn, validKinds); err != nil { + return err + } if err := validateSelector("namespaceSelector", a.NamespaceSelector); err != nil { return err } - return validateSelector("workloadSelector", a.WorkloadSelector) + if err := validateSelector("workloadSelector", a.WorkloadSelector); err != nil { + return err + } + return validateSelector("annotationSelector", a.AnnotationSelector) } func validateWorkloadRuleArgs(a WorkloadRuleArgs) error { diff --git a/provider/pkg/resources/workload_policy.go b/provider/pkg/resources/workload_policy.go index 81eced6..3993a57 100644 --- a/provider/pkg/resources/workload_policy.go +++ b/provider/pkg/resources/workload_policy.go @@ -26,6 +26,8 @@ type VerticalScalingArgs struct { MinDataPoints *int `pulumi:"minDataPoints,optional"` AdjustReqEvenIfNotSet *bool `pulumi:"adjustReqEvenIfNotSet,optional"` LimitsRemovalEnabled *bool `pulumi:"limitsRemovalEnabled,optional"` + RequestUseRss *bool `pulumi:"requestUseRss,optional"` + LimitUseRss *bool `pulumi:"limitUseRss,optional"` } // Annotate provides SDK documentation for VerticalScalingArgs fields. @@ -57,6 +59,11 @@ type HorizontalScalingArgs struct { PrimaryMetric *string `pulumi:"primaryMetric,optional"` MinDataPoints *int `pulumi:"minDataPoints,optional"` MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent,optional"` + + NetworkTargetThroughputBytesPerSec *int `pulumi:"networkTargetThroughputBytesPerSec,optional"` + TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization,optional"` + CompositeFormula *string `pulumi:"compositeFormula,optional"` + ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds,optional"` } // Annotate provides SDK documentation for HorizontalScalingArgs fields. @@ -96,6 +103,29 @@ type WorkloadPolicyArgs struct { CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` EnablePmaxProtection *bool `pulumi:"enablePmaxProtection,optional"` PmaxRatioThreshold *float64 `pulumi:"pmaxRatioThreshold,optional"` + + EnableInPlaceVerticalScaling *bool `pulumi:"enableInPlaceVerticalScaling,optional"` + AllowInPlaceMemoryLimitDecrease *bool `pulumi:"allowInPlaceMemoryLimitDecrease,optional"` + PdbEnabled *bool `pulumi:"pdbEnabled,optional"` + + CpuFloorPercent *int `pulumi:"cpuFloorPercent,optional"` + CpuCeilingPercent *int `pulumi:"cpuCeilingPercent,optional"` + MemoryFloorPercent *int `pulumi:"memoryFloorPercent,optional"` + MemoryCeilingPercent *int `pulumi:"memoryCeilingPercent,optional"` + CpuLimitFloorPercent *int `pulumi:"cpuLimitFloorPercent,optional"` + CpuLimitCeilingPercent *int `pulumi:"cpuLimitCeilingPercent,optional"` + MemoryLimitFloorPercent *int `pulumi:"memoryLimitFloorPercent,optional"` + MemoryLimitCeilingPercent *int `pulumi:"memoryLimitCeilingPercent,optional"` + + JvmHeapOptimizationEnabled *bool `pulumi:"jvmHeapOptimizationEnabled,optional"` + JvmHeapTargetPercentile *float64 `pulumi:"jvmHeapTargetPercentile,optional"` + JvmHeapHeadroomMultiplier *float64 `pulumi:"jvmHeapHeadroomMultiplier,optional"` + JvmNonHeapOverheadPercent *float64 `pulumi:"jvmNonHeapOverheadPercent,optional"` + JvmNonHeapOverheadBytes *int `pulumi:"jvmNonHeapOverheadBytes,optional"` + JvmMinHeapBytes *int `pulumi:"jvmMinHeapBytes,optional"` + JvmMaxHeapBytes *int `pulumi:"jvmMaxHeapBytes,optional"` + JvmPreferContainerSupport *bool `pulumi:"jvmPreferContainerSupport,optional"` + JvmCpuStartupFloorMillicores *int `pulumi:"jvmCpuStartupFloorMillicores,optional"` } // Annotate provides SDK documentation and default values for WorkloadPolicyArgs fields. @@ -317,9 +347,75 @@ func argsToProto(teamID, policyID string, a WorkloadPolicyArgs) *apiv1.WorkloadR v := float32(*a.PmaxRatioThreshold) p.PmaxRatioThreshold = &v } + + if a.EnableInPlaceVerticalScaling != nil { + p.EnableInPlaceVerticalScaling = *a.EnableInPlaceVerticalScaling + } + if a.AllowInPlaceMemoryLimitDecrease != nil { + p.AllowInPlaceMemoryLimitDecrease = *a.AllowInPlaceMemoryLimitDecrease + } + if a.PdbEnabled != nil { + p.PdbEnabled = *a.PdbEnabled + } + + p.CpuFloorPercent = intPtrToInt64Ptr(a.CpuFloorPercent) + p.CpuCeilingPercent = intPtrToInt64Ptr(a.CpuCeilingPercent) + p.MemoryFloorPercent = intPtrToInt64Ptr(a.MemoryFloorPercent) + p.MemoryCeilingPercent = intPtrToInt64Ptr(a.MemoryCeilingPercent) + p.CpuLimitFloorPercent = intPtrToInt64Ptr(a.CpuLimitFloorPercent) + p.CpuLimitCeilingPercent = intPtrToInt64Ptr(a.CpuLimitCeilingPercent) + p.MemoryLimitFloorPercent = intPtrToInt64Ptr(a.MemoryLimitFloorPercent) + p.MemoryLimitCeilingPercent = intPtrToInt64Ptr(a.MemoryLimitCeilingPercent) + + if a.JvmHeapOptimizationEnabled != nil { + p.JvmHeapOptimizationEnabled = *a.JvmHeapOptimizationEnabled + } + p.JvmHeapTargetPercentile = float64PtrToFloat32Ptr(a.JvmHeapTargetPercentile) + p.JvmHeapHeadroomMultiplier = float64PtrToFloat32Ptr(a.JvmHeapHeadroomMultiplier) + p.JvmNonHeapOverheadPercent = float64PtrToFloat32Ptr(a.JvmNonHeapOverheadPercent) + p.JvmNonHeapOverheadBytes = intPtrToInt64Ptr(a.JvmNonHeapOverheadBytes) + p.JvmMinHeapBytes = intPtrToInt64Ptr(a.JvmMinHeapBytes) + p.JvmMaxHeapBytes = intPtrToInt64Ptr(a.JvmMaxHeapBytes) + if a.JvmPreferContainerSupport != nil { + p.JvmPreferContainerSupport = *a.JvmPreferContainerSupport + } + p.JvmCpuStartupFloorMillicores = intPtrToInt64Ptr(a.JvmCpuStartupFloorMillicores) + return p } +func intPtrToInt64Ptr(v *int) *int64 { + if v == nil { + return nil + } + x := int64(*v) + return &x +} + +func int64PtrToIntPtr(v *int64) *int { + if v == nil { + return nil + } + x := int(*v) + return &x +} + +func float64PtrToFloat32Ptr(v *float64) *float32 { + if v == nil { + return nil + } + x := float32(*v) + return &x +} + +func float32PtrToFloat64Ptr(v *float32) *float64 { + if v == nil { + return nil + } + x := f32(*v) + return &x +} + func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a := WorkloadPolicyArgs{ Name: p.Name, @@ -386,6 +482,45 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { v := f32(*p.PmaxRatioThreshold) a.PmaxRatioThreshold = &v } + + if p.EnableInPlaceVerticalScaling { + v := true + a.EnableInPlaceVerticalScaling = &v + } + if p.AllowInPlaceMemoryLimitDecrease { + v := true + a.AllowInPlaceMemoryLimitDecrease = &v + } + if p.PdbEnabled { + v := true + a.PdbEnabled = &v + } + + a.CpuFloorPercent = int64PtrToIntPtr(p.CpuFloorPercent) + a.CpuCeilingPercent = int64PtrToIntPtr(p.CpuCeilingPercent) + a.MemoryFloorPercent = int64PtrToIntPtr(p.MemoryFloorPercent) + a.MemoryCeilingPercent = int64PtrToIntPtr(p.MemoryCeilingPercent) + a.CpuLimitFloorPercent = int64PtrToIntPtr(p.CpuLimitFloorPercent) + a.CpuLimitCeilingPercent = int64PtrToIntPtr(p.CpuLimitCeilingPercent) + a.MemoryLimitFloorPercent = int64PtrToIntPtr(p.MemoryLimitFloorPercent) + a.MemoryLimitCeilingPercent = int64PtrToIntPtr(p.MemoryLimitCeilingPercent) + + if p.JvmHeapOptimizationEnabled { + v := true + a.JvmHeapOptimizationEnabled = &v + } + a.JvmHeapTargetPercentile = float32PtrToFloat64Ptr(p.JvmHeapTargetPercentile) + a.JvmHeapHeadroomMultiplier = float32PtrToFloat64Ptr(p.JvmHeapHeadroomMultiplier) + a.JvmNonHeapOverheadPercent = float32PtrToFloat64Ptr(p.JvmNonHeapOverheadPercent) + a.JvmNonHeapOverheadBytes = int64PtrToIntPtr(p.JvmNonHeapOverheadBytes) + a.JvmMinHeapBytes = int64PtrToIntPtr(p.JvmMinHeapBytes) + a.JvmMaxHeapBytes = int64PtrToIntPtr(p.JvmMaxHeapBytes) + if p.JvmPreferContainerSupport { + v := true + a.JvmPreferContainerSupport = &v + } + a.JvmCpuStartupFloorMillicores = int64PtrToIntPtr(p.JvmCpuStartupFloorMillicores) + return a } @@ -499,6 +634,8 @@ func verticalScalingToProto(v *VerticalScalingArgs) *apiv1.VerticalScalingOptimi if v.LimitsRemovalEnabled != nil { t.LimitsRemovalEnabled = *v.LimitsRemovalEnabled } + t.RequestUseRss = v.RequestUseRss + t.LimitUseRss = v.LimitUseRss return t } @@ -544,10 +681,16 @@ func verticalScalingFromProto(t *apiv1.VerticalScalingOptimizationTarget) *Verti x := int(*t.MinDataPoints) v.MinDataPoints = &x } - adj := t.AdjustReqEvenIfNotSet - v.AdjustReqEvenIfNotSet = &adj - lre := t.LimitsRemovalEnabled - v.LimitsRemovalEnabled = &lre + if t.AdjustReqEvenIfNotSet { + adj := true + v.AdjustReqEvenIfNotSet = &adj + } + if t.LimitsRemovalEnabled { + lre := true + v.LimitsRemovalEnabled = &lre + } + v.RequestUseRss = t.RequestUseRss + v.LimitUseRss = t.LimitUseRss return v } @@ -581,6 +724,13 @@ func horizontalScalingToProto(h *HorizontalScalingArgs) *apiv1.HorizontalScaling x := float32(*h.MaxReplicaChangePercent) t.MaxReplicaChangePercent = &x } + t.NetworkTargetThroughputBytesPerSec = intPtrToInt64Ptr(h.NetworkTargetThroughputBytesPerSec) + t.TargetMemoryUtilization = float64PtrToFloat32Ptr(h.TargetMemoryUtilization) + t.CompositeFormula = h.CompositeFormula + if h.ScaleDownCooldownSeconds != nil { + x := int32(*h.ScaleDownCooldownSeconds) + t.ScaleDownCooldownSeconds = &x + } return t } @@ -614,6 +764,13 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H x := f32(*t.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &x } + h.NetworkTargetThroughputBytesPerSec = int64PtrToIntPtr(t.NetworkTargetThroughputBytesPerSec) + h.TargetMemoryUtilization = float32PtrToFloat64Ptr(t.TargetMemoryUtilization) + h.CompositeFormula = t.CompositeFormula + if t.ScaleDownCooldownSeconds != nil { + x := int(*t.ScaleDownCooldownSeconds) + h.ScaleDownCooldownSeconds = &x + } return h } diff --git a/provider/pkg/resources/workload_policy_target.go b/provider/pkg/resources/workload_policy_target.go index edef5ed..69a487b 100644 --- a/provider/pkg/resources/workload_policy_target.go +++ b/provider/pkg/resources/workload_policy_target.go @@ -52,19 +52,22 @@ func (l *LabelSelectorArgs) Annotate(a infer.Annotator) { // WorkloadPolicyTargetArgs are the user-configurable inputs for a WorkloadPolicyTarget resource. type WorkloadPolicyTargetArgs struct { - Name string `pulumi:"name"` - PolicyId string `pulumi:"policyId"` - ClusterIds []string `pulumi:"clusterIds"` - Description *string `pulumi:"description,optional"` - Priority int `pulumi:"priority,optional"` - Enabled *bool `pulumi:"enabled,optional"` - WorkloadNames []string `pulumi:"workloadNames,optional"` - NodeGroupNames []string `pulumi:"nodeGroupNames,optional"` - KindFilter []string `pulumi:"kindFilter,optional"` - NamePattern *NamePatternArgs `pulumi:"namePattern,optional"` - NamespacePattern *NamePatternArgs `pulumi:"namespacePattern,optional"` - NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector,optional"` - WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector,optional"` + Name string `pulumi:"name"` + PolicyId string `pulumi:"policyId"` + ClusterIds []string `pulumi:"clusterIds"` + Description *string `pulumi:"description,optional"` + Priority int `pulumi:"priority,optional"` + Enabled *bool `pulumi:"enabled,optional"` + WorkloadNames []string `pulumi:"workloadNames,optional"` + WorkloadNamesNotIn []string `pulumi:"workloadNamesNotIn,optional"` + NodeGroupNames []string `pulumi:"nodeGroupNames,optional"` + KindFilter []string `pulumi:"kindFilter,optional"` + KindFilterNotIn []string `pulumi:"kindFilterNotIn,optional"` + AnnotationSelector *LabelSelectorArgs `pulumi:"annotationSelector,optional"` + NamePattern *NamePatternArgs `pulumi:"namePattern,optional"` + NamespacePattern *NamePatternArgs `pulumi:"namespacePattern,optional"` + NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector,optional"` + WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector,optional"` } // WorkloadPolicyTargetState is the full persisted state (identical to args — no additional computed fields). @@ -82,7 +85,11 @@ func (s *WorkloadPolicyTargetState) Annotate(a infer.Annotator) { a.Describe(&s.Enabled, "Enable or disable this target. Defaults to true.") a.SetDefault(&s.Enabled, true) a.Describe(&s.WorkloadNames, "Explicit list of workload names to include.") - a.Describe(&s.NodeGroupNames, "Restrict matching to specific node groups by name.") + a.Describe(&s.WorkloadNamesNotIn, "Explicit list of workload names to exclude.") + a.Describe(&s.KindFilterNotIn, "Kubernetes kinds to exclude from matching. Same allowed values as kindFilter.") + a.Describe(&s.AnnotationSelector, "Select workloads by annotations (same semantics as label selectors, evaluated against annotations).") + a.Describe(&s.NodeGroupNames, "DEPRECATED: unused by the DevZero API — no longer evaluated by any active target.") + a.Deprecate(&s.NodeGroupNames, "node_group_names is deprecated by the DevZero API and no longer evaluated.") a.Describe(&s.KindFilter, "Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod).") a.Describe(&s.NamePattern, "Regex to match workload names.") a.Describe(&s.NamespacePattern, "Regex to match namespace names.") @@ -213,19 +220,22 @@ func (w *WorkloadPolicyTarget) Delete(ctx context.Context, req infer.DeleteReque func targetArgsToCreateRequest(teamID string, a WorkloadPolicyTargetArgs) *apiv1.CreateWorkloadPolicyTargetRequest { r := &apiv1.CreateWorkloadPolicyTargetRequest{ - TeamId: teamID, - PolicyId: a.PolicyId, - Name: a.Name, - Priority: int32(a.Priority), - Enabled: a.EnabledOrDefault(), - ClusterIds: a.ClusterIds, - WorkloadNames: a.WorkloadNames, - NodeGroupNames: a.NodeGroupNames, - KindFilter: kindFilterToProto(a.KindFilter), - NamePattern: namePatternToProto(a.NamePattern), - NamespacePattern: namePatternToProto(a.NamespacePattern), - NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), - WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + TeamId: teamID, + PolicyId: a.PolicyId, + Name: a.Name, + Priority: int32(a.Priority), + Enabled: a.EnabledOrDefault(), + ClusterIds: a.ClusterIds, + WorkloadNames: a.WorkloadNames, + WorkloadNamesNotIn: a.WorkloadNamesNotIn, + NodeGroupNames: a.NodeGroupNames, + KindFilter: kindFilterToProto(a.KindFilter), + KindFilterNotIn: kindFilterToProto(a.KindFilterNotIn), + NamePattern: namePatternToProto(a.NamePattern), + NamespacePattern: namePatternToProto(a.NamespacePattern), + NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), + WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + AnnotationSelector: labelSelectorToProto(a.AnnotationSelector), } if a.Description != nil { r.Description = *a.Description @@ -236,20 +246,23 @@ func targetArgsToCreateRequest(teamID string, a WorkloadPolicyTargetArgs) *apiv1 func targetArgsToUpdateRequest(teamID, targetID string, a WorkloadPolicyTargetArgs) *apiv1.UpdateWorkloadPolicyTargetRequest { policyID := a.PolicyId r := &apiv1.UpdateWorkloadPolicyTargetRequest{ - TeamId: teamID, - TargetId: targetID, - PolicyId: &policyID, - Name: a.Name, - Priority: int32(a.Priority), - Enabled: a.EnabledOrDefault(), - ClusterIds: a.ClusterIds, - WorkloadNames: a.WorkloadNames, - NodeGroupNames: a.NodeGroupNames, - KindFilter: kindFilterToProto(a.KindFilter), - NamePattern: namePatternToProto(a.NamePattern), - NamespacePattern: namePatternToProto(a.NamespacePattern), - NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), - WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + TeamId: teamID, + TargetId: targetID, + PolicyId: &policyID, + Name: a.Name, + Priority: int32(a.Priority), + Enabled: a.EnabledOrDefault(), + ClusterIds: a.ClusterIds, + WorkloadNames: a.WorkloadNames, + WorkloadNamesNotIn: a.WorkloadNamesNotIn, + NodeGroupNames: a.NodeGroupNames, + KindFilter: kindFilterToProto(a.KindFilter), + KindFilterNotIn: kindFilterToProto(a.KindFilterNotIn), + NamePattern: namePatternToProto(a.NamePattern), + NamespacePattern: namePatternToProto(a.NamespacePattern), + NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), + WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + AnnotationSelector: labelSelectorToProto(a.AnnotationSelector), } if a.Description != nil { r.Description = *a.Description @@ -259,18 +272,21 @@ func targetArgsToUpdateRequest(teamID, targetID string, a WorkloadPolicyTargetAr func targetProtoToArgs(t *apiv1.WorkloadPolicyTarget) WorkloadPolicyTargetArgs { a := WorkloadPolicyTargetArgs{ - Name: t.Name, - PolicyId: t.PolicyId, - ClusterIds: t.ClusterIds, - Priority: int(t.Priority), - Enabled: boolPtr(t.Enabled), - WorkloadNames: t.WorkloadNames, - NodeGroupNames: t.NodeGroupNames, - KindFilter: kindFilterFromProto(t.KindFilter), - NamePattern: namePatternFromProto(t.NamePattern), - NamespacePattern: namePatternFromProto(t.NamespacePattern), - NamespaceSelector: labelSelectorFromProto(t.NamespaceSelector), - WorkloadSelector: labelSelectorFromProto(t.WorkloadSelector), + Name: t.Name, + PolicyId: t.PolicyId, + ClusterIds: t.ClusterIds, + Priority: int(t.Priority), + Enabled: boolPtr(t.Enabled), + WorkloadNames: t.WorkloadNames, + WorkloadNamesNotIn: t.WorkloadNamesNotIn, + NodeGroupNames: t.NodeGroupNames, + KindFilter: kindFilterFromProto(t.KindFilter), + KindFilterNotIn: kindFilterFromProto(t.KindFilterNotIn), + NamePattern: namePatternFromProto(t.NamePattern), + NamespacePattern: namePatternFromProto(t.NamespacePattern), + NamespaceSelector: labelSelectorFromProto(t.NamespaceSelector), + WorkloadSelector: labelSelectorFromProto(t.WorkloadSelector), + AnnotationSelector: labelSelectorFromProto(t.AnnotationSelector), } if t.Description != "" { a.Description = &t.Description diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 1c86e2d..32f975e 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -25,6 +25,14 @@ type ResourceRuleConfigArgs struct { MaxScaleUpPercent *float64 `pulumi:"maxScaleUpPercent,optional"` MaxScaleDownPercent *float64 `pulumi:"maxScaleDownPercent,optional"` LimitsRemovalEnabled bool `pulumi:"limitsRemovalEnabled,optional"` + InitialRequest *int `pulumi:"initialRequest,optional"` + FloorPercent *int `pulumi:"floorPercent,optional"` + CeilingPercent *int `pulumi:"ceilingPercent,optional"` + InitialLimit *int `pulumi:"initialLimit,optional"` + LimitFloorPercent *int `pulumi:"limitFloorPercent,optional"` + LimitCeilingPercent *int `pulumi:"limitCeilingPercent,optional"` + RequestUseRss *bool `pulumi:"requestUseRss,optional"` + LimitUseRss *bool `pulumi:"limitUseRss,optional"` } // Annotate provides SDK documentation for ResourceRuleConfigArgs fields. @@ -52,6 +60,7 @@ type HPAMetricTriggerArgs struct { Metadata map[string]string `pulumi:"metadata,optional"` ServerAddress *string `pulumi:"serverAddress,optional"` Query *string `pulumi:"query,optional"` + ConnectorId *string `pulumi:"connectorId,optional"` } // Annotate provides SDK documentation for HPAMetricTriggerArgs fields. @@ -205,6 +214,8 @@ type WorkloadRuleArgs struct { LiveMigrationEnabled bool `pulumi:"liveMigrationEnabled,optional"` UseInPlaceVerticalScaling bool `pulumi:"useInPlaceVerticalScaling,optional"` Containers []ContainerResourceRuleConfigArgs `pulumi:"containers,optional"` + Disabled *bool `pulumi:"disabled,optional"` + LookbackPeriodSeconds *int `pulumi:"lookbackPeriodSeconds,optional"` } // Annotate provides SDK documentation for WorkloadRuleArgs fields. @@ -258,7 +269,7 @@ func (w *WorkloadRule) Create(ctx context.Context, req infer.CreateRequest[Workl return infer.CreateResponse[WorkloadRuleState]{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") } - resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs))) + resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs, true))) if err != nil { return infer.CreateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: %w", err) } @@ -322,7 +333,7 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") } - resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs))) + resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs, false))) if err != nil { return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: %w", err) } @@ -330,6 +341,25 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: empty response from server") } + // disabled cannot be sent through the upsert on update; use the toggle RPC. + wantDisabled := req.Inputs.Disabled != nil && *req.Inputs.Disabled + haveDisabled := req.State.Disabled != nil && *req.State.Disabled + if wantDisabled != haveDisabled { + toggleResp, err := cs.RecommendationClient.ToggleWorkloadRuleDisabled(ctx, connect.NewRequest(&apiv1.ToggleWorkloadRuleDisabledRequest{ + TeamId: cs.TeamID, + RuleId: resp.Msg.Rule.RuleId, + Disabled: wantDisabled, + })) + if err != nil { + return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("ToggleWorkloadRuleDisabled: %w", err) + } + if toggleResp.Msg.Rule != nil { + resp.Msg.Rule.Disabled = toggleResp.Msg.Rule.Disabled + } else { + resp.Msg.Rule.Disabled = wantDisabled + } + } + out := ruleProtoToArgs(resp.Msg.Rule) out.AutoGenerate = req.Inputs.AutoGenerate return infer.UpdateResponse[WorkloadRuleState]{ @@ -393,7 +423,10 @@ func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[Workl // ---------- proto conversion helpers ---------- -func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs) *apiv1.UpsertManualWorkloadRuleRequest { +// ruleArgsToUpsertRequest builds the upsert request. includeDisabled must be +// true only on Create: the server rejects fields.disabled when updating an +// existing rule (ToggleWorkloadRuleDisabled is the update path). +func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs, includeDisabled bool) *apiv1.UpsertManualWorkloadRuleRequest { // Attribute the rule to the Pulumi provider so the server persists // source=pulumi_manual or source=pulumi_auto. Audit + UI surfaces use // this to distinguish IaC-managed rules from UI edits AND to tell whether @@ -442,6 +475,13 @@ func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs) *apiv1.UpsertMan if a.DefragmentationSchedule != nil { req.Fields.DefragmentationSchedule = a.DefragmentationSchedule } + if a.LookbackPeriodSeconds != nil { + v := int32(*a.LookbackPeriodSeconds) + req.Fields.LookbackPeriodSeconds = &v + } + if includeDisabled && a.Disabled != nil { + req.Fields.Disabled = a.Disabled + } return req } @@ -463,6 +503,14 @@ func ruleProtoToArgs(r *apiv1.WorkloadRule) WorkloadRuleArgs { UseInPlaceVerticalScaling: r.UseInPlaceVerticalScaling, Containers: containerRuleConfigsFromProto(r.Containers), } + if r.Disabled { + v := true + a.Disabled = &v + } + if r.LookbackPeriodSeconds != nil { + v := int(*r.LookbackPeriodSeconds) + a.LookbackPeriodSeconds = &v + } if r.StartupPeriodSeconds != nil { v := int(*r.StartupPeriodSeconds) a.StartupPeriodSeconds = &v @@ -546,6 +594,14 @@ func resourceRuleConfigToProto(r *ResourceRuleConfigArgs) *apiv1.ResourceRuleCon v := float32(*r.MaxScaleDownPercent) p.MaxScaleDownPercent = &v } + p.InitialRequest = intPtrToInt64Ptr(r.InitialRequest) + p.FloorPercent = intPtrToInt64Ptr(r.FloorPercent) + p.CeilingPercent = intPtrToInt64Ptr(r.CeilingPercent) + p.InitialLimit = intPtrToInt64Ptr(r.InitialLimit) + p.LimitFloorPercent = intPtrToInt64Ptr(r.LimitFloorPercent) + p.LimitCeilingPercent = intPtrToInt64Ptr(r.LimitCeilingPercent) + p.RequestUseRss = r.RequestUseRss + p.LimitUseRss = r.LimitUseRss return p } @@ -582,6 +638,14 @@ func resourceRuleConfigFromProto(p *apiv1.ResourceRuleConfig) *ResourceRuleConfi v := f32(*p.MaxScaleDownPercent) r.MaxScaleDownPercent = &v } + r.InitialRequest = int64PtrToIntPtr(p.InitialRequest) + r.FloorPercent = int64PtrToIntPtr(p.FloorPercent) + r.CeilingPercent = int64PtrToIntPtr(p.CeilingPercent) + r.InitialLimit = int64PtrToIntPtr(p.InitialLimit) + r.LimitFloorPercent = int64PtrToIntPtr(p.LimitFloorPercent) + r.LimitCeilingPercent = int64PtrToIntPtr(p.LimitCeilingPercent) + r.RequestUseRss = p.RequestUseRss + r.LimitUseRss = p.LimitUseRss return r } @@ -673,6 +737,7 @@ func hpaMetricTriggersToProto(ms []HPAMetricTriggerArgs) []*apiv1.HPAMetricTrigg result[i].Weight = m.Weight result[i].ServerAddress = m.ServerAddress result[i].Query = m.Query + result[i].ConnectorId = m.ConnectorId } return result } @@ -683,14 +748,28 @@ func hpaMetricTriggersFromProto(ps []*apiv1.HPAMetricTrigger) []HPAMetricTrigger if p == nil { continue } + // The backend folds serverAddress/query into metadata on write and + // re-derives the dedicated fields on read; strip the folded keys so + // metadata reflects only what the user configured. + var metadata map[string]string + for k, v := range p.Metadata { + if k == "serverAddress" || k == "query" { + continue + } + if metadata == nil { + metadata = map[string]string{} + } + metadata[k] = v + } result = append(result, HPAMetricTriggerArgs{ Type: p.Type, TargetUtilization: p.TargetUtilization, TargetValue: p.TargetValue, Weight: p.Weight, - Metadata: p.Metadata, + Metadata: metadata, ServerAddress: p.ServerAddress, Query: p.Query, + ConnectorId: p.ConnectorId, }) } return result @@ -866,6 +945,8 @@ func containerResourceConfigToProto(r *ResourceRuleConfigArgs) *apiv1.ContainerR v := float32(*r.TargetPercentile) p.TargetPercentile = &v } + p.RequestUseRss = r.RequestUseRss + p.LimitUseRss = r.LimitUseRss return p } @@ -894,5 +975,7 @@ func containerResourceConfigFromProto(p *apiv1.ContainerResourceConfig) *Resourc v := f32(*p.TargetPercentile) r.TargetPercentile = &v } + r.RequestUseRss = p.RequestUseRss + r.LimitUseRss = p.LimitUseRss return r } From 0af74f5c4ec85aaeb2f1e3336242fd999dbfe642 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 00:47:44 +0200 Subject: [PATCH 4/8] test: fake-server CRUD lifecycle harness In-memory connect server (httptest + generated handlers with Unimplemented* embeds) mimicking the dakr semantics that matter to CRUD correctness: upsert keys, NotFound codes, node-policy-target invariants (empty target_id on create, at most one cluster), fields.disabled rejection on workload-rule update, and the virtual source=="cluster" policies mixed into ListNodePolicies. Lifecycle tests drive each resource's real Create/Read/Update/Delete against it and assert: create round-trips (ids, nested blocks, taints, exact float percentiles), refresh after out-of-band deletion drops from state, node policy delete actually deletes and is idempotent, node policy target destroy disables the target, flipping workloadRule.disabled goes through ToggleWorkloadRuleDisabled, and omitting enabled creates an ENABLED target. --- provider/pkg/resources/fake_server_test.go | 521 +++++++++++++++++++++ 1 file changed, 521 insertions(+) create mode 100644 provider/pkg/resources/fake_server_test.go diff --git a/provider/pkg/resources/fake_server_test.go b/provider/pkg/resources/fake_server_test.go new file mode 100644 index 0000000..3a953d7 --- /dev/null +++ b/provider/pkg/resources/fake_server_test.go @@ -0,0 +1,521 @@ +package resources + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "sync" + "testing" + + "connectrpc.com/connect" + "github.com/pulumi/pulumi-go-provider/infer" + + apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" + apiv1connect "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1/apiv1connect" + "github.com/devzero-inc/pulumi-provider-devzero/provider/pkg/clientset" +) + +// --------------------------------------------------------------------------- +// Fake backend: an in-memory connect server mimicking the dakr semantics that +// matter to CRUD correctness (upsert keys, NotFound codes, node-policy-target +// invariants, fields.disabled rejection on rule update, virtual +// source=="cluster" policies mixed into ListNodePolicies). +// --------------------------------------------------------------------------- + +type fakeBackend struct { + apiv1connect.UnimplementedK8SRecommendationServiceHandler + apiv1connect.UnimplementedK8SServiceHandler + apiv1connect.UnimplementedClusterMutationServiceHandler + + mu sync.Mutex + nextID int + nodePol map[string]*apiv1.NodePolicy + nodeTgt map[string]*apiv1.NodePolicyTarget + wp map[string]*apiv1.WorkloadRecommendationPolicy + wpt map[string]*apiv1.WorkloadPolicyTarget + rules map[string]*apiv1.WorkloadRule +} + +func newFakeBackend() *fakeBackend { + return &fakeBackend{ + nodePol: map[string]*apiv1.NodePolicy{}, + nodeTgt: map[string]*apiv1.NodePolicyTarget{}, + wp: map[string]*apiv1.WorkloadRecommendationPolicy{}, + wpt: map[string]*apiv1.WorkloadPolicyTarget{}, + rules: map[string]*apiv1.WorkloadRule{}, + } +} + +func (f *fakeBackend) id(prefix string) string { + f.nextID++ + return fmt.Sprintf("%s-%04d", prefix, f.nextID) +} + +func (f *fakeBackend) CreateNodePolicies(_ context.Context, req *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + out := make([]*apiv1.NodePolicy, 0, len(req.Msg.Policies)) + for _, p := range req.Msg.Policies { + if p.Id == "" { + p.Id = f.id("np") + } + p.TeamId = req.Msg.TeamId + f.nodePol[p.Id] = p + out = append(out, p) + } + return connect.NewResponse(&apiv1.CreateNodePoliciesResponse{Policies: out}), nil +} + +func (f *fakeBackend) ListNodePolicies(_ context.Context, _ *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + resp := &apiv1.ListNodePoliciesResponse{} + for _, p := range f.nodePol { + resp.Policies = append(resp.Policies, p) + } + // dakr mixes read-only virtual policies mirrored from non-dakr Karpenter + // resources into the list; the provider must skip them. + resp.Policies = append(resp.Policies, &apiv1.NodePolicy{ + Id: "np-virtual-cluster", Name: "cluster-managed", Source: "cluster", + }) + return connect.NewResponse(resp), nil +} + +func (f *fakeBackend) UpdateNodePolicy(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyRequest]) (*connect.Response[apiv1.UpdateNodePolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p := req.Msg.Policy + if _, ok := f.nodePol[p.Id]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("node policy not found")) + } + f.nodePol[p.Id] = p + return connect.NewResponse(&apiv1.UpdateNodePolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) DeleteNodePolicy(_ context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.nodePol[req.Msg.PolicyId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("resource not found")) + } + delete(f.nodePol, req.Msg.PolicyId) + var deleted int32 + for id, t := range f.nodeTgt { + if t.PolicyId == req.Msg.PolicyId { + delete(f.nodeTgt, id) + deleted++ + } + } + return connect.NewResponse(&apiv1.DeleteNodePolicyResponse{Success: true, DeletedTargetCount: deleted}), nil +} + +func (f *fakeBackend) CreateNodePolicyTargets(_ context.Context, req *connect.Request[apiv1.CreateNodePolicyTargetsRequest]) (*connect.Response[apiv1.CreateNodePolicyTargetsResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + out := make([]*apiv1.NodePolicyTarget, 0, len(req.Msg.Targets)) + for _, t := range req.Msg.Targets { + if t.TargetId != "" { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("target_id must be empty on create")) + } + if len(t.ClusterIds) > 1 { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("node policy target must target at most one cluster")) + } + t.TargetId = f.id("npt") + f.nodeTgt[t.TargetId] = t + out = append(out, t) + } + return connect.NewResponse(&apiv1.CreateNodePolicyTargetsResponse{Targets: out}), nil +} + +func (f *fakeBackend) ListNodePolicyTargets(_ context.Context, _ *connect.Request[apiv1.ListNodePolicyTargetsRequest]) (*connect.Response[apiv1.ListNodePolicyTargetsResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + resp := &apiv1.ListNodePolicyTargetsResponse{} + for _, t := range f.nodeTgt { + resp.Targets = append(resp.Targets, t) + } + return connect.NewResponse(resp), nil +} + +func (f *fakeBackend) UpdateNodePolicyTarget(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyTargetRequest]) (*connect.Response[apiv1.UpdateNodePolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t := req.Msg.Target + if _, ok := f.nodeTgt[t.TargetId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + f.nodeTgt[t.TargetId] = t + return connect.NewResponse(&apiv1.UpdateNodePolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) CreateWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.CreateWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.CreateWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p := req.Msg.Policy + if p == nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("policy required")) + } + p.PolicyId = f.id("wp") + p.TeamId = req.Msg.TeamId + f.wp[p.PolicyId] = p + return connect.NewResponse(&apiv1.CreateWorkloadRecommendationPolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) GetWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.GetWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.GetWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p, ok := f.wp[req.Msg.PolicyId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload policy not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadRecommendationPolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) DeleteWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.DeleteWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.wp[req.Msg.PolicyId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload policy not found")) + } + delete(f.wp, req.Msg.PolicyId) + return connect.NewResponse(&apiv1.DeleteWorkloadRecommendationPolicyResponse{Success: true}), nil +} + +func (f *fakeBackend) UpsertManualWorkloadRule(_ context.Context, req *connect.Request[apiv1.UpsertManualWorkloadRuleRequest]) (*connect.Response[apiv1.UpsertManualWorkloadRuleResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + key := req.Msg.ClusterId + "/" + req.Msg.Namespace + "/" + req.Msg.Kind + "/" + req.Msg.Name + var existing *apiv1.WorkloadRule + for _, r := range f.rules { + if r.ClusterId+"/"+r.Namespace+"/"+r.Kind+"/"+r.Name == key { + existing = r + break + } + } + if existing != nil && req.Msg.Fields != nil && req.Msg.Fields.Disabled != nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("fields.disabled cannot be set when updating an existing rule; use ToggleWorkloadRuleDisabled instead")) + } + rule := &apiv1.WorkloadRule{ + ClusterId: req.Msg.ClusterId, + Namespace: req.Msg.Namespace, + Kind: req.Msg.Kind, + Name: req.Msg.Name, + Status: "active", + SyncStatus: "pending", + Generation: 1, + } + switch req.Msg.Source { + case apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_PULUMI_AUTO: + rule.CurrentSource = "pulumi_auto" + default: + rule.CurrentSource = "pulumi_manual" + } + if existing != nil { + rule.RuleId = existing.RuleId + rule.Generation = existing.Generation + 1 + rule.Disabled = existing.Disabled + } else { + rule.RuleId = f.id("wr") + } + if fields := req.Msg.Fields; fields != nil { + rule.CpuRule = fields.CpuRule + rule.MemoryRule = fields.MemoryRule + rule.GpuRule = fields.GpuRule + rule.HpaRule = fields.HpaRule + rule.EmergencyResponse = fields.EmergencyResponse + rule.ActionTriggers = fields.ActionTriggers + rule.DetectionTriggers = fields.DetectionTriggers + rule.SchedulerPlugins = fields.SchedulerPlugins + rule.LiveMigrationEnabled = fields.LiveMigrationEnabled + rule.UseInPlaceVerticalScaling = fields.UseInPlaceVerticalScaling + rule.Containers = fields.Containers + rule.LookbackPeriodSeconds = fields.LookbackPeriodSeconds + rule.StartupPeriodSeconds = fields.StartupPeriodSeconds + rule.CronSchedule = fields.CronSchedule + rule.CooldownMinutes = fields.CooldownMinutes + rule.DefragmentationSchedule = fields.DefragmentationSchedule + if fields.Disabled != nil { + rule.Disabled = *fields.Disabled + } + } + f.rules[rule.RuleId] = rule + return connect.NewResponse(&apiv1.UpsertManualWorkloadRuleResponse{Rule: rule}), nil +} + +func (f *fakeBackend) GetWorkloadRuleByID(_ context.Context, req *connect.Request[apiv1.GetWorkloadRuleByIDRequest]) (*connect.Response[apiv1.GetWorkloadRuleByIDResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + r, ok := f.rules[req.Msg.RuleId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadRuleByIDResponse{Rule: r}), nil +} + +func (f *fakeBackend) DeleteWorkloadRule(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadRuleRequest]) (*connect.Response[apiv1.DeleteWorkloadRuleResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.rules[req.Msg.RuleId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + delete(f.rules, req.Msg.RuleId) + return connect.NewResponse(&apiv1.DeleteWorkloadRuleResponse{}), nil +} + +func (f *fakeBackend) ToggleWorkloadRuleDisabled(_ context.Context, req *connect.Request[apiv1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[apiv1.ToggleWorkloadRuleDisabledResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + r, ok := f.rules[req.Msg.RuleId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + r.Disabled = req.Msg.Disabled + return connect.NewResponse(&apiv1.ToggleWorkloadRuleDisabledResponse{Rule: r}), nil +} + +// --------------------------------------------------------------------------- +// Harness plumbing +// --------------------------------------------------------------------------- + +func withFakeServer(t *testing.T) *fakeBackend { + t.Helper() + fake := newFakeBackend() + mux := http.NewServeMux() + mux.Handle(apiv1connect.NewK8SRecommendationServiceHandler(fake)) + mux.Handle(apiv1connect.NewK8SServiceHandler(fake)) + mux.Handle(apiv1connect.NewClusterMutationServiceHandler(fake)) + srv := httptest.NewServer(mux) + t.Cleanup(srv.Close) + + prev := clientset.Get() + clientset.Set(&clientset.ClientSet{ + TeamID: "team-1", + Token: "test-token", + ClusterMutationClient: apiv1connect.NewClusterMutationServiceClient(srv.Client(), srv.URL), + K8SClient: apiv1connect.NewK8SServiceClient(srv.Client(), srv.URL), + RecommendationClient: apiv1connect.NewK8SRecommendationServiceClient(srv.Client(), srv.URL), + ClusterServiceClient: apiv1connect.NewClusterServiceClient(srv.Client(), srv.URL), + }) + t.Cleanup(func() { clientset.Set(prev) }) + return fake +} + +// --------------------------------------------------------------------------- +// Lifecycle tests +// --------------------------------------------------------------------------- + +func TestLifecycle_NodePolicy(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicy{} + + args := NodePolicyArgs{ + Name: "azure-pool", + Azure: &AzureNodeClassSpecArgs{ + VnetSubnetId: "/subscriptions/x/subnet/y", + }, + Taints: []TaintArgs{{Key: "dedicated", Value: "gpu", Effect: "NoSchedule"}}, + } + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected an ID") + } + if created.Output.Azure == nil || created.Output.Azure.VnetSubnetId != "/subscriptions/x/subnet/y" { + t.Fatalf("azure block not round-tripped: %+v", created.Output.Azure) + } + if len(created.Output.Taints) != 1 || created.Output.Taints[0].Key != "dedicated" { + t.Fatalf("taints not round-tripped: %+v", created.Output.Taints) + } + + // Read refreshes and must skip the virtual source=="cluster" policy. + read, err := n.Read(ctx, infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ + ID: created.ID, Inputs: args, State: created.Output, + }) + if err != nil { + t.Fatalf("Read: %v", err) + } + if read.ID != created.ID { + t.Fatalf("Read ID: got %q", read.ID) + } + + // Out-of-band deletion drops from state. + fake.mu.Lock() + delete(fake.nodePol, created.ID) + fake.mu.Unlock() + gone, err := n.Read(ctx, infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ID: created.ID, Inputs: args, State: created.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } + + // Recreate; Delete must hit the API and be idempotent. + created, err = n.Create(ctx, infer.CreateRequest[NodePolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("re-Create: %v", err) + } + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + fake.mu.Lock() + _, still := fake.nodePol[created.ID] + fake.mu.Unlock() + if still { + t.Fatal("Delete did not remove the policy from the backend") + } + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} + +func TestLifecycle_NodePolicyTarget(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicyTarget{} + + args := NodePolicyTargetArgs{ + Name: "target-1", + PolicyId: "np-0001", + ClusterIds: []string{"cluster-1"}, + } + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyTargetArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected target id") + } + + // Destroy disables (no delete RPC exists). + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyTargetState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + fake.mu.Lock() + tgt := fake.nodeTgt[created.ID] + fake.mu.Unlock() + if tgt == nil { + t.Fatal("target should still exist backend-side") + } + if tgt.Enabled { + t.Fatal("Delete must disable the target") + } +} + +func TestLifecycle_WorkloadPolicy(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadPolicy{} + + tp := 0.75 + args := WorkloadPolicyArgs{ + Name: "policy-1", + CpuVerticalScaling: &VerticalScalingArgs{ + Enabled: true, + TargetPercentile: &tp, + }, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadPolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.Output.CpuVerticalScaling == nil || created.Output.CpuVerticalScaling.TargetPercentile == nil || + *created.Output.CpuVerticalScaling.TargetPercentile != 0.75 { + t.Fatalf("targetPercentile did not round-trip exactly: %+v", created.Output.CpuVerticalScaling) + } + + // Out-of-band delete → drop from state. + fake.mu.Lock() + delete(fake.wp, created.ID) + fake.mu.Unlock() + gone, err := w.Read(ctx, infer.ReadRequest[WorkloadPolicyArgs, WorkloadPolicyState]{ID: created.ID, Inputs: args, State: created.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } +} + +func TestLifecycle_WorkloadRule(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadRule{} + + minReq := 10 + args := WorkloadRuleArgs{ + ClusterID: "cluster-1", + Namespace: "prod", + Kind: "Deployment", + Name: "api", + CpuRule: &ResourceRuleConfigArgs{Enabled: true, MinRequest: &minReq}, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadRuleArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected rule id") + } + + // Update flipping `disabled` must go through the toggle RPC (the fake + // rejects fields.disabled on update, mirroring dakr). + disabled := true + updatedArgs := args + updatedArgs.Disabled = &disabled + updated, err := w.Update(ctx, infer.UpdateRequest[WorkloadRuleArgs, WorkloadRuleState]{ + ID: created.ID, Inputs: updatedArgs, State: created.Output, + }) + if err != nil { + t.Fatalf("Update: %v", err) + } + if updated.Output.Disabled == nil || !*updated.Output.Disabled { + t.Fatalf("expected disabled=true in output, got %+v", updated.Output.Disabled) + } + fake.mu.Lock() + rule := fake.rules[created.ID] + fake.mu.Unlock() + if rule == nil || !rule.Disabled { + t.Fatalf("expected rule disabled via toggle RPC, got %+v", rule) + } + + // Delete + idempotent delete. + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadRuleState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadRuleState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} + +// Round-trip guard for the enabled default: omitting `enabled` must create an +// ENABLED target (the API stores the proto bool verbatim). +func TestLifecycle_NodePolicyTarget_EnabledDefaultsTrue(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicyTarget{} + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyTargetArgs]{Inputs: NodePolicyTargetArgs{ + Name: "defaults", + PolicyId: "np-0001", + ClusterIds: []string{"c-1"}, + // Enabled omitted. + }}) + if err != nil { + t.Fatalf("Create: %v", err) + } + fake.mu.Lock() + tgt := fake.nodeTgt[created.ID] + fake.mu.Unlock() + if tgt == nil || !tgt.Enabled { + t.Fatalf("expected the target to be created enabled, got %+v", tgt) + } +} From 127af2e15b5ae16e382aeb7592434efc3ad143c9 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 00:50:25 +0200 Subject: [PATCH 5/8] chore(schema/sdk): regenerate schema.json and SDKs; valid dev version fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Makefile VERSION falls back to 0.0.0-dev instead of dev — 'pulumi package get-schema' rejects non-semver versions, which broke gen-schema/gen-sdk in any clone without tags (including the gen-sdk workflow's fetch-depth:1 checkout). - schema.json + nodejs/python/go SDKs regenerated: picks up the new workloadPolicy/workloadRule/nodePolicy/target fields, the enabled defaults, and drops the removed hpaRule.targetUtilization/targetMemoryUtilization/ primaryMetric fields. --- Makefile | 2 +- schema.json | 288 ++++++++++- sdk/go/devzero/resources/nodePolicy.go | 135 +++-- sdk/go/devzero/resources/nodePolicyTarget.go | 4 +- sdk/go/devzero/resources/pulumiTypes.go | 483 +++++++++++++++--- sdk/go/devzero/resources/workloadPolicy.go | 188 ++++++- .../devzero/resources/workloadPolicyTarget.go | 91 ++-- sdk/go/devzero/resources/workloadRule.go | 20 +- sdk/nodejs/resources/nodePolicy.ts | 20 + sdk/nodejs/resources/nodePolicyTarget.ts | 2 +- sdk/nodejs/resources/workloadPolicy.ts | 80 +++ sdk/nodejs/resources/workloadPolicyTarget.ts | 27 +- sdk/nodejs/resources/workloadRule.ts | 8 + sdk/nodejs/types/input.ts | 36 +- sdk/nodejs/types/output.ts | 36 +- .../pulumi_devzero/resources/_inputs.py | 324 +++++++++--- .../pulumi_devzero/resources/node_policy.py | 105 ++++ .../resources/node_policy_target.py | 2 +- .../pulumi_devzero/resources/outputs.py | 265 ++++++++-- .../resources/workload_policy.py | 420 +++++++++++++++ .../resources/workload_policy_target.py | 77 ++- .../pulumi_devzero/resources/workload_rule.py | 42 ++ 22 files changed, 2313 insertions(+), 342 deletions(-) diff --git a/Makefile b/Makefile index 4437830..cc887f5 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ SDK_GO := sdk/go # VERSION is injected into the provider binary via ldflags. Falls back to # the latest git tag (stripped of a leading `v`), or "dev" when no tags exist. GIT_TAG := $(shell git describe --tags --abbrev=0 --match "v[0-9]*" 2>/dev/null) -VERSION ?= $(if $(GIT_TAG),$(patsubst v%,%,$(GIT_TAG)),dev) +VERSION ?= $(if $(GIT_TAG),$(patsubst v%,%,$(GIT_TAG)),0.0.0-dev) LDFLAGS := -ldflags "-X main.version=$(VERSION)" # Proto sync settings — override with: make proto SERVICES_DIR=/path/to/services diff --git a/schema.json b/schema.json index f680541..38a25fe 100644 --- a/schema.json +++ b/schema.json @@ -277,6 +277,9 @@ "type": "string", "description": "Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'." }, + "imageVersion": { + "type": "string" + }, "kubelet": { "$ref": "#/types/devzero:resources:AzureKubeletConfigurationArgs", "description": "Kubelet configuration overrides for Azure nodes." @@ -533,6 +536,9 @@ }, "devzero:resources:HPAMetricTriggerArgs": { "properties": { + "connectorId": { + "type": "string" + }, "metadata": { "type": "object", "additionalProperties": { @@ -601,27 +607,15 @@ "items": { "$ref": "#/types/devzero:resources:HPAMetricTriggerArgs" }, - "description": "Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric \u2014 do not redeclare them here." + "description": "HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields." }, "minReplicas": { "type": "integer", "description": "Minimum number of replicas. Example: 2." }, - "primaryMetric": { - "type": "string", - "description": "Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'." - }, "scaleDownCooldownSeconds": { "type": "integer", "description": "Seconds to wait between scale-down events. Example: 300." - }, - "targetMemoryUtilization": { - "type": "number", - "description": "Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8." - }, - "targetUtilization": { - "type": "number", - "description": "Target CPU utilization ratio (0-1). Example: 0.7." } }, "type": "object" @@ -670,6 +664,9 @@ }, "devzero:resources:HorizontalScalingArgs": { "properties": { + "compositeFormula": { + "type": "string" + }, "enabled": { "type": "boolean", "description": "Enable horizontal (replica) scaling. Example: true." @@ -690,6 +687,9 @@ "type": "integer", "description": "Minimum number of replicas to maintain. Example: 2." }, + "networkTargetThroughputBytesPerSec": { + "type": "integer" + }, "primaryMetric": { "type": "string", "description": "Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'.", @@ -701,6 +701,12 @@ "network_egress" ] }, + "scaleDownCooldownSeconds": { + "type": "integer" + }, + "targetMemoryUtilization": { + "type": "number" + }, "targetUtilization": { "type": "number", "description": "Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization." @@ -886,14 +892,35 @@ }, "devzero:resources:ResourceRuleConfigArgs": { "properties": { + "ceilingPercent": { + "type": "integer" + }, "enabled": { "type": "boolean", "description": "Enable this resource axis rule. Example: true." }, + "floorPercent": { + "type": "integer" + }, + "initialLimit": { + "type": "integer" + }, + "initialRequest": { + "type": "integer" + }, + "limitCeilingPercent": { + "type": "integer" + }, + "limitFloorPercent": { + "type": "integer" + }, "limitMultiplier": { "type": "number", "description": "Multiplier applied to the request to derive the resource limit. Example: 1.5." }, + "limitUseRss": { + "type": "boolean" + }, "limitsAdjustmentEnabled": { "type": "boolean", "description": "Whether to also adjust resource limits alongside requests. Example: true." @@ -918,6 +945,9 @@ "type": "integer", "description": "Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100." }, + "requestUseRss": { + "type": "boolean" + }, "targetPercentile": { "type": "number", "description": "Percentile of usage data used as the recommendation target (0-1). Example: 0.95." @@ -1001,6 +1031,9 @@ "type": "number", "description": "Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request." }, + "limitUseRss": { + "type": "boolean" + }, "limitsAdjustmentEnabled": { "type": "boolean", "description": "Whether to also adjust resource limits alongside requests. Example: true." @@ -1036,12 +1069,29 @@ "type": "number", "description": "Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead." }, + "requestUseRss": { + "type": "boolean" + }, "targetPercentile": { "type": "number", "description": "Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile." } }, "type": "object" + }, + "devzero:resources:ZonalShiftConfigArgs": { + "properties": { + "allowZoneFallback": { + "type": "boolean" + }, + "evictImpactedNodes": { + "type": "boolean" + }, + "respectZonalShift": { + "type": "boolean" + } + }, + "type": "object" } }, "resources": { @@ -1088,6 +1138,9 @@ "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: [\"spot\", \"on-demand\"]}." }, + "cloudProviderId": { + "type": "integer" + }, "description": { "type": "string", "description": "Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'." @@ -1116,6 +1169,9 @@ "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Filter instances by hypervisor type. Example: {in: [\"nitro\"]}." }, + "instanceLocalNvme": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "instanceSizes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Filter instances by size label. Example: {in: [\"large\", \"xlarge\", \"2xlarge\"]}." @@ -1135,6 +1191,9 @@ "$ref": "#/types/devzero:resources:ResourceLimitsArgs", "description": "Resource limits on total capacity managed by this policy. Example: {cpu: \"1000\", memory: \"1000Gi\"}." }, + "masterOverrideRoleName": { + "type": "string" + }, "name": { "type": "string", "description": "Human-friendly name for the node policy. Example: 'prod-spot-policy'." @@ -1158,6 +1217,12 @@ }, "description": "Raw Karpenter YAML for full NodePool/NodeClass customization \u2014 use only when structured fields are insufficient." }, + "startupTaints": { + "type": "array", + "items": { + "$ref": "#/types/devzero:resources:TaintArgs" + } + }, "taints": { "type": "array", "items": { @@ -1169,6 +1234,9 @@ "type": "integer", "description": "Priority weight; higher values take precedence when multiple policies match. Example: 100." }, + "zonalShift": { + "$ref": "#/types/devzero:resources:ZonalShiftConfigArgs" + }, "zones": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Availability zones where nodes may be provisioned. Example: {in: [\"us-east-1a\", \"us-east-1b\"]}." @@ -1190,6 +1258,9 @@ "capacityTypes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, + "cloudProviderId": { + "type": "integer" + }, "description": { "type": "string" }, @@ -1211,6 +1282,9 @@ "instanceHypervisors": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, + "instanceLocalNvme": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "instanceSizes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, @@ -1226,6 +1300,9 @@ "limits": { "$ref": "#/types/devzero:resources:ResourceLimitsArgs" }, + "masterOverrideRoleName": { + "type": "string" + }, "name": { "type": "string" }, @@ -1244,6 +1321,12 @@ "$ref": "#/types/devzero:resources:RawKarpenterSpecArgs" } }, + "startupTaints": { + "type": "array", + "items": { + "$ref": "#/types/devzero:resources:TaintArgs" + } + }, "taints": { "type": "array", "items": { @@ -1253,6 +1336,9 @@ "weight": { "type": "integer" }, + "zonalShift": { + "$ref": "#/types/devzero:resources:ZonalShiftConfigArgs" + }, "zones": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" } @@ -1268,7 +1354,7 @@ "items": { "type": "string" }, - "description": "Cluster IDs where this node policy applies." + "description": "Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster." }, "description": { "type": "string", @@ -1276,7 +1362,8 @@ }, "enabled": { "type": "boolean", - "description": "Whether this target is active. Defaults to true." + "description": "Whether this target is active. Defaults to true.", + "default": true }, "name": { "type": "string", @@ -1327,11 +1414,26 @@ }, "description": "When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: [\"on_detection\"]." }, + "allowInPlaceMemoryLimitDecrease": { + "type": "boolean" + }, "cooldownMinutes": { "type": "integer", "description": "Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default).", "default": 300 }, + "cpuCeilingPercent": { + "type": "integer" + }, + "cpuFloorPercent": { + "type": "integer" + }, + "cpuLimitCeilingPercent": { + "type": "integer" + }, + "cpuLimitFloorPercent": { + "type": "integer" + }, "cpuVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1358,6 +1460,9 @@ "type": "number", "description": "Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0." }, + "enableInPlaceVerticalScaling": { + "type": "boolean" + }, "enablePmaxProtection": { "type": "boolean", "description": "Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false." @@ -1377,6 +1482,33 @@ "type": "number", "description": "Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band)." }, + "jvmCpuStartupFloorMillicores": { + "type": "integer" + }, + "jvmHeapHeadroomMultiplier": { + "type": "number" + }, + "jvmHeapOptimizationEnabled": { + "type": "boolean" + }, + "jvmHeapTargetPercentile": { + "type": "number" + }, + "jvmMaxHeapBytes": { + "type": "integer" + }, + "jvmMinHeapBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadPercent": { + "type": "number" + }, + "jvmPreferContainerSupport": { + "type": "boolean" + }, "liveMigrationEnabled": { "type": "boolean", "description": "Allow live pod migration when applying recommendations without restart. Example: false." @@ -1386,6 +1518,18 @@ "description": "Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default).", "default": 86400 }, + "memoryCeilingPercent": { + "type": "integer" + }, + "memoryFloorPercent": { + "type": "integer" + }, + "memoryLimitCeilingPercent": { + "type": "integer" + }, + "memoryLimitFloorPercent": { + "type": "integer" + }, "memoryVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1408,6 +1552,9 @@ "type": "string", "description": "Human-friendly name for the policy. Example: 'production-vpa-policy'." }, + "pdbEnabled": { + "type": "boolean" + }, "pmaxRatioThreshold": { "type": "number", "description": "Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) \u2014 triggers when peak is 3\u00d7 the recommendation.", @@ -1444,11 +1591,26 @@ }, "description": "When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: [\"on_detection\"]." }, + "allowInPlaceMemoryLimitDecrease": { + "type": "boolean" + }, "cooldownMinutes": { "type": "integer", "description": "Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default).", "default": 300 }, + "cpuCeilingPercent": { + "type": "integer" + }, + "cpuFloorPercent": { + "type": "integer" + }, + "cpuLimitCeilingPercent": { + "type": "integer" + }, + "cpuLimitFloorPercent": { + "type": "integer" + }, "cpuVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1480,6 +1642,9 @@ "type": "number", "description": "Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0." }, + "enableInPlaceVerticalScaling": { + "type": "boolean" + }, "enablePmaxProtection": { "type": "boolean", "description": "Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false." @@ -1499,6 +1664,33 @@ "type": "number", "description": "Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band)." }, + "jvmCpuStartupFloorMillicores": { + "type": "integer" + }, + "jvmHeapHeadroomMultiplier": { + "type": "number" + }, + "jvmHeapOptimizationEnabled": { + "type": "boolean" + }, + "jvmHeapTargetPercentile": { + "type": "number" + }, + "jvmMaxHeapBytes": { + "type": "integer" + }, + "jvmMinHeapBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadPercent": { + "type": "number" + }, + "jvmPreferContainerSupport": { + "type": "boolean" + }, "liveMigrationEnabled": { "type": "boolean", "description": "Allow live pod migration when applying recommendations without restart. Example: false." @@ -1508,6 +1700,18 @@ "description": "Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default).", "default": 86400 }, + "memoryCeilingPercent": { + "type": "integer" + }, + "memoryFloorPercent": { + "type": "integer" + }, + "memoryLimitCeilingPercent": { + "type": "integer" + }, + "memoryLimitFloorPercent": { + "type": "integer" + }, "memoryVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1530,6 +1734,9 @@ "type": "string", "description": "Human-friendly name for the policy. Example: 'production-vpa-policy'." }, + "pdbEnabled": { + "type": "boolean" + }, "pmaxRatioThreshold": { "type": "number", "description": "Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) \u2014 triggers when peak is 3\u00d7 the recommendation.", @@ -1557,6 +1764,10 @@ }, "devzero:resources:WorkloadPolicyTarget": { "properties": { + "annotationSelector": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs", + "description": "Select workloads by annotations (same semantics as label selectors, evaluated against annotations)." + }, "clusterIds": { "type": "array", "items": { @@ -1570,7 +1781,8 @@ }, "enabled": { "type": "boolean", - "description": "Enable or disable this target." + "description": "Enable or disable this target. Defaults to true.", + "default": true }, "kindFilter": { "type": "array", @@ -1579,6 +1791,13 @@ }, "description": "Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod)." }, + "kindFilterNotIn": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Kubernetes kinds to exclude from matching. Same allowed values as kindFilter." + }, "name": { "type": "string", "description": "Human-friendly name for this target." @@ -1600,7 +1819,8 @@ "items": { "type": "string" }, - "description": "Restrict matching to specific node groups by name." + "description": "DEPRECATED: unused by the DevZero API \u2014 no longer evaluated by any active target.", + "deprecationMessage": "node_group_names is deprecated by the DevZero API and no longer evaluated." }, "policyId": { "type": "string", @@ -1617,6 +1837,13 @@ }, "description": "Explicit list of workload names to include." }, + "workloadNamesNotIn": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Explicit list of workload names to exclude." + }, "workloadSelector": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Select workloads by labels." @@ -1628,6 +1855,9 @@ "clusterIds" ], "inputProperties": { + "annotationSelector": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "clusterIds": { "type": "array", "items": { @@ -1657,6 +1887,12 @@ ] } }, + "kindFilterNotIn": { + "type": "array", + "items": { + "type": "string" + } + }, "name": { "type": "string" }, @@ -1687,6 +1923,12 @@ "type": "string" } }, + "workloadNamesNotIn": { + "type": "array", + "items": { + "type": "string" + } + }, "workloadSelector": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" } @@ -1744,6 +1986,9 @@ }, "description": "Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: [\"pod_creation\"]." }, + "disabled": { + "type": "boolean" + }, "emergencyResponse": { "$ref": "#/types/devzero:resources:EmergencyResponseConfigArgs", "description": "Emergency response configuration for OOM and CPU throttle events." @@ -1764,6 +2009,9 @@ "type": "boolean", "description": "Allow live pod migration when applying recommendations. Example: false." }, + "lookbackPeriodSeconds": { + "type": "integer" + }, "memoryRule": { "$ref": "#/types/devzero:resources:ResourceRuleConfigArgs", "description": "Memory vertical scaling rule configuration." @@ -1844,6 +2092,9 @@ }, "description": "Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: [\"pod_creation\"]." }, + "disabled": { + "type": "boolean" + }, "emergencyResponse": { "$ref": "#/types/devzero:resources:EmergencyResponseConfigArgs", "description": "Emergency response configuration for OOM and CPU throttle events." @@ -1864,6 +2115,9 @@ "type": "boolean", "description": "Allow live pod migration when applying recommendations. Example: false." }, + "lookbackPeriodSeconds": { + "type": "integer" + }, "memoryRule": { "$ref": "#/types/devzero:resources:ResourceRuleConfigArgs", "description": "Memory vertical scaling rule configuration." diff --git a/sdk/go/devzero/resources/nodePolicy.go b/sdk/go/devzero/resources/nodePolicy.go index acc36ea..cb02731 100644 --- a/sdk/go/devzero/resources/nodePolicy.go +++ b/sdk/go/devzero/resources/nodePolicy.go @@ -22,7 +22,8 @@ type NodePolicy struct { // Azure-specific AKSNodeClass configuration (VNet subnet, OS disk, image family, etc.). Azure AzureNodeClassSpecArgsPtrOutput `pulumi:"azure"` // Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: ["spot", "on-demand"]}. - CapacityTypes LabelSelectorArgsPtrOutput `pulumi:"capacityTypes"` + CapacityTypes LabelSelectorArgsPtrOutput `pulumi:"capacityTypes"` + CloudProviderId pulumi.IntPtrOutput `pulumi:"cloudProviderId"` // Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. Description pulumi.StringPtrOutput `pulumi:"description"` // Karpenter disruption policy controlling consolidation, expiry, and budgets. @@ -37,6 +38,7 @@ type NodePolicy struct { InstanceGenerations LabelSelectorArgsPtrOutput `pulumi:"instanceGenerations"` // Filter instances by hypervisor type. Example: {in: ["nitro"]}. InstanceHypervisors LabelSelectorArgsPtrOutput `pulumi:"instanceHypervisors"` + InstanceLocalNvme LabelSelectorArgsPtrOutput `pulumi:"instanceLocalNvme"` // Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. InstanceSizes LabelSelectorArgsPtrOutput `pulumi:"instanceSizes"` // Explicitly allow specific instance types. Example: {in: ["m5.large", "c6i.large"]}. @@ -44,7 +46,8 @@ type NodePolicy struct { // Labels applied to all provisioned nodes. Example: {"team": "backend", "env": "prod"}. Labels pulumi.StringMapOutput `pulumi:"labels"` // Resource limits on total capacity managed by this policy. Example: {cpu: "1000", memory: "1000Gi"}. - Limits ResourceLimitsArgsPtrOutput `pulumi:"limits"` + Limits ResourceLimitsArgsPtrOutput `pulumi:"limits"` + MasterOverrideRoleName pulumi.StringPtrOutput `pulumi:"masterOverrideRoleName"` // Human-friendly name for the node policy. Example: 'prod-spot-policy'. Name pulumi.StringOutput `pulumi:"name"` // Override name for the generated Karpenter NodeClass resource. Example: 'prod-aws-nodeclass'. @@ -54,11 +57,13 @@ type NodePolicy struct { // Operating systems for nodes. Example: {in: ["linux"]}. OperatingSystems LabelSelectorArgsPtrOutput `pulumi:"operatingSystems"` // Raw Karpenter YAML for full NodePool/NodeClass customization — use only when structured fields are insufficient. - Raw RawKarpenterSpecArgsArrayOutput `pulumi:"raw"` + Raw RawKarpenterSpecArgsArrayOutput `pulumi:"raw"` + StartupTaints TaintArgsArrayOutput `pulumi:"startupTaints"` // Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. Taints TaintArgsArrayOutput `pulumi:"taints"` // Priority weight; higher values take precedence when multiple policies match. Example: 100. - Weight pulumi.IntPtrOutput `pulumi:"weight"` + Weight pulumi.IntPtrOutput `pulumi:"weight"` + ZonalShift ZonalShiftConfigArgsPtrOutput `pulumi:"zonalShift"` // Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. Zones LabelSelectorArgsPtrOutput `pulumi:"zones"` } @@ -106,56 +111,66 @@ func (NodePolicyState) ElementType() reflect.Type { } type nodePolicyArgs struct { - Architectures *LabelSelectorArgs `pulumi:"architectures"` - Aws *AWSNodeClassSpecArgs `pulumi:"aws"` - Azure *AzureNodeClassSpecArgs `pulumi:"azure"` - CapacityTypes *LabelSelectorArgs `pulumi:"capacityTypes"` - Description *string `pulumi:"description"` - Disruption *DisruptionPolicyArgs `pulumi:"disruption"` - InstanceCategories *LabelSelectorArgs `pulumi:"instanceCategories"` - InstanceCpus *LabelSelectorArgs `pulumi:"instanceCpus"` - InstanceFamilies *LabelSelectorArgs `pulumi:"instanceFamilies"` - InstanceGenerations *LabelSelectorArgs `pulumi:"instanceGenerations"` - InstanceHypervisors *LabelSelectorArgs `pulumi:"instanceHypervisors"` - InstanceSizes *LabelSelectorArgs `pulumi:"instanceSizes"` - InstanceTypes *LabelSelectorArgs `pulumi:"instanceTypes"` - Labels map[string]string `pulumi:"labels"` - Limits *ResourceLimitsArgs `pulumi:"limits"` - Name string `pulumi:"name"` - NodeClassName *string `pulumi:"nodeClassName"` - NodePoolName *string `pulumi:"nodePoolName"` - OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems"` - Raw []RawKarpenterSpecArgs `pulumi:"raw"` - Taints []TaintArgs `pulumi:"taints"` - Weight *int `pulumi:"weight"` - Zones *LabelSelectorArgs `pulumi:"zones"` + Architectures *LabelSelectorArgs `pulumi:"architectures"` + Aws *AWSNodeClassSpecArgs `pulumi:"aws"` + Azure *AzureNodeClassSpecArgs `pulumi:"azure"` + CapacityTypes *LabelSelectorArgs `pulumi:"capacityTypes"` + CloudProviderId *int `pulumi:"cloudProviderId"` + Description *string `pulumi:"description"` + Disruption *DisruptionPolicyArgs `pulumi:"disruption"` + InstanceCategories *LabelSelectorArgs `pulumi:"instanceCategories"` + InstanceCpus *LabelSelectorArgs `pulumi:"instanceCpus"` + InstanceFamilies *LabelSelectorArgs `pulumi:"instanceFamilies"` + InstanceGenerations *LabelSelectorArgs `pulumi:"instanceGenerations"` + InstanceHypervisors *LabelSelectorArgs `pulumi:"instanceHypervisors"` + InstanceLocalNvme *LabelSelectorArgs `pulumi:"instanceLocalNvme"` + InstanceSizes *LabelSelectorArgs `pulumi:"instanceSizes"` + InstanceTypes *LabelSelectorArgs `pulumi:"instanceTypes"` + Labels map[string]string `pulumi:"labels"` + Limits *ResourceLimitsArgs `pulumi:"limits"` + MasterOverrideRoleName *string `pulumi:"masterOverrideRoleName"` + Name string `pulumi:"name"` + NodeClassName *string `pulumi:"nodeClassName"` + NodePoolName *string `pulumi:"nodePoolName"` + OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems"` + Raw []RawKarpenterSpecArgs `pulumi:"raw"` + StartupTaints []TaintArgs `pulumi:"startupTaints"` + Taints []TaintArgs `pulumi:"taints"` + Weight *int `pulumi:"weight"` + ZonalShift *ZonalShiftConfigArgs `pulumi:"zonalShift"` + Zones *LabelSelectorArgs `pulumi:"zones"` } // The set of arguments for constructing a NodePolicy resource. type NodePolicyArgs struct { - Architectures LabelSelectorArgsPtrInput - Aws AWSNodeClassSpecArgsPtrInput - Azure AzureNodeClassSpecArgsPtrInput - CapacityTypes LabelSelectorArgsPtrInput - Description pulumi.StringPtrInput - Disruption DisruptionPolicyArgsPtrInput - InstanceCategories LabelSelectorArgsPtrInput - InstanceCpus LabelSelectorArgsPtrInput - InstanceFamilies LabelSelectorArgsPtrInput - InstanceGenerations LabelSelectorArgsPtrInput - InstanceHypervisors LabelSelectorArgsPtrInput - InstanceSizes LabelSelectorArgsPtrInput - InstanceTypes LabelSelectorArgsPtrInput - Labels pulumi.StringMapInput - Limits ResourceLimitsArgsPtrInput - Name pulumi.StringInput - NodeClassName pulumi.StringPtrInput - NodePoolName pulumi.StringPtrInput - OperatingSystems LabelSelectorArgsPtrInput - Raw RawKarpenterSpecArgsArrayInput - Taints TaintArgsArrayInput - Weight pulumi.IntPtrInput - Zones LabelSelectorArgsPtrInput + Architectures LabelSelectorArgsPtrInput + Aws AWSNodeClassSpecArgsPtrInput + Azure AzureNodeClassSpecArgsPtrInput + CapacityTypes LabelSelectorArgsPtrInput + CloudProviderId pulumi.IntPtrInput + Description pulumi.StringPtrInput + Disruption DisruptionPolicyArgsPtrInput + InstanceCategories LabelSelectorArgsPtrInput + InstanceCpus LabelSelectorArgsPtrInput + InstanceFamilies LabelSelectorArgsPtrInput + InstanceGenerations LabelSelectorArgsPtrInput + InstanceHypervisors LabelSelectorArgsPtrInput + InstanceLocalNvme LabelSelectorArgsPtrInput + InstanceSizes LabelSelectorArgsPtrInput + InstanceTypes LabelSelectorArgsPtrInput + Labels pulumi.StringMapInput + Limits ResourceLimitsArgsPtrInput + MasterOverrideRoleName pulumi.StringPtrInput + Name pulumi.StringInput + NodeClassName pulumi.StringPtrInput + NodePoolName pulumi.StringPtrInput + OperatingSystems LabelSelectorArgsPtrInput + Raw RawKarpenterSpecArgsArrayInput + StartupTaints TaintArgsArrayInput + Taints TaintArgsArrayInput + Weight pulumi.IntPtrInput + ZonalShift ZonalShiftConfigArgsPtrInput + Zones LabelSelectorArgsPtrInput } func (NodePolicyArgs) ElementType() reflect.Type { @@ -265,6 +280,10 @@ func (o NodePolicyOutput) CapacityTypes() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.CapacityTypes }).(LabelSelectorArgsPtrOutput) } +func (o NodePolicyOutput) CloudProviderId() pulumi.IntPtrOutput { + return o.ApplyT(func(v *NodePolicy) pulumi.IntPtrOutput { return v.CloudProviderId }).(pulumi.IntPtrOutput) +} + // Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. func (o NodePolicyOutput) Description() pulumi.StringPtrOutput { return o.ApplyT(func(v *NodePolicy) pulumi.StringPtrOutput { return v.Description }).(pulumi.StringPtrOutput) @@ -300,6 +319,10 @@ func (o NodePolicyOutput) InstanceHypervisors() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceHypervisors }).(LabelSelectorArgsPtrOutput) } +func (o NodePolicyOutput) InstanceLocalNvme() LabelSelectorArgsPtrOutput { + return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceLocalNvme }).(LabelSelectorArgsPtrOutput) +} + // Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. func (o NodePolicyOutput) InstanceSizes() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceSizes }).(LabelSelectorArgsPtrOutput) @@ -320,6 +343,10 @@ func (o NodePolicyOutput) Limits() ResourceLimitsArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) ResourceLimitsArgsPtrOutput { return v.Limits }).(ResourceLimitsArgsPtrOutput) } +func (o NodePolicyOutput) MasterOverrideRoleName() pulumi.StringPtrOutput { + return o.ApplyT(func(v *NodePolicy) pulumi.StringPtrOutput { return v.MasterOverrideRoleName }).(pulumi.StringPtrOutput) +} + // Human-friendly name for the node policy. Example: 'prod-spot-policy'. func (o NodePolicyOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *NodePolicy) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) @@ -345,6 +372,10 @@ func (o NodePolicyOutput) Raw() RawKarpenterSpecArgsArrayOutput { return o.ApplyT(func(v *NodePolicy) RawKarpenterSpecArgsArrayOutput { return v.Raw }).(RawKarpenterSpecArgsArrayOutput) } +func (o NodePolicyOutput) StartupTaints() TaintArgsArrayOutput { + return o.ApplyT(func(v *NodePolicy) TaintArgsArrayOutput { return v.StartupTaints }).(TaintArgsArrayOutput) +} + // Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. func (o NodePolicyOutput) Taints() TaintArgsArrayOutput { return o.ApplyT(func(v *NodePolicy) TaintArgsArrayOutput { return v.Taints }).(TaintArgsArrayOutput) @@ -355,6 +386,10 @@ func (o NodePolicyOutput) Weight() pulumi.IntPtrOutput { return o.ApplyT(func(v *NodePolicy) pulumi.IntPtrOutput { return v.Weight }).(pulumi.IntPtrOutput) } +func (o NodePolicyOutput) ZonalShift() ZonalShiftConfigArgsPtrOutput { + return o.ApplyT(func(v *NodePolicy) ZonalShiftConfigArgsPtrOutput { return v.ZonalShift }).(ZonalShiftConfigArgsPtrOutput) +} + // Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. func (o NodePolicyOutput) Zones() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.Zones }).(LabelSelectorArgsPtrOutput) diff --git a/sdk/go/devzero/resources/nodePolicyTarget.go b/sdk/go/devzero/resources/nodePolicyTarget.go index 14acc17..8f3fd7a 100644 --- a/sdk/go/devzero/resources/nodePolicyTarget.go +++ b/sdk/go/devzero/resources/nodePolicyTarget.go @@ -15,7 +15,7 @@ import ( type NodePolicyTarget struct { pulumi.CustomResourceState - // Cluster IDs where this node policy applies. + // Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. ClusterIds pulumi.StringArrayOutput `pulumi:"clusterIds"` // Free-form description of the target. Description pulumi.StringPtrOutput `pulumi:"description"` @@ -179,7 +179,7 @@ func (o NodePolicyTargetOutput) ToNodePolicyTargetOutputWithContext(ctx context. return o } -// Cluster IDs where this node policy applies. +// Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. func (o NodePolicyTargetOutput) ClusterIds() pulumi.StringArrayOutput { return o.ApplyT(func(v *NodePolicyTarget) pulumi.StringArrayOutput { return v.ClusterIds }).(pulumi.StringArrayOutput) } diff --git a/sdk/go/devzero/resources/pulumiTypes.go b/sdk/go/devzero/resources/pulumiTypes.go index e8810ec..1e62fc5 100644 --- a/sdk/go/devzero/resources/pulumiTypes.go +++ b/sdk/go/devzero/resources/pulumiTypes.go @@ -891,7 +891,8 @@ type AzureNodeClassSpecArgs struct { // FIPS 140-2 compliance mode for the node. One of: 'Enabled', 'Disabled'. Example: 'Disabled'. FipsMode *string `pulumi:"fipsMode"` // Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. - ImageFamily *string `pulumi:"imageFamily"` + ImageFamily *string `pulumi:"imageFamily"` + ImageVersion *string `pulumi:"imageVersion"` // Kubelet configuration overrides for Azure nodes. Kubelet *AzureKubeletConfigurationArgs `pulumi:"kubelet"` // Maximum pods per node, overrides the AKS cluster default. Example: 110. @@ -919,7 +920,8 @@ type AzureNodeClassSpecArgsArgs struct { // FIPS 140-2 compliance mode for the node. One of: 'Enabled', 'Disabled'. Example: 'Disabled'. FipsMode pulumi.StringPtrInput `pulumi:"fipsMode"` // Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. - ImageFamily pulumi.StringPtrInput `pulumi:"imageFamily"` + ImageFamily pulumi.StringPtrInput `pulumi:"imageFamily"` + ImageVersion pulumi.StringPtrInput `pulumi:"imageVersion"` // Kubelet configuration overrides for Azure nodes. Kubelet AzureKubeletConfigurationArgsPtrInput `pulumi:"kubelet"` // Maximum pods per node, overrides the AKS cluster default. Example: 110. @@ -1019,6 +1021,10 @@ func (o AzureNodeClassSpecArgsOutput) ImageFamily() pulumi.StringPtrOutput { return o.ApplyT(func(v AzureNodeClassSpecArgs) *string { return v.ImageFamily }).(pulumi.StringPtrOutput) } +func (o AzureNodeClassSpecArgsOutput) ImageVersion() pulumi.StringPtrOutput { + return o.ApplyT(func(v AzureNodeClassSpecArgs) *string { return v.ImageVersion }).(pulumi.StringPtrOutput) +} + // Kubelet configuration overrides for Azure nodes. func (o AzureNodeClassSpecArgsOutput) Kubelet() AzureKubeletConfigurationArgsPtrOutput { return o.ApplyT(func(v AzureNodeClassSpecArgs) *AzureKubeletConfigurationArgs { return v.Kubelet }).(AzureKubeletConfigurationArgsPtrOutput) @@ -1088,6 +1094,15 @@ func (o AzureNodeClassSpecArgsPtrOutput) ImageFamily() pulumi.StringPtrOutput { }).(pulumi.StringPtrOutput) } +func (o AzureNodeClassSpecArgsPtrOutput) ImageVersion() pulumi.StringPtrOutput { + return o.ApplyT(func(v *AzureNodeClassSpecArgs) *string { + if v == nil { + return nil + } + return v.ImageVersion + }).(pulumi.StringPtrOutput) +} + // Kubelet configuration overrides for Azure nodes. func (o AzureNodeClassSpecArgsPtrOutput) Kubelet() AzureKubeletConfigurationArgsPtrOutput { return o.ApplyT(func(v *AzureNodeClassSpecArgs) *AzureKubeletConfigurationArgs { @@ -2720,6 +2735,7 @@ func (o HPAFallbackArgsPtrOutput) Replicas() pulumi.IntPtrOutput { } type HPAMetricTriggerArgs struct { + ConnectorId *string `pulumi:"connectorId"` // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. Metadata map[string]string `pulumi:"metadata"` // PromQL query string. Shorthand — packed into metadata by the service layer. Example: 'sum(rate(http_requests_total[2m]))'. @@ -2748,6 +2764,7 @@ type HPAMetricTriggerArgsInput interface { } type HPAMetricTriggerArgsArgs struct { + ConnectorId pulumi.StringPtrInput `pulumi:"connectorId"` // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. Metadata pulumi.StringMapInput `pulumi:"metadata"` // PromQL query string. Shorthand — packed into metadata by the service layer. Example: 'sum(rate(http_requests_total[2m]))'. @@ -2815,6 +2832,10 @@ func (o HPAMetricTriggerArgsOutput) ToHPAMetricTriggerArgsOutputWithContext(ctx return o } +func (o HPAMetricTriggerArgsOutput) ConnectorId() pulumi.StringPtrOutput { + return o.ApplyT(func(v HPAMetricTriggerArgs) *string { return v.ConnectorId }).(pulumi.StringPtrOutput) +} + // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. func (o HPAMetricTriggerArgsOutput) Metadata() pulumi.StringMapOutput { return o.ApplyT(func(v HPAMetricTriggerArgs) map[string]string { return v.Metadata }).(pulumi.StringMapOutput) @@ -2883,18 +2904,12 @@ type HPARuleConfigArgs struct { MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent"` // Maximum number of replicas. Example: 10. MaxReplicas *int `pulumi:"maxReplicas"` - // Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + // HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. Metrics []HPAMetricTriggerArgs `pulumi:"metrics"` // Minimum number of replicas. Example: 2. MinReplicas *int `pulumi:"minReplicas"` - // Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric *string `pulumi:"primaryMetric"` // Seconds to wait between scale-down events. Example: 300. ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds"` - // Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization"` - // Target CPU utilization ratio (0-1). Example: 0.7. - TargetUtilization *float64 `pulumi:"targetUtilization"` } // HPARuleConfigArgsInput is an input type that accepts HPARuleConfigArgsArgs and HPARuleConfigArgsOutput values. @@ -2921,18 +2936,12 @@ type HPARuleConfigArgsArgs struct { MaxReplicaChangePercent pulumi.Float64PtrInput `pulumi:"maxReplicaChangePercent"` // Maximum number of replicas. Example: 10. MaxReplicas pulumi.IntPtrInput `pulumi:"maxReplicas"` - // Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + // HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. Metrics HPAMetricTriggerArgsArrayInput `pulumi:"metrics"` // Minimum number of replicas. Example: 2. MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` - // Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` // Seconds to wait between scale-down events. Example: 300. ScaleDownCooldownSeconds pulumi.IntPtrInput `pulumi:"scaleDownCooldownSeconds"` - // Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - TargetMemoryUtilization pulumi.Float64PtrInput `pulumi:"targetMemoryUtilization"` - // Target CPU utilization ratio (0-1). Example: 0.7. - TargetUtilization pulumi.Float64PtrInput `pulumi:"targetUtilization"` } func (HPARuleConfigArgsArgs) ElementType() reflect.Type { @@ -3042,7 +3051,7 @@ func (o HPARuleConfigArgsOutput) MaxReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.MaxReplicas }).(pulumi.IntPtrOutput) } -// Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. +// HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. func (o HPARuleConfigArgsOutput) Metrics() HPAMetricTriggerArgsArrayOutput { return o.ApplyT(func(v HPARuleConfigArgs) []HPAMetricTriggerArgs { return v.Metrics }).(HPAMetricTriggerArgsArrayOutput) } @@ -3052,26 +3061,11 @@ func (o HPARuleConfigArgsOutput) MinReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.MinReplicas }).(pulumi.IntPtrOutput) } -// Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. -func (o HPARuleConfigArgsOutput) PrimaryMetric() pulumi.StringPtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *string { return v.PrimaryMetric }).(pulumi.StringPtrOutput) -} - // Seconds to wait between scale-down events. Example: 300. func (o HPARuleConfigArgsOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.ScaleDownCooldownSeconds }).(pulumi.IntPtrOutput) } -// Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. -func (o HPARuleConfigArgsOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *float64 { return v.TargetMemoryUtilization }).(pulumi.Float64PtrOutput) -} - -// Target CPU utilization ratio (0-1). Example: 0.7. -func (o HPARuleConfigArgsOutput) TargetUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *float64 { return v.TargetUtilization }).(pulumi.Float64PtrOutput) -} - type HPARuleConfigArgsPtrOutput struct{ *pulumi.OutputState } func (HPARuleConfigArgsPtrOutput) ElementType() reflect.Type { @@ -3156,7 +3150,7 @@ func (o HPARuleConfigArgsPtrOutput) MaxReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } -// Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. +// HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. func (o HPARuleConfigArgsPtrOutput) Metrics() HPAMetricTriggerArgsArrayOutput { return o.ApplyT(func(v *HPARuleConfigArgs) []HPAMetricTriggerArgs { if v == nil { @@ -3176,16 +3170,6 @@ func (o HPARuleConfigArgsPtrOutput) MinReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } -// Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. -func (o HPARuleConfigArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *string { - if v == nil { - return nil - } - return v.PrimaryMetric - }).(pulumi.StringPtrOutput) -} - // Seconds to wait between scale-down events. Example: 300. func (o HPARuleConfigArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v *HPARuleConfigArgs) *int { @@ -3196,26 +3180,6 @@ func (o HPARuleConfigArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutp }).(pulumi.IntPtrOutput) } -// Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. -func (o HPARuleConfigArgsPtrOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *float64 { - if v == nil { - return nil - } - return v.TargetMemoryUtilization - }).(pulumi.Float64PtrOutput) -} - -// Target CPU utilization ratio (0-1). Example: 0.7. -func (o HPARuleConfigArgsPtrOutput) TargetUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *float64 { - if v == nil { - return nil - } - return v.TargetUtilization - }).(pulumi.Float64PtrOutput) -} - type HPAScalingPolicyArgs struct { // Period over which the policy applies in seconds. Example: 60. PeriodSeconds int `pulumi:"periodSeconds"` @@ -3507,6 +3471,7 @@ func (o HPAScalingRulesArgsPtrOutput) StabilizationWindowSeconds() pulumi.IntPtr } type HorizontalScalingArgs struct { + CompositeFormula *string `pulumi:"compositeFormula"` // Enable horizontal (replica) scaling. Example: true. Enabled *bool `pulumi:"enabled"` // Maximum percentage change in replica count per recommendation cycle. Example: 50.0 allows up to 50% change. @@ -3516,9 +3481,12 @@ type HorizontalScalingArgs struct { // Minimum data points required before a recommendation is emitted. Example: 20. MinDataPoints *int `pulumi:"minDataPoints"` // Minimum number of replicas to maintain. Example: 2. - MinReplicas *int `pulumi:"minReplicas"` + MinReplicas *int `pulumi:"minReplicas"` + NetworkTargetThroughputBytesPerSec *int `pulumi:"networkTargetThroughputBytesPerSec"` // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric *string `pulumi:"primaryMetric"` + PrimaryMetric *string `pulumi:"primaryMetric"` + ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds"` + TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization"` // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. TargetUtilization *float64 `pulumi:"targetUtilization"` } @@ -3535,6 +3503,7 @@ type HorizontalScalingArgsInput interface { } type HorizontalScalingArgsArgs struct { + CompositeFormula pulumi.StringPtrInput `pulumi:"compositeFormula"` // Enable horizontal (replica) scaling. Example: true. Enabled pulumi.BoolPtrInput `pulumi:"enabled"` // Maximum percentage change in replica count per recommendation cycle. Example: 50.0 allows up to 50% change. @@ -3544,9 +3513,12 @@ type HorizontalScalingArgsArgs struct { // Minimum data points required before a recommendation is emitted. Example: 20. MinDataPoints pulumi.IntPtrInput `pulumi:"minDataPoints"` // Minimum number of replicas to maintain. Example: 2. - MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` + MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` + NetworkTargetThroughputBytesPerSec pulumi.IntPtrInput `pulumi:"networkTargetThroughputBytesPerSec"` // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` + PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` + ScaleDownCooldownSeconds pulumi.IntPtrInput `pulumi:"scaleDownCooldownSeconds"` + TargetMemoryUtilization pulumi.Float64PtrInput `pulumi:"targetMemoryUtilization"` // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. TargetUtilization pulumi.Float64PtrInput `pulumi:"targetUtilization"` } @@ -3628,6 +3600,10 @@ func (o HorizontalScalingArgsOutput) ToHorizontalScalingArgsPtrOutputWithContext }).(HorizontalScalingArgsPtrOutput) } +func (o HorizontalScalingArgsOutput) CompositeFormula() pulumi.StringPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *string { return v.CompositeFormula }).(pulumi.StringPtrOutput) +} + // Enable horizontal (replica) scaling. Example: true. func (o HorizontalScalingArgsOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *bool { return v.Enabled }).(pulumi.BoolPtrOutput) @@ -3653,11 +3629,23 @@ func (o HorizontalScalingArgsOutput) MinReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.MinReplicas }).(pulumi.IntPtrOutput) } +func (o HorizontalScalingArgsOutput) NetworkTargetThroughputBytesPerSec() pulumi.IntPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.NetworkTargetThroughputBytesPerSec }).(pulumi.IntPtrOutput) +} + // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. func (o HorizontalScalingArgsOutput) PrimaryMetric() pulumi.StringPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *string { return v.PrimaryMetric }).(pulumi.StringPtrOutput) } +func (o HorizontalScalingArgsOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.ScaleDownCooldownSeconds }).(pulumi.IntPtrOutput) +} + +func (o HorizontalScalingArgsOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *float64 { return v.TargetMemoryUtilization }).(pulumi.Float64PtrOutput) +} + // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. func (o HorizontalScalingArgsOutput) TargetUtilization() pulumi.Float64PtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *float64 { return v.TargetUtilization }).(pulumi.Float64PtrOutput) @@ -3687,6 +3675,15 @@ func (o HorizontalScalingArgsPtrOutput) Elem() HorizontalScalingArgsOutput { }).(HorizontalScalingArgsOutput) } +func (o HorizontalScalingArgsPtrOutput) CompositeFormula() pulumi.StringPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *string { + if v == nil { + return nil + } + return v.CompositeFormula + }).(pulumi.StringPtrOutput) +} + // Enable horizontal (replica) scaling. Example: true. func (o HorizontalScalingArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *bool { @@ -3737,6 +3734,15 @@ func (o HorizontalScalingArgsPtrOutput) MinReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } +func (o HorizontalScalingArgsPtrOutput) NetworkTargetThroughputBytesPerSec() pulumi.IntPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *int { + if v == nil { + return nil + } + return v.NetworkTargetThroughputBytesPerSec + }).(pulumi.IntPtrOutput) +} + // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. func (o HorizontalScalingArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *string { @@ -3747,6 +3753,24 @@ func (o HorizontalScalingArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { }).(pulumi.StringPtrOutput) } +func (o HorizontalScalingArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *int { + if v == nil { + return nil + } + return v.ScaleDownCooldownSeconds + }).(pulumi.IntPtrOutput) +} + +func (o HorizontalScalingArgsPtrOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *float64 { + if v == nil { + return nil + } + return v.TargetMemoryUtilization + }).(pulumi.Float64PtrOutput) +} + // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. func (o HorizontalScalingArgsPtrOutput) TargetUtilization() pulumi.Float64PtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *float64 { @@ -4987,10 +5011,17 @@ func (o ResourceLimitsArgsPtrOutput) Memory() pulumi.StringPtrOutput { } type ResourceRuleConfigArgs struct { + CeilingPercent *int `pulumi:"ceilingPercent"` // Enable this resource axis rule. Example: true. - Enabled *bool `pulumi:"enabled"` + Enabled *bool `pulumi:"enabled"` + FloorPercent *int `pulumi:"floorPercent"` + InitialLimit *int `pulumi:"initialLimit"` + InitialRequest *int `pulumi:"initialRequest"` + LimitCeilingPercent *int `pulumi:"limitCeilingPercent"` + LimitFloorPercent *int `pulumi:"limitFloorPercent"` // Multiplier applied to the request to derive the resource limit. Example: 1.5. LimitMultiplier *float64 `pulumi:"limitMultiplier"` + LimitUseRss *bool `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled *bool `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads. Example: false. @@ -5002,7 +5033,8 @@ type ResourceRuleConfigArgs struct { // Maximum percentage increase allowed in a single cycle. Example: 50.0. MaxScaleUpPercent *float64 `pulumi:"maxScaleUpPercent"` // Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. - MinRequest *int `pulumi:"minRequest"` + MinRequest *int `pulumi:"minRequest"` + RequestUseRss *bool `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. TargetPercentile *float64 `pulumi:"targetPercentile"` } @@ -5019,10 +5051,17 @@ type ResourceRuleConfigArgsInput interface { } type ResourceRuleConfigArgsArgs struct { + CeilingPercent pulumi.IntPtrInput `pulumi:"ceilingPercent"` // Enable this resource axis rule. Example: true. - Enabled pulumi.BoolPtrInput `pulumi:"enabled"` + Enabled pulumi.BoolPtrInput `pulumi:"enabled"` + FloorPercent pulumi.IntPtrInput `pulumi:"floorPercent"` + InitialLimit pulumi.IntPtrInput `pulumi:"initialLimit"` + InitialRequest pulumi.IntPtrInput `pulumi:"initialRequest"` + LimitCeilingPercent pulumi.IntPtrInput `pulumi:"limitCeilingPercent"` + LimitFloorPercent pulumi.IntPtrInput `pulumi:"limitFloorPercent"` // Multiplier applied to the request to derive the resource limit. Example: 1.5. LimitMultiplier pulumi.Float64PtrInput `pulumi:"limitMultiplier"` + LimitUseRss pulumi.BoolPtrInput `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled pulumi.BoolPtrInput `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads. Example: false. @@ -5034,7 +5073,8 @@ type ResourceRuleConfigArgsArgs struct { // Maximum percentage increase allowed in a single cycle. Example: 50.0. MaxScaleUpPercent pulumi.Float64PtrInput `pulumi:"maxScaleUpPercent"` // Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. - MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` + MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` + RequestUseRss pulumi.BoolPtrInput `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. TargetPercentile pulumi.Float64PtrInput `pulumi:"targetPercentile"` } @@ -5116,16 +5156,44 @@ func (o ResourceRuleConfigArgsOutput) ToResourceRuleConfigArgsPtrOutputWithConte }).(ResourceRuleConfigArgsPtrOutput) } +func (o ResourceRuleConfigArgsOutput) CeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.CeilingPercent }).(pulumi.IntPtrOutput) +} + // Enable this resource axis rule. Example: true. func (o ResourceRuleConfigArgsOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.Enabled }).(pulumi.BoolPtrOutput) } +func (o ResourceRuleConfigArgsOutput) FloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.FloorPercent }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) InitialLimit() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.InitialLimit }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) InitialRequest() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.InitialRequest }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) LimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.LimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) LimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.LimitFloorPercent }).(pulumi.IntPtrOutput) +} + // Multiplier applied to the request to derive the resource limit. Example: 1.5. func (o ResourceRuleConfigArgsOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *float64 { return v.LimitMultiplier }).(pulumi.Float64PtrOutput) } +func (o ResourceRuleConfigArgsOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.LimitUseRss }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o ResourceRuleConfigArgsOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.LimitsAdjustmentEnabled }).(pulumi.BoolPtrOutput) @@ -5156,6 +5224,10 @@ func (o ResourceRuleConfigArgsOutput) MinRequest() pulumi.IntPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.MinRequest }).(pulumi.IntPtrOutput) } +func (o ResourceRuleConfigArgsOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.RequestUseRss }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. func (o ResourceRuleConfigArgsOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *float64 { return v.TargetPercentile }).(pulumi.Float64PtrOutput) @@ -5185,6 +5257,15 @@ func (o ResourceRuleConfigArgsPtrOutput) Elem() ResourceRuleConfigArgsOutput { }).(ResourceRuleConfigArgsOutput) } +func (o ResourceRuleConfigArgsPtrOutput) CeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.CeilingPercent + }).(pulumi.IntPtrOutput) +} + // Enable this resource axis rule. Example: true. func (o ResourceRuleConfigArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { @@ -5195,6 +5276,51 @@ func (o ResourceRuleConfigArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { }).(pulumi.BoolPtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) FloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.FloorPercent + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) InitialLimit() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.InitialLimit + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) InitialRequest() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.InitialRequest + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) LimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.LimitCeilingPercent + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) LimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.LimitFloorPercent + }).(pulumi.IntPtrOutput) +} + // Multiplier applied to the request to derive the resource limit. Example: 1.5. func (o ResourceRuleConfigArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *float64 { @@ -5205,6 +5331,15 @@ func (o ResourceRuleConfigArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutp }).(pulumi.Float64PtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { + if v == nil { + return nil + } + return v.LimitUseRss + }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o ResourceRuleConfigArgsPtrOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { @@ -5265,6 +5400,15 @@ func (o ResourceRuleConfigArgsPtrOutput) MinRequest() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { + if v == nil { + return nil + } + return v.RequestUseRss + }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. func (o ResourceRuleConfigArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *float64 { @@ -5618,6 +5762,7 @@ type VerticalScalingArgs struct { Enabled *bool `pulumi:"enabled"` // Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. LimitMultiplier *float64 `pulumi:"limitMultiplier"` + LimitUseRss *bool `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled *bool `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads (CPU axis only — memory limits removal is not supported). Takes precedence over limitsAdjustmentEnabled when set. Default: false. @@ -5634,6 +5779,7 @@ type VerticalScalingArgs struct { MinRequest *int `pulumi:"minRequest"` // Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. OverheadMultiplier *float64 `pulumi:"overheadMultiplier"` + RequestUseRss *bool `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. TargetPercentile *float64 `pulumi:"targetPercentile"` } @@ -5677,6 +5823,7 @@ type VerticalScalingArgsArgs struct { Enabled pulumi.BoolPtrInput `pulumi:"enabled"` // Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. LimitMultiplier pulumi.Float64PtrInput `pulumi:"limitMultiplier"` + LimitUseRss pulumi.BoolPtrInput `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled pulumi.BoolPtrInput `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads (CPU axis only — memory limits removal is not supported). Takes precedence over limitsAdjustmentEnabled when set. Default: false. @@ -5693,6 +5840,7 @@ type VerticalScalingArgsArgs struct { MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` // Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. OverheadMultiplier pulumi.Float64PtrInput `pulumi:"overheadMultiplier"` + RequestUseRss pulumi.BoolPtrInput `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. TargetPercentile pulumi.Float64PtrInput `pulumi:"targetPercentile"` } @@ -5806,6 +5954,10 @@ func (o VerticalScalingArgsOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.LimitMultiplier }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.LimitUseRss }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o VerticalScalingArgsOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.LimitsAdjustmentEnabled }).(pulumi.BoolPtrOutput) @@ -5846,6 +5998,10 @@ func (o VerticalScalingArgsOutput) OverheadMultiplier() pulumi.Float64PtrOutput return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.OverheadMultiplier }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.RequestUseRss }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. func (o VerticalScalingArgsOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.TargetPercentile }).(pulumi.Float64PtrOutput) @@ -5905,6 +6061,15 @@ func (o VerticalScalingArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutput }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsPtrOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *VerticalScalingArgs) *bool { + if v == nil { + return nil + } + return v.LimitUseRss + }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o VerticalScalingArgsPtrOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *VerticalScalingArgs) *bool { @@ -5985,6 +6150,15 @@ func (o VerticalScalingArgsPtrOutput) OverheadMultiplier() pulumi.Float64PtrOutp }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsPtrOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *VerticalScalingArgs) *bool { + if v == nil { + return nil + } + return v.RequestUseRss + }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. func (o VerticalScalingArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v *VerticalScalingArgs) *float64 { @@ -5995,6 +6169,169 @@ func (o VerticalScalingArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput }).(pulumi.Float64PtrOutput) } +type ZonalShiftConfigArgs struct { + AllowZoneFallback *bool `pulumi:"allowZoneFallback"` + EvictImpactedNodes *bool `pulumi:"evictImpactedNodes"` + RespectZonalShift *bool `pulumi:"respectZonalShift"` +} + +// ZonalShiftConfigArgsInput is an input type that accepts ZonalShiftConfigArgsArgs and ZonalShiftConfigArgsOutput values. +// You can construct a concrete instance of `ZonalShiftConfigArgsInput` via: +// +// ZonalShiftConfigArgsArgs{...} +type ZonalShiftConfigArgsInput interface { + pulumi.Input + + ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput + ToZonalShiftConfigArgsOutputWithContext(context.Context) ZonalShiftConfigArgsOutput +} + +type ZonalShiftConfigArgsArgs struct { + AllowZoneFallback pulumi.BoolPtrInput `pulumi:"allowZoneFallback"` + EvictImpactedNodes pulumi.BoolPtrInput `pulumi:"evictImpactedNodes"` + RespectZonalShift pulumi.BoolPtrInput `pulumi:"respectZonalShift"` +} + +func (ZonalShiftConfigArgsArgs) ElementType() reflect.Type { + return reflect.TypeOf((*ZonalShiftConfigArgs)(nil)).Elem() +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput { + return i.ToZonalShiftConfigArgsOutputWithContext(context.Background()) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsOutputWithContext(ctx context.Context) ZonalShiftConfigArgsOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsOutput) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return i.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsOutput).ToZonalShiftConfigArgsPtrOutputWithContext(ctx) +} + +// ZonalShiftConfigArgsPtrInput is an input type that accepts ZonalShiftConfigArgsArgs, ZonalShiftConfigArgsPtr and ZonalShiftConfigArgsPtrOutput values. +// You can construct a concrete instance of `ZonalShiftConfigArgsPtrInput` via: +// +// ZonalShiftConfigArgsArgs{...} +// +// or: +// +// nil +type ZonalShiftConfigArgsPtrInput interface { + pulumi.Input + + ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput + ToZonalShiftConfigArgsPtrOutputWithContext(context.Context) ZonalShiftConfigArgsPtrOutput +} + +type zonalShiftConfigArgsPtrType ZonalShiftConfigArgsArgs + +func ZonalShiftConfigArgsPtr(v *ZonalShiftConfigArgsArgs) ZonalShiftConfigArgsPtrInput { + return (*zonalShiftConfigArgsPtrType)(v) +} + +func (*zonalShiftConfigArgsPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**ZonalShiftConfigArgs)(nil)).Elem() +} + +func (i *zonalShiftConfigArgsPtrType) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return i.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (i *zonalShiftConfigArgsPtrType) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsPtrOutput) +} + +type ZonalShiftConfigArgsOutput struct{ *pulumi.OutputState } + +func (ZonalShiftConfigArgsOutput) ElementType() reflect.Type { + return reflect.TypeOf((*ZonalShiftConfigArgs)(nil)).Elem() +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput { + return o +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsOutputWithContext(ctx context.Context) ZonalShiftConfigArgsOutput { + return o +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return o.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v ZonalShiftConfigArgs) *ZonalShiftConfigArgs { + return &v + }).(ZonalShiftConfigArgsPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) AllowZoneFallback() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.AllowZoneFallback }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) EvictImpactedNodes() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.EvictImpactedNodes }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) RespectZonalShift() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.RespectZonalShift }).(pulumi.BoolPtrOutput) +} + +type ZonalShiftConfigArgsPtrOutput struct{ *pulumi.OutputState } + +func (ZonalShiftConfigArgsPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**ZonalShiftConfigArgs)(nil)).Elem() +} + +func (o ZonalShiftConfigArgsPtrOutput) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return o +} + +func (o ZonalShiftConfigArgsPtrOutput) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return o +} + +func (o ZonalShiftConfigArgsPtrOutput) Elem() ZonalShiftConfigArgsOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) ZonalShiftConfigArgs { + if v != nil { + return *v + } + var ret ZonalShiftConfigArgs + return ret + }).(ZonalShiftConfigArgsOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) AllowZoneFallback() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.AllowZoneFallback + }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) EvictImpactedNodes() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.EvictImpactedNodes + }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) RespectZonalShift() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.RespectZonalShift + }).(pulumi.BoolPtrOutput) +} + func init() { pulumi.RegisterInputType(reflect.TypeOf((*AMISelectorTermArgsInput)(nil)).Elem(), AMISelectorTermArgsArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*AMISelectorTermArgsArrayInput)(nil)).Elem(), AMISelectorTermArgsArray{}) @@ -6056,6 +6393,8 @@ func init() { pulumi.RegisterInputType(reflect.TypeOf((*TaintArgsArrayInput)(nil)).Elem(), TaintArgsArray{}) pulumi.RegisterInputType(reflect.TypeOf((*VerticalScalingArgsInput)(nil)).Elem(), VerticalScalingArgsArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*VerticalScalingArgsPtrInput)(nil)).Elem(), VerticalScalingArgsArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ZonalShiftConfigArgsInput)(nil)).Elem(), ZonalShiftConfigArgsArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ZonalShiftConfigArgsPtrInput)(nil)).Elem(), ZonalShiftConfigArgsArgs{}) pulumi.RegisterOutputType(AMISelectorTermArgsOutput{}) pulumi.RegisterOutputType(AMISelectorTermArgsArrayOutput{}) pulumi.RegisterOutputType(AWSNodeClassSpecArgsOutput{}) @@ -6116,4 +6455,6 @@ func init() { pulumi.RegisterOutputType(TaintArgsArrayOutput{}) pulumi.RegisterOutputType(VerticalScalingArgsOutput{}) pulumi.RegisterOutputType(VerticalScalingArgsPtrOutput{}) + pulumi.RegisterOutputType(ZonalShiftConfigArgsOutput{}) + pulumi.RegisterOutputType(ZonalShiftConfigArgsPtrOutput{}) } diff --git a/sdk/go/devzero/resources/workloadPolicy.go b/sdk/go/devzero/resources/workloadPolicy.go index ef1662c..c429865 100644 --- a/sdk/go/devzero/resources/workloadPolicy.go +++ b/sdk/go/devzero/resources/workloadPolicy.go @@ -16,10 +16,15 @@ type WorkloadPolicy struct { pulumi.CustomResourceState // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers pulumi.StringArrayOutput `pulumi:"actionTriggers"` + ActionTriggers pulumi.StringArrayOutput `pulumi:"actionTriggers"` + AllowInPlaceMemoryLimitDecrease pulumi.BoolPtrOutput `pulumi:"allowInPlaceMemoryLimitDecrease"` // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes pulumi.IntPtrOutput `pulumi:"cooldownMinutes"` - CpuVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"cpuVerticalScaling"` + CooldownMinutes pulumi.IntPtrOutput `pulumi:"cooldownMinutes"` + CpuCeilingPercent pulumi.IntPtrOutput `pulumi:"cpuCeilingPercent"` + CpuFloorPercent pulumi.IntPtrOutput `pulumi:"cpuFloorPercent"` + CpuLimitCeilingPercent pulumi.IntPtrOutput `pulumi:"cpuLimitCeilingPercent"` + CpuLimitFloorPercent pulumi.IntPtrOutput `pulumi:"cpuLimitFloorPercent"` + CpuVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"cpuVerticalScaling"` // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule pulumi.StringPtrOutput `pulumi:"cronSchedule"` // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -29,7 +34,8 @@ type WorkloadPolicy struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers pulumi.StringArrayOutput `pulumi:"detectionTriggers"` // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent pulumi.Float64PtrOutput `pulumi:"driftDeltaPercent"` + DriftDeltaPercent pulumi.Float64PtrOutput `pulumi:"driftDeltaPercent"` + EnableInPlaceVerticalScaling pulumi.BoolPtrOutput `pulumi:"enableInPlaceVerticalScaling"` // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection pulumi.BoolPtrOutput `pulumi:"enablePmaxProtection"` // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -38,12 +44,25 @@ type WorkloadPolicy struct { GpuVramVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"gpuVramVerticalScaling"` HorizontalScaling HorizontalScalingArgsPtrOutput `pulumi:"horizontalScaling"` // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget pulumi.Float64PtrOutput `pulumi:"hysteresisVsTarget"` + HysteresisVsTarget pulumi.Float64PtrOutput `pulumi:"hysteresisVsTarget"` + JvmCpuStartupFloorMillicores pulumi.IntPtrOutput `pulumi:"jvmCpuStartupFloorMillicores"` + JvmHeapHeadroomMultiplier pulumi.Float64PtrOutput `pulumi:"jvmHeapHeadroomMultiplier"` + JvmHeapOptimizationEnabled pulumi.BoolPtrOutput `pulumi:"jvmHeapOptimizationEnabled"` + JvmHeapTargetPercentile pulumi.Float64PtrOutput `pulumi:"jvmHeapTargetPercentile"` + JvmMaxHeapBytes pulumi.IntPtrOutput `pulumi:"jvmMaxHeapBytes"` + JvmMinHeapBytes pulumi.IntPtrOutput `pulumi:"jvmMinHeapBytes"` + JvmNonHeapOverheadBytes pulumi.IntPtrOutput `pulumi:"jvmNonHeapOverheadBytes"` + JvmNonHeapOverheadPercent pulumi.Float64PtrOutput `pulumi:"jvmNonHeapOverheadPercent"` + JvmPreferContainerSupport pulumi.BoolPtrOutput `pulumi:"jvmPreferContainerSupport"` // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"loopbackPeriodSeconds"` - MemoryVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"memoryVerticalScaling"` + LoopbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"loopbackPeriodSeconds"` + MemoryCeilingPercent pulumi.IntPtrOutput `pulumi:"memoryCeilingPercent"` + MemoryFloorPercent pulumi.IntPtrOutput `pulumi:"memoryFloorPercent"` + MemoryLimitCeilingPercent pulumi.IntPtrOutput `pulumi:"memoryLimitCeilingPercent"` + MemoryLimitFloorPercent pulumi.IntPtrOutput `pulumi:"memoryLimitFloorPercent"` + MemoryVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"memoryVerticalScaling"` // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent pulumi.Float64PtrOutput `pulumi:"minChangePercent"` // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -51,7 +70,8 @@ type WorkloadPolicy struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints pulumi.IntPtrOutput `pulumi:"minVpaWindowDataPoints"` // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name pulumi.StringOutput `pulumi:"name"` + Name pulumi.StringOutput `pulumi:"name"` + PdbEnabled pulumi.BoolPtrOutput `pulumi:"pdbEnabled"` // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold pulumi.Float64PtrOutput `pulumi:"pmaxRatioThreshold"` // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -136,10 +156,15 @@ func (WorkloadPolicyState) ElementType() reflect.Type { type workloadPolicyArgs struct { // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers []string `pulumi:"actionTriggers"` + ActionTriggers []string `pulumi:"actionTriggers"` + AllowInPlaceMemoryLimitDecrease *bool `pulumi:"allowInPlaceMemoryLimitDecrease"` // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes *int `pulumi:"cooldownMinutes"` - CpuVerticalScaling *VerticalScalingArgs `pulumi:"cpuVerticalScaling"` + CooldownMinutes *int `pulumi:"cooldownMinutes"` + CpuCeilingPercent *int `pulumi:"cpuCeilingPercent"` + CpuFloorPercent *int `pulumi:"cpuFloorPercent"` + CpuLimitCeilingPercent *int `pulumi:"cpuLimitCeilingPercent"` + CpuLimitFloorPercent *int `pulumi:"cpuLimitFloorPercent"` + CpuVerticalScaling *VerticalScalingArgs `pulumi:"cpuVerticalScaling"` // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule *string `pulumi:"cronSchedule"` // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -149,7 +174,8 @@ type workloadPolicyArgs struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers []string `pulumi:"detectionTriggers"` // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent *float64 `pulumi:"driftDeltaPercent"` + DriftDeltaPercent *float64 `pulumi:"driftDeltaPercent"` + EnableInPlaceVerticalScaling *bool `pulumi:"enableInPlaceVerticalScaling"` // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection *bool `pulumi:"enablePmaxProtection"` // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -158,12 +184,25 @@ type workloadPolicyArgs struct { GpuVramVerticalScaling *VerticalScalingArgs `pulumi:"gpuVramVerticalScaling"` HorizontalScaling *HorizontalScalingArgs `pulumi:"horizontalScaling"` // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget *float64 `pulumi:"hysteresisVsTarget"` + HysteresisVsTarget *float64 `pulumi:"hysteresisVsTarget"` + JvmCpuStartupFloorMillicores *int `pulumi:"jvmCpuStartupFloorMillicores"` + JvmHeapHeadroomMultiplier *float64 `pulumi:"jvmHeapHeadroomMultiplier"` + JvmHeapOptimizationEnabled *bool `pulumi:"jvmHeapOptimizationEnabled"` + JvmHeapTargetPercentile *float64 `pulumi:"jvmHeapTargetPercentile"` + JvmMaxHeapBytes *int `pulumi:"jvmMaxHeapBytes"` + JvmMinHeapBytes *int `pulumi:"jvmMinHeapBytes"` + JvmNonHeapOverheadBytes *int `pulumi:"jvmNonHeapOverheadBytes"` + JvmNonHeapOverheadPercent *float64 `pulumi:"jvmNonHeapOverheadPercent"` + JvmPreferContainerSupport *bool `pulumi:"jvmPreferContainerSupport"` // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds *int `pulumi:"loopbackPeriodSeconds"` - MemoryVerticalScaling *VerticalScalingArgs `pulumi:"memoryVerticalScaling"` + LoopbackPeriodSeconds *int `pulumi:"loopbackPeriodSeconds"` + MemoryCeilingPercent *int `pulumi:"memoryCeilingPercent"` + MemoryFloorPercent *int `pulumi:"memoryFloorPercent"` + MemoryLimitCeilingPercent *int `pulumi:"memoryLimitCeilingPercent"` + MemoryLimitFloorPercent *int `pulumi:"memoryLimitFloorPercent"` + MemoryVerticalScaling *VerticalScalingArgs `pulumi:"memoryVerticalScaling"` // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent *float64 `pulumi:"minChangePercent"` // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -171,7 +210,8 @@ type workloadPolicyArgs struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints *int `pulumi:"minVpaWindowDataPoints"` // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name string `pulumi:"name"` + Name string `pulumi:"name"` + PdbEnabled *bool `pulumi:"pdbEnabled"` // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold *float64 `pulumi:"pmaxRatioThreshold"` // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -185,10 +225,15 @@ type workloadPolicyArgs struct { // The set of arguments for constructing a WorkloadPolicy resource. type WorkloadPolicyArgs struct { // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers pulumi.StringArrayInput + ActionTriggers pulumi.StringArrayInput + AllowInPlaceMemoryLimitDecrease pulumi.BoolPtrInput // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes pulumi.IntPtrInput - CpuVerticalScaling VerticalScalingArgsPtrInput + CooldownMinutes pulumi.IntPtrInput + CpuCeilingPercent pulumi.IntPtrInput + CpuFloorPercent pulumi.IntPtrInput + CpuLimitCeilingPercent pulumi.IntPtrInput + CpuLimitFloorPercent pulumi.IntPtrInput + CpuVerticalScaling VerticalScalingArgsPtrInput // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule pulumi.StringPtrInput // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -198,7 +243,8 @@ type WorkloadPolicyArgs struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers pulumi.StringArrayInput // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent pulumi.Float64PtrInput + DriftDeltaPercent pulumi.Float64PtrInput + EnableInPlaceVerticalScaling pulumi.BoolPtrInput // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection pulumi.BoolPtrInput // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -207,12 +253,25 @@ type WorkloadPolicyArgs struct { GpuVramVerticalScaling VerticalScalingArgsPtrInput HorizontalScaling HorizontalScalingArgsPtrInput // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget pulumi.Float64PtrInput + HysteresisVsTarget pulumi.Float64PtrInput + JvmCpuStartupFloorMillicores pulumi.IntPtrInput + JvmHeapHeadroomMultiplier pulumi.Float64PtrInput + JvmHeapOptimizationEnabled pulumi.BoolPtrInput + JvmHeapTargetPercentile pulumi.Float64PtrInput + JvmMaxHeapBytes pulumi.IntPtrInput + JvmMinHeapBytes pulumi.IntPtrInput + JvmNonHeapOverheadBytes pulumi.IntPtrInput + JvmNonHeapOverheadPercent pulumi.Float64PtrInput + JvmPreferContainerSupport pulumi.BoolPtrInput // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled pulumi.BoolPtrInput // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds pulumi.IntPtrInput - MemoryVerticalScaling VerticalScalingArgsPtrInput + LoopbackPeriodSeconds pulumi.IntPtrInput + MemoryCeilingPercent pulumi.IntPtrInput + MemoryFloorPercent pulumi.IntPtrInput + MemoryLimitCeilingPercent pulumi.IntPtrInput + MemoryLimitFloorPercent pulumi.IntPtrInput + MemoryVerticalScaling VerticalScalingArgsPtrInput // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent pulumi.Float64PtrInput // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -220,7 +279,8 @@ type WorkloadPolicyArgs struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints pulumi.IntPtrInput // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name pulumi.StringInput + Name pulumi.StringInput + PdbEnabled pulumi.BoolPtrInput // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold pulumi.Float64PtrInput // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -323,11 +383,31 @@ func (o WorkloadPolicyOutput) ActionTriggers() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.StringArrayOutput { return v.ActionTriggers }).(pulumi.StringArrayOutput) } +func (o WorkloadPolicyOutput) AllowInPlaceMemoryLimitDecrease() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.AllowInPlaceMemoryLimitDecrease }).(pulumi.BoolPtrOutput) +} + // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). func (o WorkloadPolicyOutput) CooldownMinutes() pulumi.IntPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CooldownMinutes }).(pulumi.IntPtrOutput) } +func (o WorkloadPolicyOutput) CpuCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuFloorPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuLimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuLimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuLimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuLimitFloorPercent }).(pulumi.IntPtrOutput) +} + func (o WorkloadPolicyOutput) CpuVerticalScaling() VerticalScalingArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) VerticalScalingArgsPtrOutput { return v.CpuVerticalScaling }).(VerticalScalingArgsPtrOutput) } @@ -357,6 +437,10 @@ func (o WorkloadPolicyOutput) DriftDeltaPercent() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.DriftDeltaPercent }).(pulumi.Float64PtrOutput) } +func (o WorkloadPolicyOutput) EnableInPlaceVerticalScaling() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.EnableInPlaceVerticalScaling }).(pulumi.BoolPtrOutput) +} + // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. func (o WorkloadPolicyOutput) EnablePmaxProtection() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.EnablePmaxProtection }).(pulumi.BoolPtrOutput) @@ -381,6 +465,42 @@ func (o WorkloadPolicyOutput) HysteresisVsTarget() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.HysteresisVsTarget }).(pulumi.Float64PtrOutput) } +func (o WorkloadPolicyOutput) JvmCpuStartupFloorMillicores() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmCpuStartupFloorMillicores }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapHeadroomMultiplier() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmHeapHeadroomMultiplier }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapOptimizationEnabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.JvmHeapOptimizationEnabled }).(pulumi.BoolPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapTargetPercentile() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmHeapTargetPercentile }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmMaxHeapBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmMaxHeapBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmMinHeapBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmMinHeapBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmNonHeapOverheadBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmNonHeapOverheadBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmNonHeapOverheadPercent() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmNonHeapOverheadPercent }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmPreferContainerSupport() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.JvmPreferContainerSupport }).(pulumi.BoolPtrOutput) +} + // Allow live pod migration when applying recommendations without restart. Example: false. func (o WorkloadPolicyOutput) LiveMigrationEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.LiveMigrationEnabled }).(pulumi.BoolPtrOutput) @@ -391,6 +511,22 @@ func (o WorkloadPolicyOutput) LoopbackPeriodSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.LoopbackPeriodSeconds }).(pulumi.IntPtrOutput) } +func (o WorkloadPolicyOutput) MemoryCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryFloorPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryLimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryLimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryLimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryLimitFloorPercent }).(pulumi.IntPtrOutput) +} + func (o WorkloadPolicyOutput) MemoryVerticalScaling() VerticalScalingArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) VerticalScalingArgsPtrOutput { return v.MemoryVerticalScaling }).(VerticalScalingArgsPtrOutput) } @@ -415,6 +551,10 @@ func (o WorkloadPolicyOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) } +func (o WorkloadPolicyOutput) PdbEnabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.PdbEnabled }).(pulumi.BoolPtrOutput) +} + // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. func (o WorkloadPolicyOutput) PmaxRatioThreshold() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.PmaxRatioThreshold }).(pulumi.Float64PtrOutput) diff --git a/sdk/go/devzero/resources/workloadPolicyTarget.go b/sdk/go/devzero/resources/workloadPolicyTarget.go index 70f7a91..213f147 100644 --- a/sdk/go/devzero/resources/workloadPolicyTarget.go +++ b/sdk/go/devzero/resources/workloadPolicyTarget.go @@ -15,14 +15,18 @@ import ( type WorkloadPolicyTarget struct { pulumi.CustomResourceState + // Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + AnnotationSelector LabelSelectorArgsPtrOutput `pulumi:"annotationSelector"` // Cluster IDs where this target applies. ClusterIds pulumi.StringArrayOutput `pulumi:"clusterIds"` // Free-form description of the target. Description pulumi.StringPtrOutput `pulumi:"description"` - // Enable or disable this target. + // Enable or disable this target. Defaults to true. Enabled pulumi.BoolPtrOutput `pulumi:"enabled"` // Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod). KindFilter pulumi.StringArrayOutput `pulumi:"kindFilter"` + // Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + KindFilterNotIn pulumi.StringArrayOutput `pulumi:"kindFilterNotIn"` // Human-friendly name for this target. Name pulumi.StringOutput `pulumi:"name"` // Regex to match workload names. @@ -31,7 +35,9 @@ type WorkloadPolicyTarget struct { NamespacePattern NamePatternArgsPtrOutput `pulumi:"namespacePattern"` // Select namespaces by labels. NamespaceSelector LabelSelectorArgsPtrOutput `pulumi:"namespaceSelector"` - // Restrict matching to specific node groups by name. + // DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. + // + // Deprecated: node_group_names is deprecated by the DevZero API and no longer evaluated. NodeGroupNames pulumi.StringArrayOutput `pulumi:"nodeGroupNames"` // Workload policy ID this target is attached to. PolicyId pulumi.StringOutput `pulumi:"policyId"` @@ -39,6 +45,8 @@ type WorkloadPolicyTarget struct { Priority pulumi.IntPtrOutput `pulumi:"priority"` // Explicit list of workload names to include. WorkloadNames pulumi.StringArrayOutput `pulumi:"workloadNames"` + // Explicit list of workload names to exclude. + WorkloadNamesNotIn pulumi.StringArrayOutput `pulumi:"workloadNamesNotIn"` // Select workloads by labels. WorkloadSelector LabelSelectorArgsPtrOutput `pulumi:"workloadSelector"` } @@ -92,36 +100,42 @@ func (WorkloadPolicyTargetState) ElementType() reflect.Type { } type workloadPolicyTargetArgs struct { - ClusterIds []string `pulumi:"clusterIds"` - Description *string `pulumi:"description"` - Enabled *bool `pulumi:"enabled"` - KindFilter []string `pulumi:"kindFilter"` - Name string `pulumi:"name"` - NamePattern *NamePatternArgs `pulumi:"namePattern"` - NamespacePattern *NamePatternArgs `pulumi:"namespacePattern"` - NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector"` - NodeGroupNames []string `pulumi:"nodeGroupNames"` - PolicyId string `pulumi:"policyId"` - Priority *int `pulumi:"priority"` - WorkloadNames []string `pulumi:"workloadNames"` - WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector"` + AnnotationSelector *LabelSelectorArgs `pulumi:"annotationSelector"` + ClusterIds []string `pulumi:"clusterIds"` + Description *string `pulumi:"description"` + Enabled *bool `pulumi:"enabled"` + KindFilter []string `pulumi:"kindFilter"` + KindFilterNotIn []string `pulumi:"kindFilterNotIn"` + Name string `pulumi:"name"` + NamePattern *NamePatternArgs `pulumi:"namePattern"` + NamespacePattern *NamePatternArgs `pulumi:"namespacePattern"` + NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector"` + NodeGroupNames []string `pulumi:"nodeGroupNames"` + PolicyId string `pulumi:"policyId"` + Priority *int `pulumi:"priority"` + WorkloadNames []string `pulumi:"workloadNames"` + WorkloadNamesNotIn []string `pulumi:"workloadNamesNotIn"` + WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector"` } // The set of arguments for constructing a WorkloadPolicyTarget resource. type WorkloadPolicyTargetArgs struct { - ClusterIds pulumi.StringArrayInput - Description pulumi.StringPtrInput - Enabled pulumi.BoolPtrInput - KindFilter pulumi.StringArrayInput - Name pulumi.StringInput - NamePattern NamePatternArgsPtrInput - NamespacePattern NamePatternArgsPtrInput - NamespaceSelector LabelSelectorArgsPtrInput - NodeGroupNames pulumi.StringArrayInput - PolicyId pulumi.StringInput - Priority pulumi.IntPtrInput - WorkloadNames pulumi.StringArrayInput - WorkloadSelector LabelSelectorArgsPtrInput + AnnotationSelector LabelSelectorArgsPtrInput + ClusterIds pulumi.StringArrayInput + Description pulumi.StringPtrInput + Enabled pulumi.BoolPtrInput + KindFilter pulumi.StringArrayInput + KindFilterNotIn pulumi.StringArrayInput + Name pulumi.StringInput + NamePattern NamePatternArgsPtrInput + NamespacePattern NamePatternArgsPtrInput + NamespaceSelector LabelSelectorArgsPtrInput + NodeGroupNames pulumi.StringArrayInput + PolicyId pulumi.StringInput + Priority pulumi.IntPtrInput + WorkloadNames pulumi.StringArrayInput + WorkloadNamesNotIn pulumi.StringArrayInput + WorkloadSelector LabelSelectorArgsPtrInput } func (WorkloadPolicyTargetArgs) ElementType() reflect.Type { @@ -211,6 +225,11 @@ func (o WorkloadPolicyTargetOutput) ToWorkloadPolicyTargetOutputWithContext(ctx return o } +// Select workloads by annotations (same semantics as label selectors, evaluated against annotations). +func (o WorkloadPolicyTargetOutput) AnnotationSelector() LabelSelectorArgsPtrOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.AnnotationSelector }).(LabelSelectorArgsPtrOutput) +} + // Cluster IDs where this target applies. func (o WorkloadPolicyTargetOutput) ClusterIds() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.ClusterIds }).(pulumi.StringArrayOutput) @@ -221,7 +240,7 @@ func (o WorkloadPolicyTargetOutput) Description() pulumi.StringPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringPtrOutput { return v.Description }).(pulumi.StringPtrOutput) } -// Enable or disable this target. +// Enable or disable this target. Defaults to true. func (o WorkloadPolicyTargetOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.BoolPtrOutput { return v.Enabled }).(pulumi.BoolPtrOutput) } @@ -231,6 +250,11 @@ func (o WorkloadPolicyTargetOutput) KindFilter() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.KindFilter }).(pulumi.StringArrayOutput) } +// Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. +func (o WorkloadPolicyTargetOutput) KindFilterNotIn() pulumi.StringArrayOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.KindFilterNotIn }).(pulumi.StringArrayOutput) +} + // Human-friendly name for this target. func (o WorkloadPolicyTargetOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) @@ -251,7 +275,9 @@ func (o WorkloadPolicyTargetOutput) NamespaceSelector() LabelSelectorArgsPtrOutp return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.NamespaceSelector }).(LabelSelectorArgsPtrOutput) } -// Restrict matching to specific node groups by name. +// DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. +// +// Deprecated: node_group_names is deprecated by the DevZero API and no longer evaluated. func (o WorkloadPolicyTargetOutput) NodeGroupNames() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.NodeGroupNames }).(pulumi.StringArrayOutput) } @@ -271,6 +297,11 @@ func (o WorkloadPolicyTargetOutput) WorkloadNames() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.WorkloadNames }).(pulumi.StringArrayOutput) } +// Explicit list of workload names to exclude. +func (o WorkloadPolicyTargetOutput) WorkloadNamesNotIn() pulumi.StringArrayOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.WorkloadNamesNotIn }).(pulumi.StringArrayOutput) +} + // Select workloads by labels. func (o WorkloadPolicyTargetOutput) WorkloadSelector() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.WorkloadSelector }).(LabelSelectorArgsPtrOutput) diff --git a/sdk/go/devzero/resources/workloadRule.go b/sdk/go/devzero/resources/workloadRule.go index 8773c09..9404561 100644 --- a/sdk/go/devzero/resources/workloadRule.go +++ b/sdk/go/devzero/resources/workloadRule.go @@ -33,6 +33,7 @@ type WorkloadRule struct { DefragmentationSchedule pulumi.StringPtrOutput `pulumi:"defragmentationSchedule"` // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers pulumi.StringArrayOutput `pulumi:"detectionTriggers"` + Disabled pulumi.BoolPtrOutput `pulumi:"disabled"` // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse EmergencyResponseConfigArgsPtrOutput `pulumi:"emergencyResponse"` // GPU vertical scaling rule configuration. @@ -42,7 +43,8 @@ type WorkloadRule struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind pulumi.StringOutput `pulumi:"kind"` // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` + LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` + LookbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"lookbackPeriodSeconds"` // Memory vertical scaling rule configuration. MemoryRule ResourceRuleConfigArgsPtrOutput `pulumi:"memoryRule"` // Name of the Kubernetes workload. Example: 'my-api'. @@ -127,6 +129,7 @@ type workloadRuleArgs struct { DefragmentationSchedule *string `pulumi:"defragmentationSchedule"` // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers []string `pulumi:"detectionTriggers"` + Disabled *bool `pulumi:"disabled"` // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse"` // GPU vertical scaling rule configuration. @@ -136,7 +139,8 @@ type workloadRuleArgs struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind string `pulumi:"kind"` // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` + LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` + LookbackPeriodSeconds *int `pulumi:"lookbackPeriodSeconds"` // Memory vertical scaling rule configuration. MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule"` // Name of the Kubernetes workload. Example: 'my-api'. @@ -171,6 +175,7 @@ type WorkloadRuleArgs struct { DefragmentationSchedule pulumi.StringPtrInput // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers pulumi.StringArrayInput + Disabled pulumi.BoolPtrInput // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse EmergencyResponseConfigArgsPtrInput // GPU vertical scaling rule configuration. @@ -180,7 +185,8 @@ type WorkloadRuleArgs struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind pulumi.StringInput // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled pulumi.BoolPtrInput + LiveMigrationEnabled pulumi.BoolPtrInput + LookbackPeriodSeconds pulumi.IntPtrInput // Memory vertical scaling rule configuration. MemoryRule ResourceRuleConfigArgsPtrInput // Name of the Kubernetes workload. Example: 'my-api'. @@ -327,6 +333,10 @@ func (o WorkloadRuleOutput) DetectionTriggers() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadRule) pulumi.StringArrayOutput { return v.DetectionTriggers }).(pulumi.StringArrayOutput) } +func (o WorkloadRuleOutput) Disabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadRule) pulumi.BoolPtrOutput { return v.Disabled }).(pulumi.BoolPtrOutput) +} + // Emergency response configuration for OOM and CPU throttle events. func (o WorkloadRuleOutput) EmergencyResponse() EmergencyResponseConfigArgsPtrOutput { return o.ApplyT(func(v *WorkloadRule) EmergencyResponseConfigArgsPtrOutput { return v.EmergencyResponse }).(EmergencyResponseConfigArgsPtrOutput) @@ -352,6 +362,10 @@ func (o WorkloadRuleOutput) LiveMigrationEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadRule) pulumi.BoolPtrOutput { return v.LiveMigrationEnabled }).(pulumi.BoolPtrOutput) } +func (o WorkloadRuleOutput) LookbackPeriodSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadRule) pulumi.IntPtrOutput { return v.LookbackPeriodSeconds }).(pulumi.IntPtrOutput) +} + // Memory vertical scaling rule configuration. func (o WorkloadRuleOutput) MemoryRule() ResourceRuleConfigArgsPtrOutput { return o.ApplyT(func(v *WorkloadRule) ResourceRuleConfigArgsPtrOutput { return v.MemoryRule }).(ResourceRuleConfigArgsPtrOutput) diff --git a/sdk/nodejs/resources/nodePolicy.ts b/sdk/nodejs/resources/nodePolicy.ts index 1d9395d..ece94f2 100644 --- a/sdk/nodejs/resources/nodePolicy.ts +++ b/sdk/nodejs/resources/nodePolicy.ts @@ -49,6 +49,7 @@ export class NodePolicy extends pulumi.CustomResource { * Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: ["spot", "on-demand"]}. */ declare public readonly capacityTypes: pulumi.Output; + declare public readonly cloudProviderId: pulumi.Output; /** * Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. */ @@ -77,6 +78,7 @@ export class NodePolicy extends pulumi.CustomResource { * Filter instances by hypervisor type. Example: {in: ["nitro"]}. */ declare public readonly instanceHypervisors: pulumi.Output; + declare public readonly instanceLocalNvme: pulumi.Output; /** * Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. */ @@ -93,6 +95,7 @@ export class NodePolicy extends pulumi.CustomResource { * Resource limits on total capacity managed by this policy. Example: {cpu: "1000", memory: "1000Gi"}. */ declare public readonly limits: pulumi.Output; + declare public readonly masterOverrideRoleName: pulumi.Output; /** * Human-friendly name for the node policy. Example: 'prod-spot-policy'. */ @@ -113,6 +116,7 @@ export class NodePolicy extends pulumi.CustomResource { * Raw Karpenter YAML for full NodePool/NodeClass customization — use only when structured fields are insufficient. */ declare public readonly raw: pulumi.Output; + declare public readonly startupTaints: pulumi.Output; /** * Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. */ @@ -121,6 +125,7 @@ export class NodePolicy extends pulumi.CustomResource { * Priority weight; higher values take precedence when multiple policies match. Example: 100. */ declare public readonly weight: pulumi.Output; + declare public readonly zonalShift: pulumi.Output; /** * Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. */ @@ -144,6 +149,7 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["aws"] = args?.aws; resourceInputs["azure"] = args?.azure; resourceInputs["capacityTypes"] = args?.capacityTypes; + resourceInputs["cloudProviderId"] = args?.cloudProviderId; resourceInputs["description"] = args?.description; resourceInputs["disruption"] = args?.disruption; resourceInputs["instanceCategories"] = args?.instanceCategories; @@ -151,23 +157,28 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["instanceFamilies"] = args?.instanceFamilies; resourceInputs["instanceGenerations"] = args?.instanceGenerations; resourceInputs["instanceHypervisors"] = args?.instanceHypervisors; + resourceInputs["instanceLocalNvme"] = args?.instanceLocalNvme; resourceInputs["instanceSizes"] = args?.instanceSizes; resourceInputs["instanceTypes"] = args?.instanceTypes; resourceInputs["labels"] = args?.labels; resourceInputs["limits"] = args?.limits; + resourceInputs["masterOverrideRoleName"] = args?.masterOverrideRoleName; resourceInputs["name"] = args?.name; resourceInputs["nodeClassName"] = args?.nodeClassName; resourceInputs["nodePoolName"] = args?.nodePoolName; resourceInputs["operatingSystems"] = args?.operatingSystems; resourceInputs["raw"] = args?.raw; + resourceInputs["startupTaints"] = args?.startupTaints; resourceInputs["taints"] = args?.taints; resourceInputs["weight"] = args?.weight; + resourceInputs["zonalShift"] = args?.zonalShift; resourceInputs["zones"] = args?.zones; } else { resourceInputs["architectures"] = undefined /*out*/; resourceInputs["aws"] = undefined /*out*/; resourceInputs["azure"] = undefined /*out*/; resourceInputs["capacityTypes"] = undefined /*out*/; + resourceInputs["cloudProviderId"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["disruption"] = undefined /*out*/; resourceInputs["instanceCategories"] = undefined /*out*/; @@ -175,17 +186,21 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["instanceFamilies"] = undefined /*out*/; resourceInputs["instanceGenerations"] = undefined /*out*/; resourceInputs["instanceHypervisors"] = undefined /*out*/; + resourceInputs["instanceLocalNvme"] = undefined /*out*/; resourceInputs["instanceSizes"] = undefined /*out*/; resourceInputs["instanceTypes"] = undefined /*out*/; resourceInputs["labels"] = undefined /*out*/; resourceInputs["limits"] = undefined /*out*/; + resourceInputs["masterOverrideRoleName"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["nodeClassName"] = undefined /*out*/; resourceInputs["nodePoolName"] = undefined /*out*/; resourceInputs["operatingSystems"] = undefined /*out*/; resourceInputs["raw"] = undefined /*out*/; + resourceInputs["startupTaints"] = undefined /*out*/; resourceInputs["taints"] = undefined /*out*/; resourceInputs["weight"] = undefined /*out*/; + resourceInputs["zonalShift"] = undefined /*out*/; resourceInputs["zones"] = undefined /*out*/; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); @@ -201,6 +216,7 @@ export interface NodePolicyArgs { aws?: pulumi.Input; azure?: pulumi.Input; capacityTypes?: pulumi.Input; + cloudProviderId?: pulumi.Input; description?: pulumi.Input; disruption?: pulumi.Input; instanceCategories?: pulumi.Input; @@ -208,16 +224,20 @@ export interface NodePolicyArgs { instanceFamilies?: pulumi.Input; instanceGenerations?: pulumi.Input; instanceHypervisors?: pulumi.Input; + instanceLocalNvme?: pulumi.Input; instanceSizes?: pulumi.Input; instanceTypes?: pulumi.Input; labels?: pulumi.Input<{[key: string]: pulumi.Input}>; limits?: pulumi.Input; + masterOverrideRoleName?: pulumi.Input; name: pulumi.Input; nodeClassName?: pulumi.Input; nodePoolName?: pulumi.Input; operatingSystems?: pulumi.Input; raw?: pulumi.Input[]>; + startupTaints?: pulumi.Input[]>; taints?: pulumi.Input[]>; weight?: pulumi.Input; + zonalShift?: pulumi.Input; zones?: pulumi.Input; } diff --git a/sdk/nodejs/resources/nodePolicyTarget.ts b/sdk/nodejs/resources/nodePolicyTarget.ts index 1ccac84..6381f9c 100644 --- a/sdk/nodejs/resources/nodePolicyTarget.ts +++ b/sdk/nodejs/resources/nodePolicyTarget.ts @@ -32,7 +32,7 @@ export class NodePolicyTarget extends pulumi.CustomResource { } /** - * Cluster IDs where this node policy applies. + * Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. */ declare public readonly clusterIds: pulumi.Output; /** diff --git a/sdk/nodejs/resources/workloadPolicy.ts b/sdk/nodejs/resources/workloadPolicy.ts index c85085f..1a3cf33 100644 --- a/sdk/nodejs/resources/workloadPolicy.ts +++ b/sdk/nodejs/resources/workloadPolicy.ts @@ -37,10 +37,15 @@ export class WorkloadPolicy extends pulumi.CustomResource { * When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. */ declare public readonly actionTriggers: pulumi.Output; + declare public readonly allowInPlaceMemoryLimitDecrease: pulumi.Output; /** * Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). */ declare public readonly cooldownMinutes: pulumi.Output; + declare public readonly cpuCeilingPercent: pulumi.Output; + declare public readonly cpuFloorPercent: pulumi.Output; + declare public readonly cpuLimitCeilingPercent: pulumi.Output; + declare public readonly cpuLimitFloorPercent: pulumi.Output; declare public readonly cpuVerticalScaling: pulumi.Output; /** * Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). @@ -62,6 +67,7 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. */ declare public readonly driftDeltaPercent: pulumi.Output; + declare public readonly enableInPlaceVerticalScaling: pulumi.Output; /** * Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. */ @@ -79,6 +85,15 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). */ declare public readonly hysteresisVsTarget: pulumi.Output; + declare public readonly jvmCpuStartupFloorMillicores: pulumi.Output; + declare public readonly jvmHeapHeadroomMultiplier: pulumi.Output; + declare public readonly jvmHeapOptimizationEnabled: pulumi.Output; + declare public readonly jvmHeapTargetPercentile: pulumi.Output; + declare public readonly jvmMaxHeapBytes: pulumi.Output; + declare public readonly jvmMinHeapBytes: pulumi.Output; + declare public readonly jvmNonHeapOverheadBytes: pulumi.Output; + declare public readonly jvmNonHeapOverheadPercent: pulumi.Output; + declare public readonly jvmPreferContainerSupport: pulumi.Output; /** * Allow live pod migration when applying recommendations without restart. Example: false. */ @@ -87,6 +102,10 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). */ declare public readonly loopbackPeriodSeconds: pulumi.Output; + declare public readonly memoryCeilingPercent: pulumi.Output; + declare public readonly memoryFloorPercent: pulumi.Output; + declare public readonly memoryLimitCeilingPercent: pulumi.Output; + declare public readonly memoryLimitFloorPercent: pulumi.Output; declare public readonly memoryVerticalScaling: pulumi.Output; /** * Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). @@ -104,6 +123,7 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Human-friendly name for the policy. Example: 'production-vpa-policy'. */ declare public readonly name: pulumi.Output; + declare public readonly pdbEnabled: pulumi.Output; /** * Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. */ @@ -136,50 +156,90 @@ export class WorkloadPolicy extends pulumi.CustomResource { throw new Error("Missing required property 'name'"); } resourceInputs["actionTriggers"] = args?.actionTriggers; + resourceInputs["allowInPlaceMemoryLimitDecrease"] = args?.allowInPlaceMemoryLimitDecrease; resourceInputs["cooldownMinutes"] = (args?.cooldownMinutes) ?? 300; + resourceInputs["cpuCeilingPercent"] = args?.cpuCeilingPercent; + resourceInputs["cpuFloorPercent"] = args?.cpuFloorPercent; + resourceInputs["cpuLimitCeilingPercent"] = args?.cpuLimitCeilingPercent; + resourceInputs["cpuLimitFloorPercent"] = args?.cpuLimitFloorPercent; resourceInputs["cpuVerticalScaling"] = args ? (args.cpuVerticalScaling ? pulumi.output(args.cpuVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["cronSchedule"] = args?.cronSchedule; resourceInputs["defragmentationSchedule"] = args?.defragmentationSchedule; resourceInputs["description"] = args?.description; resourceInputs["detectionTriggers"] = args?.detectionTriggers; resourceInputs["driftDeltaPercent"] = args?.driftDeltaPercent; + resourceInputs["enableInPlaceVerticalScaling"] = args?.enableInPlaceVerticalScaling; resourceInputs["enablePmaxProtection"] = args?.enablePmaxProtection; resourceInputs["gpuVerticalScaling"] = args ? (args.gpuVerticalScaling ? pulumi.output(args.gpuVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["gpuVramVerticalScaling"] = args ? (args.gpuVramVerticalScaling ? pulumi.output(args.gpuVramVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["horizontalScaling"] = args?.horizontalScaling; resourceInputs["hysteresisVsTarget"] = args?.hysteresisVsTarget; + resourceInputs["jvmCpuStartupFloorMillicores"] = args?.jvmCpuStartupFloorMillicores; + resourceInputs["jvmHeapHeadroomMultiplier"] = args?.jvmHeapHeadroomMultiplier; + resourceInputs["jvmHeapOptimizationEnabled"] = args?.jvmHeapOptimizationEnabled; + resourceInputs["jvmHeapTargetPercentile"] = args?.jvmHeapTargetPercentile; + resourceInputs["jvmMaxHeapBytes"] = args?.jvmMaxHeapBytes; + resourceInputs["jvmMinHeapBytes"] = args?.jvmMinHeapBytes; + resourceInputs["jvmNonHeapOverheadBytes"] = args?.jvmNonHeapOverheadBytes; + resourceInputs["jvmNonHeapOverheadPercent"] = args?.jvmNonHeapOverheadPercent; + resourceInputs["jvmPreferContainerSupport"] = args?.jvmPreferContainerSupport; resourceInputs["liveMigrationEnabled"] = args?.liveMigrationEnabled; resourceInputs["loopbackPeriodSeconds"] = (args?.loopbackPeriodSeconds) ?? 86400; + resourceInputs["memoryCeilingPercent"] = args?.memoryCeilingPercent; + resourceInputs["memoryFloorPercent"] = args?.memoryFloorPercent; + resourceInputs["memoryLimitCeilingPercent"] = args?.memoryLimitCeilingPercent; + resourceInputs["memoryLimitFloorPercent"] = args?.memoryLimitFloorPercent; resourceInputs["memoryVerticalScaling"] = args ? (args.memoryVerticalScaling ? pulumi.output(args.memoryVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["minChangePercent"] = (args?.minChangePercent) ?? 0.2; resourceInputs["minDataPoints"] = (args?.minDataPoints) ?? 15; resourceInputs["minVpaWindowDataPoints"] = (args?.minVpaWindowDataPoints) ?? 30; resourceInputs["name"] = args?.name; + resourceInputs["pdbEnabled"] = args?.pdbEnabled; resourceInputs["pmaxRatioThreshold"] = (args?.pmaxRatioThreshold) ?? 3; resourceInputs["schedulerPlugins"] = args?.schedulerPlugins; resourceInputs["stabilityCvMax"] = args?.stabilityCvMax; resourceInputs["startupPeriodSeconds"] = args?.startupPeriodSeconds; } else { resourceInputs["actionTriggers"] = undefined /*out*/; + resourceInputs["allowInPlaceMemoryLimitDecrease"] = undefined /*out*/; resourceInputs["cooldownMinutes"] = undefined /*out*/; + resourceInputs["cpuCeilingPercent"] = undefined /*out*/; + resourceInputs["cpuFloorPercent"] = undefined /*out*/; + resourceInputs["cpuLimitCeilingPercent"] = undefined /*out*/; + resourceInputs["cpuLimitFloorPercent"] = undefined /*out*/; resourceInputs["cpuVerticalScaling"] = undefined /*out*/; resourceInputs["cronSchedule"] = undefined /*out*/; resourceInputs["defragmentationSchedule"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["detectionTriggers"] = undefined /*out*/; resourceInputs["driftDeltaPercent"] = undefined /*out*/; + resourceInputs["enableInPlaceVerticalScaling"] = undefined /*out*/; resourceInputs["enablePmaxProtection"] = undefined /*out*/; resourceInputs["gpuVerticalScaling"] = undefined /*out*/; resourceInputs["gpuVramVerticalScaling"] = undefined /*out*/; resourceInputs["horizontalScaling"] = undefined /*out*/; resourceInputs["hysteresisVsTarget"] = undefined /*out*/; + resourceInputs["jvmCpuStartupFloorMillicores"] = undefined /*out*/; + resourceInputs["jvmHeapHeadroomMultiplier"] = undefined /*out*/; + resourceInputs["jvmHeapOptimizationEnabled"] = undefined /*out*/; + resourceInputs["jvmHeapTargetPercentile"] = undefined /*out*/; + resourceInputs["jvmMaxHeapBytes"] = undefined /*out*/; + resourceInputs["jvmMinHeapBytes"] = undefined /*out*/; + resourceInputs["jvmNonHeapOverheadBytes"] = undefined /*out*/; + resourceInputs["jvmNonHeapOverheadPercent"] = undefined /*out*/; + resourceInputs["jvmPreferContainerSupport"] = undefined /*out*/; resourceInputs["liveMigrationEnabled"] = undefined /*out*/; resourceInputs["loopbackPeriodSeconds"] = undefined /*out*/; + resourceInputs["memoryCeilingPercent"] = undefined /*out*/; + resourceInputs["memoryFloorPercent"] = undefined /*out*/; + resourceInputs["memoryLimitCeilingPercent"] = undefined /*out*/; + resourceInputs["memoryLimitFloorPercent"] = undefined /*out*/; resourceInputs["memoryVerticalScaling"] = undefined /*out*/; resourceInputs["minChangePercent"] = undefined /*out*/; resourceInputs["minDataPoints"] = undefined /*out*/; resourceInputs["minVpaWindowDataPoints"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; + resourceInputs["pdbEnabled"] = undefined /*out*/; resourceInputs["pmaxRatioThreshold"] = undefined /*out*/; resourceInputs["schedulerPlugins"] = undefined /*out*/; resourceInputs["stabilityCvMax"] = undefined /*out*/; @@ -198,10 +258,15 @@ export interface WorkloadPolicyArgs { * When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. */ actionTriggers?: pulumi.Input[]>; + allowInPlaceMemoryLimitDecrease?: pulumi.Input; /** * Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). */ cooldownMinutes?: pulumi.Input; + cpuCeilingPercent?: pulumi.Input; + cpuFloorPercent?: pulumi.Input; + cpuLimitCeilingPercent?: pulumi.Input; + cpuLimitFloorPercent?: pulumi.Input; cpuVerticalScaling?: pulumi.Input; /** * Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). @@ -223,6 +288,7 @@ export interface WorkloadPolicyArgs { * Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. */ driftDeltaPercent?: pulumi.Input; + enableInPlaceVerticalScaling?: pulumi.Input; /** * Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. */ @@ -240,6 +306,15 @@ export interface WorkloadPolicyArgs { * Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). */ hysteresisVsTarget?: pulumi.Input; + jvmCpuStartupFloorMillicores?: pulumi.Input; + jvmHeapHeadroomMultiplier?: pulumi.Input; + jvmHeapOptimizationEnabled?: pulumi.Input; + jvmHeapTargetPercentile?: pulumi.Input; + jvmMaxHeapBytes?: pulumi.Input; + jvmMinHeapBytes?: pulumi.Input; + jvmNonHeapOverheadBytes?: pulumi.Input; + jvmNonHeapOverheadPercent?: pulumi.Input; + jvmPreferContainerSupport?: pulumi.Input; /** * Allow live pod migration when applying recommendations without restart. Example: false. */ @@ -248,6 +323,10 @@ export interface WorkloadPolicyArgs { * Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). */ loopbackPeriodSeconds?: pulumi.Input; + memoryCeilingPercent?: pulumi.Input; + memoryFloorPercent?: pulumi.Input; + memoryLimitCeilingPercent?: pulumi.Input; + memoryLimitFloorPercent?: pulumi.Input; memoryVerticalScaling?: pulumi.Input; /** * Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). @@ -265,6 +344,7 @@ export interface WorkloadPolicyArgs { * Human-friendly name for the policy. Example: 'production-vpa-policy'. */ name: pulumi.Input; + pdbEnabled?: pulumi.Input; /** * Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. */ diff --git a/sdk/nodejs/resources/workloadPolicyTarget.ts b/sdk/nodejs/resources/workloadPolicyTarget.ts index 05433ca..a449863 100644 --- a/sdk/nodejs/resources/workloadPolicyTarget.ts +++ b/sdk/nodejs/resources/workloadPolicyTarget.ts @@ -33,6 +33,10 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { return obj['__pulumiType'] === WorkloadPolicyTarget.__pulumiType; } + /** + * Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + */ + declare public readonly annotationSelector: pulumi.Output; /** * Cluster IDs where this target applies. */ @@ -42,13 +46,17 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { */ declare public readonly description: pulumi.Output; /** - * Enable or disable this target. + * Enable or disable this target. Defaults to true. */ declare public readonly enabled: pulumi.Output; /** * Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod). */ declare public readonly kindFilter: pulumi.Output; + /** + * Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + */ + declare public readonly kindFilterNotIn: pulumi.Output; /** * Human-friendly name for this target. */ @@ -66,7 +74,9 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { */ declare public readonly namespaceSelector: pulumi.Output; /** - * Restrict matching to specific node groups by name. + * DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. + * + * @deprecated node_group_names is deprecated by the DevZero API and no longer evaluated. */ declare public readonly nodeGroupNames: pulumi.Output; /** @@ -81,6 +91,10 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { * Explicit list of workload names to include. */ declare public readonly workloadNames: pulumi.Output; + /** + * Explicit list of workload names to exclude. + */ + declare public readonly workloadNamesNotIn: pulumi.Output; /** * Select workloads by labels. */ @@ -106,10 +120,12 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { if (args?.policyId === undefined && !opts.urn) { throw new Error("Missing required property 'policyId'"); } + resourceInputs["annotationSelector"] = args?.annotationSelector; resourceInputs["clusterIds"] = args?.clusterIds; resourceInputs["description"] = args?.description; resourceInputs["enabled"] = args?.enabled; resourceInputs["kindFilter"] = args?.kindFilter; + resourceInputs["kindFilterNotIn"] = args?.kindFilterNotIn; resourceInputs["name"] = args?.name; resourceInputs["namePattern"] = args?.namePattern; resourceInputs["namespacePattern"] = args?.namespacePattern; @@ -118,12 +134,15 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { resourceInputs["policyId"] = args?.policyId; resourceInputs["priority"] = args?.priority; resourceInputs["workloadNames"] = args?.workloadNames; + resourceInputs["workloadNamesNotIn"] = args?.workloadNamesNotIn; resourceInputs["workloadSelector"] = args?.workloadSelector; } else { + resourceInputs["annotationSelector"] = undefined /*out*/; resourceInputs["clusterIds"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["enabled"] = undefined /*out*/; resourceInputs["kindFilter"] = undefined /*out*/; + resourceInputs["kindFilterNotIn"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["namePattern"] = undefined /*out*/; resourceInputs["namespacePattern"] = undefined /*out*/; @@ -132,6 +151,7 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { resourceInputs["policyId"] = undefined /*out*/; resourceInputs["priority"] = undefined /*out*/; resourceInputs["workloadNames"] = undefined /*out*/; + resourceInputs["workloadNamesNotIn"] = undefined /*out*/; resourceInputs["workloadSelector"] = undefined /*out*/; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); @@ -143,10 +163,12 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { * The set of arguments for constructing a WorkloadPolicyTarget resource. */ export interface WorkloadPolicyTargetArgs { + annotationSelector?: pulumi.Input; clusterIds: pulumi.Input[]>; description?: pulumi.Input; enabled?: pulumi.Input; kindFilter?: pulumi.Input[]>; + kindFilterNotIn?: pulumi.Input[]>; name: pulumi.Input; namePattern?: pulumi.Input; namespacePattern?: pulumi.Input; @@ -155,5 +177,6 @@ export interface WorkloadPolicyTargetArgs { policyId: pulumi.Input; priority?: pulumi.Input; workloadNames?: pulumi.Input[]>; + workloadNamesNotIn?: pulumi.Input[]>; workloadSelector?: pulumi.Input; } diff --git a/sdk/nodejs/resources/workloadRule.ts b/sdk/nodejs/resources/workloadRule.ts index 778eee9..36f13a6 100644 --- a/sdk/nodejs/resources/workloadRule.ts +++ b/sdk/nodejs/resources/workloadRule.ts @@ -69,6 +69,7 @@ export class WorkloadRule extends pulumi.CustomResource { * Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. */ declare public readonly detectionTriggers: pulumi.Output; + declare public readonly disabled: pulumi.Output; /** * Emergency response configuration for OOM and CPU throttle events. */ @@ -89,6 +90,7 @@ export class WorkloadRule extends pulumi.CustomResource { * Allow live pod migration when applying recommendations. Example: false. */ declare public readonly liveMigrationEnabled: pulumi.Output; + declare public readonly lookbackPeriodSeconds: pulumi.Output; /** * Memory vertical scaling rule configuration. */ @@ -146,11 +148,13 @@ export class WorkloadRule extends pulumi.CustomResource { resourceInputs["cronSchedule"] = args?.cronSchedule; resourceInputs["defragmentationSchedule"] = args?.defragmentationSchedule; resourceInputs["detectionTriggers"] = args?.detectionTriggers; + resourceInputs["disabled"] = args?.disabled; resourceInputs["emergencyResponse"] = args?.emergencyResponse; resourceInputs["gpuRule"] = args?.gpuRule; resourceInputs["hpaRule"] = args?.hpaRule; resourceInputs["kind"] = args?.kind; resourceInputs["liveMigrationEnabled"] = args?.liveMigrationEnabled; + resourceInputs["lookbackPeriodSeconds"] = args?.lookbackPeriodSeconds; resourceInputs["memoryRule"] = args?.memoryRule; resourceInputs["name"] = args?.name; resourceInputs["namespace"] = args?.namespace; @@ -167,11 +171,13 @@ export class WorkloadRule extends pulumi.CustomResource { resourceInputs["cronSchedule"] = undefined /*out*/; resourceInputs["defragmentationSchedule"] = undefined /*out*/; resourceInputs["detectionTriggers"] = undefined /*out*/; + resourceInputs["disabled"] = undefined /*out*/; resourceInputs["emergencyResponse"] = undefined /*out*/; resourceInputs["gpuRule"] = undefined /*out*/; resourceInputs["hpaRule"] = undefined /*out*/; resourceInputs["kind"] = undefined /*out*/; resourceInputs["liveMigrationEnabled"] = undefined /*out*/; + resourceInputs["lookbackPeriodSeconds"] = undefined /*out*/; resourceInputs["memoryRule"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["namespace"] = undefined /*out*/; @@ -224,6 +230,7 @@ export interface WorkloadRuleArgs { * Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. */ detectionTriggers?: pulumi.Input[]>; + disabled?: pulumi.Input; /** * Emergency response configuration for OOM and CPU throttle events. */ @@ -244,6 +251,7 @@ export interface WorkloadRuleArgs { * Allow live pod migration when applying recommendations. Example: false. */ liveMigrationEnabled?: pulumi.Input; + lookbackPeriodSeconds?: pulumi.Input; /** * Memory vertical scaling rule configuration. */ diff --git a/sdk/nodejs/types/input.ts b/sdk/nodejs/types/input.ts index 33c640c..b539699 100644 --- a/sdk/nodejs/types/input.ts +++ b/sdk/nodejs/types/input.ts @@ -154,6 +154,7 @@ export namespace resources { * Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. */ imageFamily?: pulumi.Input; + imageVersion?: pulumi.Input; /** * Kubelet configuration overrides for Azure nodes. */ @@ -368,6 +369,7 @@ export namespace resources { } export interface HPAMetricTriggerArgsArgs { + connectorId?: pulumi.Input; /** * Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. */ @@ -424,29 +426,17 @@ export namespace resources { */ maxReplicas?: pulumi.Input; /** - * Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + * HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. */ metrics?: pulumi.Input[]>; /** * Minimum number of replicas. Example: 2. */ minReplicas?: pulumi.Input; - /** - * Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - */ - primaryMetric?: pulumi.Input; /** * Seconds to wait between scale-down events. Example: 300. */ scaleDownCooldownSeconds?: pulumi.Input; - /** - * Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - */ - targetMemoryUtilization?: pulumi.Input; - /** - * Target CPU utilization ratio (0-1). Example: 0.7. - */ - targetUtilization?: pulumi.Input; } export interface HPAScalingPolicyArgsArgs { @@ -480,6 +470,7 @@ export namespace resources { } export interface HorizontalScalingArgsArgs { + compositeFormula?: pulumi.Input; /** * Enable horizontal (replica) scaling. Example: true. */ @@ -500,10 +491,13 @@ export namespace resources { * Minimum number of replicas to maintain. Example: 2. */ minReplicas?: pulumi.Input; + networkTargetThroughputBytesPerSec?: pulumi.Input; /** * Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. */ primaryMetric?: pulumi.Input; + scaleDownCooldownSeconds?: pulumi.Input; + targetMemoryUtilization?: pulumi.Input; /** * Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. */ @@ -640,14 +634,21 @@ export namespace resources { } export interface ResourceRuleConfigArgsArgs { + ceilingPercent?: pulumi.Input; /** * Enable this resource axis rule. Example: true. */ enabled?: pulumi.Input; + floorPercent?: pulumi.Input; + initialLimit?: pulumi.Input; + initialRequest?: pulumi.Input; + limitCeilingPercent?: pulumi.Input; + limitFloorPercent?: pulumi.Input; /** * Multiplier applied to the request to derive the resource limit. Example: 1.5. */ limitMultiplier?: pulumi.Input; + limitUseRss?: pulumi.Input; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -672,6 +673,7 @@ export namespace resources { * Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. */ minRequest?: pulumi.Input; + requestUseRss?: pulumi.Input; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95. */ @@ -732,6 +734,7 @@ export namespace resources { * Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. */ limitMultiplier?: pulumi.Input; + limitUseRss?: pulumi.Input; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -764,6 +767,7 @@ export namespace resources { * Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. */ overheadMultiplier?: pulumi.Input; + requestUseRss?: pulumi.Input; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. */ @@ -780,4 +784,10 @@ export namespace resources { minDataPoints: (val.minDataPoints) ?? 20, }; } + + export interface ZonalShiftConfigArgsArgs { + allowZoneFallback?: pulumi.Input; + evictImpactedNodes?: pulumi.Input; + respectZonalShift?: pulumi.Input; + } } diff --git a/sdk/nodejs/types/output.ts b/sdk/nodejs/types/output.ts index 7ace181..b9cf08b 100644 --- a/sdk/nodejs/types/output.ts +++ b/sdk/nodejs/types/output.ts @@ -154,6 +154,7 @@ export namespace resources { * Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. */ imageFamily?: string; + imageVersion?: string; /** * Kubelet configuration overrides for Azure nodes. */ @@ -368,6 +369,7 @@ export namespace resources { } export interface HPAMetricTriggerArgs { + connectorId?: string; /** * Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. */ @@ -424,29 +426,17 @@ export namespace resources { */ maxReplicas?: number; /** - * Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + * HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. */ metrics?: outputs.resources.HPAMetricTriggerArgs[]; /** * Minimum number of replicas. Example: 2. */ minReplicas?: number; - /** - * Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - */ - primaryMetric?: string; /** * Seconds to wait between scale-down events. Example: 300. */ scaleDownCooldownSeconds?: number; - /** - * Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - */ - targetMemoryUtilization?: number; - /** - * Target CPU utilization ratio (0-1). Example: 0.7. - */ - targetUtilization?: number; } export interface HPAScalingPolicyArgs { @@ -480,6 +470,7 @@ export namespace resources { } export interface HorizontalScalingArgs { + compositeFormula?: string; /** * Enable horizontal (replica) scaling. Example: true. */ @@ -500,10 +491,13 @@ export namespace resources { * Minimum number of replicas to maintain. Example: 2. */ minReplicas?: number; + networkTargetThroughputBytesPerSec?: number; /** * Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. */ primaryMetric?: string; + scaleDownCooldownSeconds?: number; + targetMemoryUtilization?: number; /** * Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. */ @@ -640,14 +634,21 @@ export namespace resources { } export interface ResourceRuleConfigArgs { + ceilingPercent?: number; /** * Enable this resource axis rule. Example: true. */ enabled?: boolean; + floorPercent?: number; + initialLimit?: number; + initialRequest?: number; + limitCeilingPercent?: number; + limitFloorPercent?: number; /** * Multiplier applied to the request to derive the resource limit. Example: 1.5. */ limitMultiplier?: number; + limitUseRss?: boolean; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -672,6 +673,7 @@ export namespace resources { * Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. */ minRequest?: number; + requestUseRss?: boolean; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95. */ @@ -732,6 +734,7 @@ export namespace resources { * Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. */ limitMultiplier?: number; + limitUseRss?: boolean; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -764,6 +767,7 @@ export namespace resources { * Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. */ overheadMultiplier?: number; + requestUseRss?: boolean; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. */ @@ -781,4 +785,10 @@ export namespace resources { }; } + export interface ZonalShiftConfigArgs { + allowZoneFallback?: boolean; + evictImpactedNodes?: boolean; + respectZonalShift?: boolean; + } + } diff --git a/sdk/python/pulumi_devzero/resources/_inputs.py b/sdk/python/pulumi_devzero/resources/_inputs.py index 99073b9..4dc3c12 100644 --- a/sdk/python/pulumi_devzero/resources/_inputs.py +++ b/sdk/python/pulumi_devzero/resources/_inputs.py @@ -75,6 +75,8 @@ 'TaintArgsArgsDict', 'VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict', + 'ZonalShiftConfigArgsArgs', + 'ZonalShiftConfigArgsArgsDict', ] class AMISelectorTermArgsArgsDict(TypedDict): @@ -753,6 +755,7 @@ class AzureNodeClassSpecArgsArgsDict(TypedDict): """ Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. """ + image_version: NotRequired[pulumi.Input[_builtins.str]] kubelet: NotRequired[pulumi.Input['AzureKubeletConfigurationArgsArgsDict']] """ Kubelet configuration overrides for Azure nodes. @@ -779,6 +782,7 @@ class AzureNodeClassSpecArgsArgs: def __init__(__self__, *, fips_mode: Optional[pulumi.Input[_builtins.str]] = None, image_family: Optional[pulumi.Input[_builtins.str]] = None, + image_version: Optional[pulumi.Input[_builtins.str]] = None, kubelet: Optional[pulumi.Input['AzureKubeletConfigurationArgsArgs']] = None, max_pods: Optional[pulumi.Input[_builtins.int]] = None, os_disk_size_gb: Optional[pulumi.Input[_builtins.int]] = None, @@ -797,6 +801,8 @@ def __init__(__self__, *, pulumi.set(__self__, "fips_mode", fips_mode) if image_family is not None: pulumi.set(__self__, "image_family", image_family) + if image_version is not None: + pulumi.set(__self__, "image_version", image_version) if kubelet is not None: pulumi.set(__self__, "kubelet", kubelet) if max_pods is not None: @@ -832,6 +838,15 @@ def image_family(self) -> Optional[pulumi.Input[_builtins.str]]: def image_family(self, value: Optional[pulumi.Input[_builtins.str]]): pulumi.set(self, "image_family", value) + @_builtins.property + @pulumi.getter(name="imageVersion") + def image_version(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "image_version") + + @image_version.setter + def image_version(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "image_version", value) + @_builtins.property @pulumi.getter def kubelet(self) -> Optional[pulumi.Input['AzureKubeletConfigurationArgsArgs']]: @@ -1797,6 +1812,7 @@ class HPAMetricTriggerArgsArgsDict(TypedDict): """ Metric source type. Built-in: 'CPU', 'Memory', 'NetworkIngress', 'NetworkEgress'. External: 'prometheus'. Example: 'prometheus'. """ + connector_id: NotRequired[pulumi.Input[_builtins.str]] metadata: NotRequired[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] """ Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. @@ -1826,6 +1842,7 @@ class HPAMetricTriggerArgsArgsDict(TypedDict): class HPAMetricTriggerArgsArgs: def __init__(__self__, *, type: pulumi.Input[_builtins.str], + connector_id: Optional[pulumi.Input[_builtins.str]] = None, metadata: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, query: Optional[pulumi.Input[_builtins.str]] = None, server_address: Optional[pulumi.Input[_builtins.str]] = None, @@ -1842,6 +1859,8 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.str] weight: Weight for composite formula scaling (0-1 decimal string). Example: '0.5'. """ pulumi.set(__self__, "type", type) + if connector_id is not None: + pulumi.set(__self__, "connector_id", connector_id) if metadata is not None: pulumi.set(__self__, "metadata", metadata) if query is not None: @@ -1867,6 +1886,15 @@ def type(self) -> pulumi.Input[_builtins.str]: def type(self, value: pulumi.Input[_builtins.str]): pulumi.set(self, "type", value) + @_builtins.property + @pulumi.getter(name="connectorId") + def connector_id(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "connector_id") + + @connector_id.setter + def connector_id(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "connector_id", value) + @_builtins.property @pulumi.getter def metadata(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]: @@ -1967,28 +1995,16 @@ class HPARuleConfigArgsArgsDict(TypedDict): """ metrics: NotRequired[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgsDict']]]] """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ min_replicas: NotRequired[pulumi.Input[_builtins.int]] """ Minimum number of replicas. Example: 2. """ - primary_metric: NotRequired[pulumi.Input[_builtins.str]] - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ scale_down_cooldown_seconds: NotRequired[pulumi.Input[_builtins.int]] """ Seconds to wait between scale-down events. Example: 300. """ - target_memory_utilization: NotRequired[pulumi.Input[_builtins.float]] - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - target_utilization: NotRequired[pulumi.Input[_builtins.float]] - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ @pulumi.input_type class HPARuleConfigArgsArgs: @@ -2001,10 +2017,7 @@ def __init__(__self__, *, max_replicas: Optional[pulumi.Input[_builtins.int]] = None, metrics: Optional[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]]] = None, min_replicas: Optional[pulumi.Input[_builtins.int]] = None, - primary_metric: Optional[pulumi.Input[_builtins.str]] = None, - scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None, - target_memory_utilization: Optional[pulumi.Input[_builtins.float]] = None, - target_utilization: Optional[pulumi.Input[_builtins.float]] = None): + scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None): """ :param pulumi.Input['HPABehaviorArgsArgs'] behavior: Fine-grained scale-up and scale-down behavior policies. :param pulumi.Input[_builtins.str] composite_formula: Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'. @@ -2012,12 +2025,9 @@ def __init__(__self__, *, :param pulumi.Input['HPAFallbackArgsArgs'] fallback: Replica fallback configuration when metrics are unavailable. :param pulumi.Input[_builtins.float] max_replica_change_percent: Maximum percentage change in replica count per cycle. Example: 50.0. :param pulumi.Input[_builtins.int] max_replicas: Maximum number of replicas. Example: 10. - :param pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]] metrics: Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + :param pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]] metrics: HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. :param pulumi.Input[_builtins.int] min_replicas: Minimum number of replicas. Example: 2. - :param pulumi.Input[_builtins.str] primary_metric: Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param pulumi.Input[_builtins.int] scale_down_cooldown_seconds: Seconds to wait between scale-down events. Example: 300. - :param pulumi.Input[_builtins.float] target_memory_utilization: Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - :param pulumi.Input[_builtins.float] target_utilization: Target CPU utilization ratio (0-1). Example: 0.7. """ if behavior is not None: pulumi.set(__self__, "behavior", behavior) @@ -2035,14 +2045,8 @@ def __init__(__self__, *, pulumi.set(__self__, "metrics", metrics) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) - if primary_metric is not None: - pulumi.set(__self__, "primary_metric", primary_metric) if scale_down_cooldown_seconds is not None: pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) - if target_memory_utilization is not None: - pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) - if target_utilization is not None: - pulumi.set(__self__, "target_utilization", target_utilization) @_builtins.property @pulumi.getter @@ -2120,7 +2124,7 @@ def max_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): @pulumi.getter def metrics(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]]]: """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ return pulumi.get(self, "metrics") @@ -2140,18 +2144,6 @@ def min_replicas(self) -> Optional[pulumi.Input[_builtins.int]]: def min_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_replicas", value) - @_builtins.property - @pulumi.getter(name="primaryMetric") - def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ - return pulumi.get(self, "primary_metric") - - @primary_metric.setter - def primary_metric(self, value: Optional[pulumi.Input[_builtins.str]]): - pulumi.set(self, "primary_metric", value) - @_builtins.property @pulumi.getter(name="scaleDownCooldownSeconds") def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: @@ -2164,30 +2156,6 @@ def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: def scale_down_cooldown_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "scale_down_cooldown_seconds", value) - @_builtins.property - @pulumi.getter(name="targetMemoryUtilization") - def target_memory_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - return pulumi.get(self, "target_memory_utilization") - - @target_memory_utilization.setter - def target_memory_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): - pulumi.set(self, "target_memory_utilization", value) - - @_builtins.property - @pulumi.getter(name="targetUtilization") - def target_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ - return pulumi.get(self, "target_utilization") - - @target_utilization.setter - def target_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): - pulumi.set(self, "target_utilization", value) - class HPAScalingPolicyArgsArgsDict(TypedDict): period_seconds: pulumi.Input[_builtins.int] @@ -2325,6 +2293,7 @@ def stabilization_window_seconds(self, value: Optional[pulumi.Input[_builtins.in class HorizontalScalingArgsArgsDict(TypedDict): + composite_formula: NotRequired[pulumi.Input[_builtins.str]] enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Enable horizontal (replica) scaling. Example: true. @@ -2345,10 +2314,13 @@ class HorizontalScalingArgsArgsDict(TypedDict): """ Minimum number of replicas to maintain. Example: 2. """ + network_target_throughput_bytes_per_sec: NotRequired[pulumi.Input[_builtins.int]] primary_metric: NotRequired[pulumi.Input[_builtins.str]] """ Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. """ + scale_down_cooldown_seconds: NotRequired[pulumi.Input[_builtins.int]] + target_memory_utilization: NotRequired[pulumi.Input[_builtins.float]] target_utilization: NotRequired[pulumi.Input[_builtins.float]] """ Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. @@ -2357,12 +2329,16 @@ class HorizontalScalingArgsArgsDict(TypedDict): @pulumi.input_type class HorizontalScalingArgsArgs: def __init__(__self__, *, + composite_formula: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_replica_change_percent: Optional[pulumi.Input[_builtins.float]] = None, max_replicas: Optional[pulumi.Input[_builtins.int]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_replicas: Optional[pulumi.Input[_builtins.int]] = None, + network_target_throughput_bytes_per_sec: Optional[pulumi.Input[_builtins.int]] = None, primary_metric: Optional[pulumi.Input[_builtins.str]] = None, + scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None, + target_memory_utilization: Optional[pulumi.Input[_builtins.float]] = None, target_utilization: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] enabled: Enable horizontal (replica) scaling. Example: true. @@ -2373,6 +2349,8 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.str] primary_metric: Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param pulumi.Input[_builtins.float] target_utilization: Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. """ + if composite_formula is not None: + pulumi.set(__self__, "composite_formula", composite_formula) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if max_replica_change_percent is not None: @@ -2383,11 +2361,26 @@ def __init__(__self__, *, pulumi.set(__self__, "min_data_points", min_data_points) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) + if network_target_throughput_bytes_per_sec is not None: + pulumi.set(__self__, "network_target_throughput_bytes_per_sec", network_target_throughput_bytes_per_sec) if primary_metric is not None: pulumi.set(__self__, "primary_metric", primary_metric) + if scale_down_cooldown_seconds is not None: + pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) + if target_memory_utilization is not None: + pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) if target_utilization is not None: pulumi.set(__self__, "target_utilization", target_utilization) + @_builtins.property + @pulumi.getter(name="compositeFormula") + def composite_formula(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "composite_formula") + + @composite_formula.setter + def composite_formula(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "composite_formula", value) + @_builtins.property @pulumi.getter def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -2448,6 +2441,15 @@ def min_replicas(self) -> Optional[pulumi.Input[_builtins.int]]: def min_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_replicas", value) + @_builtins.property + @pulumi.getter(name="networkTargetThroughputBytesPerSec") + def network_target_throughput_bytes_per_sec(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "network_target_throughput_bytes_per_sec") + + @network_target_throughput_bytes_per_sec.setter + def network_target_throughput_bytes_per_sec(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "network_target_throughput_bytes_per_sec", value) + @_builtins.property @pulumi.getter(name="primaryMetric") def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -2460,6 +2462,24 @@ def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: def primary_metric(self, value: Optional[pulumi.Input[_builtins.str]]): pulumi.set(self, "primary_metric", value) + @_builtins.property + @pulumi.getter(name="scaleDownCooldownSeconds") + def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "scale_down_cooldown_seconds") + + @scale_down_cooldown_seconds.setter + def scale_down_cooldown_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "scale_down_cooldown_seconds", value) + + @_builtins.property + @pulumi.getter(name="targetMemoryUtilization") + def target_memory_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "target_memory_utilization") + + @target_memory_utilization.setter + def target_memory_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "target_memory_utilization", value) + @_builtins.property @pulumi.getter(name="targetUtilization") def target_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3077,14 +3097,21 @@ def memory(self, value: Optional[pulumi.Input[_builtins.str]]): class ResourceRuleConfigArgsArgsDict(TypedDict): + ceiling_percent: NotRequired[pulumi.Input[_builtins.int]] enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Enable this resource axis rule. Example: true. """ + floor_percent: NotRequired[pulumi.Input[_builtins.int]] + initial_limit: NotRequired[pulumi.Input[_builtins.int]] + initial_request: NotRequired[pulumi.Input[_builtins.int]] + limit_ceiling_percent: NotRequired[pulumi.Input[_builtins.int]] + limit_floor_percent: NotRequired[pulumi.Input[_builtins.int]] limit_multiplier: NotRequired[pulumi.Input[_builtins.float]] """ Multiplier applied to the request to derive the resource limit. Example: 1.5. """ + limit_use_rss: NotRequired[pulumi.Input[_builtins.bool]] limits_adjustment_enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Whether to also adjust resource limits alongside requests. Example: true. @@ -3109,6 +3136,7 @@ class ResourceRuleConfigArgsArgsDict(TypedDict): """ Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. """ + request_use_rss: NotRequired[pulumi.Input[_builtins.bool]] target_percentile: NotRequired[pulumi.Input[_builtins.float]] """ Percentile of usage data used as the recommendation target (0-1). Example: 0.95. @@ -3117,14 +3145,22 @@ class ResourceRuleConfigArgsArgsDict(TypedDict): @pulumi.input_type class ResourceRuleConfigArgsArgs: def __init__(__self__, *, + ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, + floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + initial_limit: Optional[pulumi.Input[_builtins.int]] = None, + initial_request: Optional[pulumi.Input[_builtins.int]] = None, + limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, limit_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + limit_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, limits_adjustment_enabled: Optional[pulumi.Input[_builtins.bool]] = None, limits_removal_enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_request: Optional[pulumi.Input[_builtins.int]] = None, max_scale_down_percent: Optional[pulumi.Input[_builtins.float]] = None, max_scale_up_percent: Optional[pulumi.Input[_builtins.float]] = None, min_request: Optional[pulumi.Input[_builtins.int]] = None, + request_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, target_percentile: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] enabled: Enable this resource axis rule. Example: true. @@ -3137,10 +3173,24 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.int] min_request: Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. :param pulumi.Input[_builtins.float] target_percentile: Percentile of usage data used as the recommendation target (0-1). Example: 0.95. """ + if ceiling_percent is not None: + pulumi.set(__self__, "ceiling_percent", ceiling_percent) if enabled is not None: pulumi.set(__self__, "enabled", enabled) + if floor_percent is not None: + pulumi.set(__self__, "floor_percent", floor_percent) + if initial_limit is not None: + pulumi.set(__self__, "initial_limit", initial_limit) + if initial_request is not None: + pulumi.set(__self__, "initial_request", initial_request) + if limit_ceiling_percent is not None: + pulumi.set(__self__, "limit_ceiling_percent", limit_ceiling_percent) + if limit_floor_percent is not None: + pulumi.set(__self__, "limit_floor_percent", limit_floor_percent) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -3153,9 +3203,20 @@ def __init__(__self__, *, pulumi.set(__self__, "max_scale_up_percent", max_scale_up_percent) if min_request is not None: pulumi.set(__self__, "min_request", min_request) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) + @_builtins.property + @pulumi.getter(name="ceilingPercent") + def ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "ceiling_percent") + + @ceiling_percent.setter + def ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "ceiling_percent", value) + @_builtins.property @pulumi.getter def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3168,6 +3229,51 @@ def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: def enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): pulumi.set(self, "enabled", value) + @_builtins.property + @pulumi.getter(name="floorPercent") + def floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "floor_percent") + + @floor_percent.setter + def floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "floor_percent", value) + + @_builtins.property + @pulumi.getter(name="initialLimit") + def initial_limit(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "initial_limit") + + @initial_limit.setter + def initial_limit(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "initial_limit", value) + + @_builtins.property + @pulumi.getter(name="initialRequest") + def initial_request(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "initial_request") + + @initial_request.setter + def initial_request(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "initial_request", value) + + @_builtins.property + @pulumi.getter(name="limitCeilingPercent") + def limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "limit_ceiling_percent") + + @limit_ceiling_percent.setter + def limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="limitFloorPercent") + def limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "limit_floor_percent") + + @limit_floor_percent.setter + def limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="limitMultiplier") def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3180,6 +3286,15 @@ def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def limit_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "limit_multiplier", value) + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "limit_use_rss") + + @limit_use_rss.setter + def limit_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "limit_use_rss", value) + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3252,6 +3367,15 @@ def min_request(self) -> Optional[pulumi.Input[_builtins.int]]: def min_request(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_request", value) + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "request_use_rss") + + @request_use_rss.setter + def request_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "request_use_rss", value) + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3463,6 +3587,7 @@ class VerticalScalingArgsArgsDict(TypedDict): """ Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. """ + limit_use_rss: NotRequired[pulumi.Input[_builtins.bool]] limits_adjustment_enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Whether to also adjust resource limits alongside requests. Example: true. @@ -3495,6 +3620,7 @@ class VerticalScalingArgsArgsDict(TypedDict): """ Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. """ + request_use_rss: NotRequired[pulumi.Input[_builtins.bool]] target_percentile: NotRequired[pulumi.Input[_builtins.float]] """ Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. @@ -3506,6 +3632,7 @@ def __init__(__self__, *, adjust_req_even_if_not_set: Optional[pulumi.Input[_builtins.bool]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, limit_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + limit_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, limits_adjustment_enabled: Optional[pulumi.Input[_builtins.bool]] = None, limits_removal_enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_request: Optional[pulumi.Input[_builtins.int]] = None, @@ -3514,6 +3641,7 @@ def __init__(__self__, *, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_request: Optional[pulumi.Input[_builtins.int]] = None, overhead_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + request_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, target_percentile: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] adjust_req_even_if_not_set: Recommend requests even when the workload has no existing requests set. Default: false. @@ -3535,6 +3663,8 @@ def __init__(__self__, *, pulumi.set(__self__, "enabled", enabled) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -3557,6 +3687,8 @@ def __init__(__self__, *, pulumi.set(__self__, "min_request", min_request) if overhead_multiplier is not None: pulumi.set(__self__, "overhead_multiplier", overhead_multiplier) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) @@ -3596,6 +3728,15 @@ def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def limit_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "limit_multiplier", value) + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "limit_use_rss") + + @limit_use_rss.setter + def limit_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "limit_use_rss", value) + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3692,6 +3833,15 @@ def overhead_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def overhead_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "overhead_multiplier", value) + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "request_use_rss") + + @request_use_rss.setter + def request_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "request_use_rss", value) + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3705,3 +3855,49 @@ def target_percentile(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "target_percentile", value) +class ZonalShiftConfigArgsArgsDict(TypedDict): + allow_zone_fallback: NotRequired[pulumi.Input[_builtins.bool]] + evict_impacted_nodes: NotRequired[pulumi.Input[_builtins.bool]] + respect_zonal_shift: NotRequired[pulumi.Input[_builtins.bool]] + +@pulumi.input_type +class ZonalShiftConfigArgsArgs: + def __init__(__self__, *, + allow_zone_fallback: Optional[pulumi.Input[_builtins.bool]] = None, + evict_impacted_nodes: Optional[pulumi.Input[_builtins.bool]] = None, + respect_zonal_shift: Optional[pulumi.Input[_builtins.bool]] = None): + if allow_zone_fallback is not None: + pulumi.set(__self__, "allow_zone_fallback", allow_zone_fallback) + if evict_impacted_nodes is not None: + pulumi.set(__self__, "evict_impacted_nodes", evict_impacted_nodes) + if respect_zonal_shift is not None: + pulumi.set(__self__, "respect_zonal_shift", respect_zonal_shift) + + @_builtins.property + @pulumi.getter(name="allowZoneFallback") + def allow_zone_fallback(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "allow_zone_fallback") + + @allow_zone_fallback.setter + def allow_zone_fallback(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "allow_zone_fallback", value) + + @_builtins.property + @pulumi.getter(name="evictImpactedNodes") + def evict_impacted_nodes(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "evict_impacted_nodes") + + @evict_impacted_nodes.setter + def evict_impacted_nodes(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "evict_impacted_nodes", value) + + @_builtins.property + @pulumi.getter(name="respectZonalShift") + def respect_zonal_shift(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "respect_zonal_shift") + + @respect_zonal_shift.setter + def respect_zonal_shift(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "respect_zonal_shift", value) + + diff --git a/sdk/python/pulumi_devzero/resources/node_policy.py b/sdk/python/pulumi_devzero/resources/node_policy.py index b99148f..ca6d5a0 100644 --- a/sdk/python/pulumi_devzero/resources/node_policy.py +++ b/sdk/python/pulumi_devzero/resources/node_policy.py @@ -26,6 +26,7 @@ def __init__(__self__, *, aws: Optional[pulumi.Input['AWSNodeClassSpecArgsArgs']] = None, azure: Optional[pulumi.Input['AzureNodeClassSpecArgsArgs']] = None, capacity_types: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input['DisruptionPolicyArgsArgs']] = None, instance_categories: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, @@ -33,16 +34,20 @@ def __init__(__self__, *, instance_families: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_generations: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_hypervisors: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, + instance_local_nvme: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_sizes: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_types: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input['ResourceLimitsArgsArgs']] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecArgsArgs']]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input['ZonalShiftConfigArgsArgs']] = None, zones: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None): """ The set of arguments for constructing a NodePolicy resource. @@ -56,6 +61,8 @@ def __init__(__self__, *, pulumi.set(__self__, "azure", azure) if capacity_types is not None: pulumi.set(__self__, "capacity_types", capacity_types) + if cloud_provider_id is not None: + pulumi.set(__self__, "cloud_provider_id", cloud_provider_id) if description is not None: pulumi.set(__self__, "description", description) if disruption is not None: @@ -70,6 +77,8 @@ def __init__(__self__, *, pulumi.set(__self__, "instance_generations", instance_generations) if instance_hypervisors is not None: pulumi.set(__self__, "instance_hypervisors", instance_hypervisors) + if instance_local_nvme is not None: + pulumi.set(__self__, "instance_local_nvme", instance_local_nvme) if instance_sizes is not None: pulumi.set(__self__, "instance_sizes", instance_sizes) if instance_types is not None: @@ -78,6 +87,8 @@ def __init__(__self__, *, pulumi.set(__self__, "labels", labels) if limits is not None: pulumi.set(__self__, "limits", limits) + if master_override_role_name is not None: + pulumi.set(__self__, "master_override_role_name", master_override_role_name) if node_class_name is not None: pulumi.set(__self__, "node_class_name", node_class_name) if node_pool_name is not None: @@ -86,10 +97,14 @@ def __init__(__self__, *, pulumi.set(__self__, "operating_systems", operating_systems) if raw is not None: pulumi.set(__self__, "raw", raw) + if startup_taints is not None: + pulumi.set(__self__, "startup_taints", startup_taints) if taints is not None: pulumi.set(__self__, "taints", taints) if weight is not None: pulumi.set(__self__, "weight", weight) + if zonal_shift is not None: + pulumi.set(__self__, "zonal_shift", zonal_shift) if zones is not None: pulumi.set(__self__, "zones", zones) @@ -138,6 +153,15 @@ def capacity_types(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: def capacity_types(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): pulumi.set(self, "capacity_types", value) + @_builtins.property + @pulumi.getter(name="cloudProviderId") + def cloud_provider_id(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cloud_provider_id") + + @cloud_provider_id.setter + def cloud_provider_id(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cloud_provider_id", value) + @_builtins.property @pulumi.getter def description(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -201,6 +225,15 @@ def instance_hypervisors(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs'] def instance_hypervisors(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): pulumi.set(self, "instance_hypervisors", value) + @_builtins.property + @pulumi.getter(name="instanceLocalNvme") + def instance_local_nvme(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: + return pulumi.get(self, "instance_local_nvme") + + @instance_local_nvme.setter + def instance_local_nvme(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): + pulumi.set(self, "instance_local_nvme", value) + @_builtins.property @pulumi.getter(name="instanceSizes") def instance_sizes(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -237,6 +270,15 @@ def limits(self) -> Optional[pulumi.Input['ResourceLimitsArgsArgs']]: def limits(self, value: Optional[pulumi.Input['ResourceLimitsArgsArgs']]): pulumi.set(self, "limits", value) + @_builtins.property + @pulumi.getter(name="masterOverrideRoleName") + def master_override_role_name(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "master_override_role_name") + + @master_override_role_name.setter + def master_override_role_name(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "master_override_role_name", value) + @_builtins.property @pulumi.getter(name="nodeClassName") def node_class_name(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -273,6 +315,15 @@ def raw(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecAr def raw(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecArgsArgs']]]]): pulumi.set(self, "raw", value) + @_builtins.property + @pulumi.getter(name="startupTaints") + def startup_taints(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]: + return pulumi.get(self, "startup_taints") + + @startup_taints.setter + def startup_taints(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]): + pulumi.set(self, "startup_taints", value) + @_builtins.property @pulumi.getter def taints(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]: @@ -291,6 +342,15 @@ def weight(self) -> Optional[pulumi.Input[_builtins.int]]: def weight(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "weight", value) + @_builtins.property + @pulumi.getter(name="zonalShift") + def zonal_shift(self) -> Optional[pulumi.Input['ZonalShiftConfigArgsArgs']]: + return pulumi.get(self, "zonal_shift") + + @zonal_shift.setter + def zonal_shift(self, value: Optional[pulumi.Input['ZonalShiftConfigArgsArgs']]): + pulumi.set(self, "zonal_shift", value) + @_builtins.property @pulumi.getter def zones(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -311,6 +371,7 @@ def __init__(__self__, aws: Optional[pulumi.Input[Union['AWSNodeClassSpecArgsArgs', 'AWSNodeClassSpecArgsArgsDict']]] = None, azure: Optional[pulumi.Input[Union['AzureNodeClassSpecArgsArgs', 'AzureNodeClassSpecArgsArgsDict']]] = None, capacity_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input[Union['DisruptionPolicyArgsArgs', 'DisruptionPolicyArgsArgsDict']]] = None, instance_categories: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, @@ -318,17 +379,21 @@ def __init__(__self__, instance_families: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_generations: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_hypervisors: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + instance_local_nvme: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_sizes: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input[Union['ResourceLimitsArgsArgs', 'ResourceLimitsArgsArgsDict']]] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input[Union['RawKarpenterSpecArgsArgs', 'RawKarpenterSpecArgsArgsDict']]]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input[Union['ZonalShiftConfigArgsArgs', 'ZonalShiftConfigArgsArgsDict']]] = None, zones: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): """ @@ -365,6 +430,7 @@ def _internal_init(__self__, aws: Optional[pulumi.Input[Union['AWSNodeClassSpecArgsArgs', 'AWSNodeClassSpecArgsArgsDict']]] = None, azure: Optional[pulumi.Input[Union['AzureNodeClassSpecArgsArgs', 'AzureNodeClassSpecArgsArgsDict']]] = None, capacity_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input[Union['DisruptionPolicyArgsArgs', 'DisruptionPolicyArgsArgsDict']]] = None, instance_categories: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, @@ -372,17 +438,21 @@ def _internal_init(__self__, instance_families: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_generations: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_hypervisors: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + instance_local_nvme: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_sizes: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input[Union['ResourceLimitsArgsArgs', 'ResourceLimitsArgsArgsDict']]] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input[Union['RawKarpenterSpecArgsArgs', 'RawKarpenterSpecArgsArgsDict']]]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input[Union['ZonalShiftConfigArgsArgs', 'ZonalShiftConfigArgsArgsDict']]] = None, zones: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) @@ -397,6 +467,7 @@ def _internal_init(__self__, __props__.__dict__["aws"] = aws __props__.__dict__["azure"] = azure __props__.__dict__["capacity_types"] = capacity_types + __props__.__dict__["cloud_provider_id"] = cloud_provider_id __props__.__dict__["description"] = description __props__.__dict__["disruption"] = disruption __props__.__dict__["instance_categories"] = instance_categories @@ -404,10 +475,12 @@ def _internal_init(__self__, __props__.__dict__["instance_families"] = instance_families __props__.__dict__["instance_generations"] = instance_generations __props__.__dict__["instance_hypervisors"] = instance_hypervisors + __props__.__dict__["instance_local_nvme"] = instance_local_nvme __props__.__dict__["instance_sizes"] = instance_sizes __props__.__dict__["instance_types"] = instance_types __props__.__dict__["labels"] = labels __props__.__dict__["limits"] = limits + __props__.__dict__["master_override_role_name"] = master_override_role_name if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name @@ -415,8 +488,10 @@ def _internal_init(__self__, __props__.__dict__["node_pool_name"] = node_pool_name __props__.__dict__["operating_systems"] = operating_systems __props__.__dict__["raw"] = raw + __props__.__dict__["startup_taints"] = startup_taints __props__.__dict__["taints"] = taints __props__.__dict__["weight"] = weight + __props__.__dict__["zonal_shift"] = zonal_shift __props__.__dict__["zones"] = zones super(NodePolicy, __self__).__init__( 'devzero:resources:NodePolicy', @@ -444,6 +519,7 @@ def get(resource_name: str, __props__.__dict__["aws"] = None __props__.__dict__["azure"] = None __props__.__dict__["capacity_types"] = None + __props__.__dict__["cloud_provider_id"] = None __props__.__dict__["description"] = None __props__.__dict__["disruption"] = None __props__.__dict__["instance_categories"] = None @@ -451,17 +527,21 @@ def get(resource_name: str, __props__.__dict__["instance_families"] = None __props__.__dict__["instance_generations"] = None __props__.__dict__["instance_hypervisors"] = None + __props__.__dict__["instance_local_nvme"] = None __props__.__dict__["instance_sizes"] = None __props__.__dict__["instance_types"] = None __props__.__dict__["labels"] = None __props__.__dict__["limits"] = None + __props__.__dict__["master_override_role_name"] = None __props__.__dict__["name"] = None __props__.__dict__["node_class_name"] = None __props__.__dict__["node_pool_name"] = None __props__.__dict__["operating_systems"] = None __props__.__dict__["raw"] = None + __props__.__dict__["startup_taints"] = None __props__.__dict__["taints"] = None __props__.__dict__["weight"] = None + __props__.__dict__["zonal_shift"] = None __props__.__dict__["zones"] = None return NodePolicy(resource_name, opts=opts, __props__=__props__) @@ -497,6 +577,11 @@ def capacity_types(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']] """ return pulumi.get(self, "capacity_types") + @_builtins.property + @pulumi.getter(name="cloudProviderId") + def cloud_provider_id(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cloud_provider_id") + @_builtins.property @pulumi.getter def description(self) -> pulumi.Output[Optional[_builtins.str]]: @@ -553,6 +638,11 @@ def instance_hypervisors(self) -> pulumi.Output[Optional['outputs.LabelSelectorA """ return pulumi.get(self, "instance_hypervisors") + @_builtins.property + @pulumi.getter(name="instanceLocalNvme") + def instance_local_nvme(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: + return pulumi.get(self, "instance_local_nvme") + @_builtins.property @pulumi.getter(name="instanceSizes") def instance_sizes(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: @@ -585,6 +675,11 @@ def limits(self) -> pulumi.Output[Optional['outputs.ResourceLimitsArgs']]: """ return pulumi.get(self, "limits") + @_builtins.property + @pulumi.getter(name="masterOverrideRoleName") + def master_override_role_name(self) -> pulumi.Output[Optional[_builtins.str]]: + return pulumi.get(self, "master_override_role_name") + @_builtins.property @pulumi.getter def name(self) -> pulumi.Output[_builtins.str]: @@ -625,6 +720,11 @@ def raw(self) -> pulumi.Output[Optional[Sequence['outputs.RawKarpenterSpecArgs'] """ return pulumi.get(self, "raw") + @_builtins.property + @pulumi.getter(name="startupTaints") + def startup_taints(self) -> pulumi.Output[Optional[Sequence['outputs.TaintArgs']]]: + return pulumi.get(self, "startup_taints") + @_builtins.property @pulumi.getter def taints(self) -> pulumi.Output[Optional[Sequence['outputs.TaintArgs']]]: @@ -641,6 +741,11 @@ def weight(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "weight") + @_builtins.property + @pulumi.getter(name="zonalShift") + def zonal_shift(self) -> pulumi.Output[Optional['outputs.ZonalShiftConfigArgs']]: + return pulumi.get(self, "zonal_shift") + @_builtins.property @pulumi.getter def zones(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: diff --git a/sdk/python/pulumi_devzero/resources/node_policy_target.py b/sdk/python/pulumi_devzero/resources/node_policy_target.py index 2584889..87d921d 100644 --- a/sdk/python/pulumi_devzero/resources/node_policy_target.py +++ b/sdk/python/pulumi_devzero/resources/node_policy_target.py @@ -181,7 +181,7 @@ def get(resource_name: str, @pulumi.getter(name="clusterIds") def cluster_ids(self) -> pulumi.Output[Sequence[_builtins.str]]: """ - Cluster IDs where this node policy applies. + Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. """ return pulumi.get(self, "cluster_ids") diff --git a/sdk/python/pulumi_devzero/resources/outputs.py b/sdk/python/pulumi_devzero/resources/outputs.py index 3127543..1841343 100644 --- a/sdk/python/pulumi_devzero/resources/outputs.py +++ b/sdk/python/pulumi_devzero/resources/outputs.py @@ -46,6 +46,7 @@ 'SubnetSelectorTermArgs', 'TaintArgs', 'VerticalScalingArgs', + 'ZonalShiftConfigArgs', ] @pulumi.output_type @@ -553,6 +554,8 @@ def __key_warning(key: str): suggest = "fips_mode" elif key == "imageFamily": suggest = "image_family" + elif key == "imageVersion": + suggest = "image_version" elif key == "maxPods": suggest = "max_pods" elif key == "osDiskSizeGb": @@ -574,6 +577,7 @@ def get(self, key: str, default = None) -> Any: def __init__(__self__, *, fips_mode: Optional[_builtins.str] = None, image_family: Optional[_builtins.str] = None, + image_version: Optional[_builtins.str] = None, kubelet: Optional['outputs.AzureKubeletConfigurationArgs'] = None, max_pods: Optional[_builtins.int] = None, os_disk_size_gb: Optional[_builtins.int] = None, @@ -592,6 +596,8 @@ def __init__(__self__, *, pulumi.set(__self__, "fips_mode", fips_mode) if image_family is not None: pulumi.set(__self__, "image_family", image_family) + if image_version is not None: + pulumi.set(__self__, "image_version", image_version) if kubelet is not None: pulumi.set(__self__, "kubelet", kubelet) if max_pods is not None: @@ -619,6 +625,11 @@ def image_family(self) -> Optional[_builtins.str]: """ return pulumi.get(self, "image_family") + @_builtins.property + @pulumi.getter(name="imageVersion") + def image_version(self) -> Optional[_builtins.str]: + return pulumi.get(self, "image_version") + @_builtins.property @pulumi.getter def kubelet(self) -> Optional['outputs.AzureKubeletConfigurationArgs']: @@ -1394,7 +1405,9 @@ class HPAMetricTriggerArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "serverAddress": + if key == "connectorId": + suggest = "connector_id" + elif key == "serverAddress": suggest = "server_address" elif key == "targetUtilization": suggest = "target_utilization" @@ -1414,6 +1427,7 @@ def get(self, key: str, default = None) -> Any: def __init__(__self__, *, type: _builtins.str, + connector_id: Optional[_builtins.str] = None, metadata: Optional[Mapping[str, _builtins.str]] = None, query: Optional[_builtins.str] = None, server_address: Optional[_builtins.str] = None, @@ -1430,6 +1444,8 @@ def __init__(__self__, *, :param _builtins.str weight: Weight for composite formula scaling (0-1 decimal string). Example: '0.5'. """ pulumi.set(__self__, "type", type) + if connector_id is not None: + pulumi.set(__self__, "connector_id", connector_id) if metadata is not None: pulumi.set(__self__, "metadata", metadata) if query is not None: @@ -1451,6 +1467,11 @@ def type(self) -> _builtins.str: """ return pulumi.get(self, "type") + @_builtins.property + @pulumi.getter(name="connectorId") + def connector_id(self) -> Optional[_builtins.str]: + return pulumi.get(self, "connector_id") + @_builtins.property @pulumi.getter def metadata(self) -> Optional[Mapping[str, _builtins.str]]: @@ -1513,14 +1534,8 @@ def __key_warning(key: str): suggest = "max_replicas" elif key == "minReplicas": suggest = "min_replicas" - elif key == "primaryMetric": - suggest = "primary_metric" elif key == "scaleDownCooldownSeconds": suggest = "scale_down_cooldown_seconds" - elif key == "targetMemoryUtilization": - suggest = "target_memory_utilization" - elif key == "targetUtilization": - suggest = "target_utilization" if suggest: pulumi.log.warn(f"Key '{key}' not found in HPARuleConfigArgs. Access the value via the '{suggest}' property getter instead.") @@ -1542,10 +1557,7 @@ def __init__(__self__, *, max_replicas: Optional[_builtins.int] = None, metrics: Optional[Sequence['outputs.HPAMetricTriggerArgs']] = None, min_replicas: Optional[_builtins.int] = None, - primary_metric: Optional[_builtins.str] = None, - scale_down_cooldown_seconds: Optional[_builtins.int] = None, - target_memory_utilization: Optional[_builtins.float] = None, - target_utilization: Optional[_builtins.float] = None): + scale_down_cooldown_seconds: Optional[_builtins.int] = None): """ :param 'HPABehaviorArgs' behavior: Fine-grained scale-up and scale-down behavior policies. :param _builtins.str composite_formula: Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'. @@ -1553,12 +1565,9 @@ def __init__(__self__, *, :param 'HPAFallbackArgs' fallback: Replica fallback configuration when metrics are unavailable. :param _builtins.float max_replica_change_percent: Maximum percentage change in replica count per cycle. Example: 50.0. :param _builtins.int max_replicas: Maximum number of replicas. Example: 10. - :param Sequence['HPAMetricTriggerArgs'] metrics: Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + :param Sequence['HPAMetricTriggerArgs'] metrics: HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. :param _builtins.int min_replicas: Minimum number of replicas. Example: 2. - :param _builtins.str primary_metric: Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param _builtins.int scale_down_cooldown_seconds: Seconds to wait between scale-down events. Example: 300. - :param _builtins.float target_memory_utilization: Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - :param _builtins.float target_utilization: Target CPU utilization ratio (0-1). Example: 0.7. """ if behavior is not None: pulumi.set(__self__, "behavior", behavior) @@ -1576,14 +1585,8 @@ def __init__(__self__, *, pulumi.set(__self__, "metrics", metrics) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) - if primary_metric is not None: - pulumi.set(__self__, "primary_metric", primary_metric) if scale_down_cooldown_seconds is not None: pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) - if target_memory_utilization is not None: - pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) - if target_utilization is not None: - pulumi.set(__self__, "target_utilization", target_utilization) @_builtins.property @pulumi.getter @@ -1637,7 +1640,7 @@ def max_replicas(self) -> Optional[_builtins.int]: @pulumi.getter def metrics(self) -> Optional[Sequence['outputs.HPAMetricTriggerArgs']]: """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ return pulumi.get(self, "metrics") @@ -1649,14 +1652,6 @@ def min_replicas(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_replicas") - @_builtins.property - @pulumi.getter(name="primaryMetric") - def primary_metric(self) -> Optional[_builtins.str]: - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ - return pulumi.get(self, "primary_metric") - @_builtins.property @pulumi.getter(name="scaleDownCooldownSeconds") def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: @@ -1665,22 +1660,6 @@ def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "scale_down_cooldown_seconds") - @_builtins.property - @pulumi.getter(name="targetMemoryUtilization") - def target_memory_utilization(self) -> Optional[_builtins.float]: - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - return pulumi.get(self, "target_memory_utilization") - - @_builtins.property - @pulumi.getter(name="targetUtilization") - def target_utilization(self) -> Optional[_builtins.float]: - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ - return pulumi.get(self, "target_utilization") - @pulumi.output_type class HPAScalingPolicyArgs(dict): @@ -1806,7 +1785,9 @@ class HorizontalScalingArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "maxReplicaChangePercent": + if key == "compositeFormula": + suggest = "composite_formula" + elif key == "maxReplicaChangePercent": suggest = "max_replica_change_percent" elif key == "maxReplicas": suggest = "max_replicas" @@ -1814,8 +1795,14 @@ def __key_warning(key: str): suggest = "min_data_points" elif key == "minReplicas": suggest = "min_replicas" + elif key == "networkTargetThroughputBytesPerSec": + suggest = "network_target_throughput_bytes_per_sec" elif key == "primaryMetric": suggest = "primary_metric" + elif key == "scaleDownCooldownSeconds": + suggest = "scale_down_cooldown_seconds" + elif key == "targetMemoryUtilization": + suggest = "target_memory_utilization" elif key == "targetUtilization": suggest = "target_utilization" @@ -1831,12 +1818,16 @@ def get(self, key: str, default = None) -> Any: return super().get(key, default) def __init__(__self__, *, + composite_formula: Optional[_builtins.str] = None, enabled: Optional[_builtins.bool] = None, max_replica_change_percent: Optional[_builtins.float] = None, max_replicas: Optional[_builtins.int] = None, min_data_points: Optional[_builtins.int] = None, min_replicas: Optional[_builtins.int] = None, + network_target_throughput_bytes_per_sec: Optional[_builtins.int] = None, primary_metric: Optional[_builtins.str] = None, + scale_down_cooldown_seconds: Optional[_builtins.int] = None, + target_memory_utilization: Optional[_builtins.float] = None, target_utilization: Optional[_builtins.float] = None): """ :param _builtins.bool enabled: Enable horizontal (replica) scaling. Example: true. @@ -1847,6 +1838,8 @@ def __init__(__self__, *, :param _builtins.str primary_metric: Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param _builtins.float target_utilization: Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. """ + if composite_formula is not None: + pulumi.set(__self__, "composite_formula", composite_formula) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if max_replica_change_percent is not None: @@ -1857,11 +1850,22 @@ def __init__(__self__, *, pulumi.set(__self__, "min_data_points", min_data_points) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) + if network_target_throughput_bytes_per_sec is not None: + pulumi.set(__self__, "network_target_throughput_bytes_per_sec", network_target_throughput_bytes_per_sec) if primary_metric is not None: pulumi.set(__self__, "primary_metric", primary_metric) + if scale_down_cooldown_seconds is not None: + pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) + if target_memory_utilization is not None: + pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) if target_utilization is not None: pulumi.set(__self__, "target_utilization", target_utilization) + @_builtins.property + @pulumi.getter(name="compositeFormula") + def composite_formula(self) -> Optional[_builtins.str]: + return pulumi.get(self, "composite_formula") + @_builtins.property @pulumi.getter def enabled(self) -> Optional[_builtins.bool]: @@ -1902,6 +1906,11 @@ def min_replicas(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_replicas") + @_builtins.property + @pulumi.getter(name="networkTargetThroughputBytesPerSec") + def network_target_throughput_bytes_per_sec(self) -> Optional[_builtins.int]: + return pulumi.get(self, "network_target_throughput_bytes_per_sec") + @_builtins.property @pulumi.getter(name="primaryMetric") def primary_metric(self) -> Optional[_builtins.str]: @@ -1910,6 +1919,16 @@ def primary_metric(self) -> Optional[_builtins.str]: """ return pulumi.get(self, "primary_metric") + @_builtins.property + @pulumi.getter(name="scaleDownCooldownSeconds") + def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: + return pulumi.get(self, "scale_down_cooldown_seconds") + + @_builtins.property + @pulumi.getter(name="targetMemoryUtilization") + def target_memory_utilization(self) -> Optional[_builtins.float]: + return pulumi.get(self, "target_memory_utilization") + @_builtins.property @pulumi.getter(name="targetUtilization") def target_utilization(self) -> Optional[_builtins.float]: @@ -2397,8 +2416,22 @@ class ResourceRuleConfigArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "limitMultiplier": + if key == "ceilingPercent": + suggest = "ceiling_percent" + elif key == "floorPercent": + suggest = "floor_percent" + elif key == "initialLimit": + suggest = "initial_limit" + elif key == "initialRequest": + suggest = "initial_request" + elif key == "limitCeilingPercent": + suggest = "limit_ceiling_percent" + elif key == "limitFloorPercent": + suggest = "limit_floor_percent" + elif key == "limitMultiplier": suggest = "limit_multiplier" + elif key == "limitUseRss": + suggest = "limit_use_rss" elif key == "limitsAdjustmentEnabled": suggest = "limits_adjustment_enabled" elif key == "limitsRemovalEnabled": @@ -2411,6 +2444,8 @@ def __key_warning(key: str): suggest = "max_scale_up_percent" elif key == "minRequest": suggest = "min_request" + elif key == "requestUseRss": + suggest = "request_use_rss" elif key == "targetPercentile": suggest = "target_percentile" @@ -2426,14 +2461,22 @@ def get(self, key: str, default = None) -> Any: return super().get(key, default) def __init__(__self__, *, + ceiling_percent: Optional[_builtins.int] = None, enabled: Optional[_builtins.bool] = None, + floor_percent: Optional[_builtins.int] = None, + initial_limit: Optional[_builtins.int] = None, + initial_request: Optional[_builtins.int] = None, + limit_ceiling_percent: Optional[_builtins.int] = None, + limit_floor_percent: Optional[_builtins.int] = None, limit_multiplier: Optional[_builtins.float] = None, + limit_use_rss: Optional[_builtins.bool] = None, limits_adjustment_enabled: Optional[_builtins.bool] = None, limits_removal_enabled: Optional[_builtins.bool] = None, max_request: Optional[_builtins.int] = None, max_scale_down_percent: Optional[_builtins.float] = None, max_scale_up_percent: Optional[_builtins.float] = None, min_request: Optional[_builtins.int] = None, + request_use_rss: Optional[_builtins.bool] = None, target_percentile: Optional[_builtins.float] = None): """ :param _builtins.bool enabled: Enable this resource axis rule. Example: true. @@ -2446,10 +2489,24 @@ def __init__(__self__, *, :param _builtins.int min_request: Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. :param _builtins.float target_percentile: Percentile of usage data used as the recommendation target (0-1). Example: 0.95. """ + if ceiling_percent is not None: + pulumi.set(__self__, "ceiling_percent", ceiling_percent) if enabled is not None: pulumi.set(__self__, "enabled", enabled) + if floor_percent is not None: + pulumi.set(__self__, "floor_percent", floor_percent) + if initial_limit is not None: + pulumi.set(__self__, "initial_limit", initial_limit) + if initial_request is not None: + pulumi.set(__self__, "initial_request", initial_request) + if limit_ceiling_percent is not None: + pulumi.set(__self__, "limit_ceiling_percent", limit_ceiling_percent) + if limit_floor_percent is not None: + pulumi.set(__self__, "limit_floor_percent", limit_floor_percent) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -2462,9 +2519,16 @@ def __init__(__self__, *, pulumi.set(__self__, "max_scale_up_percent", max_scale_up_percent) if min_request is not None: pulumi.set(__self__, "min_request", min_request) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) + @_builtins.property + @pulumi.getter(name="ceilingPercent") + def ceiling_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "ceiling_percent") + @_builtins.property @pulumi.getter def enabled(self) -> Optional[_builtins.bool]: @@ -2473,6 +2537,31 @@ def enabled(self) -> Optional[_builtins.bool]: """ return pulumi.get(self, "enabled") + @_builtins.property + @pulumi.getter(name="floorPercent") + def floor_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "floor_percent") + + @_builtins.property + @pulumi.getter(name="initialLimit") + def initial_limit(self) -> Optional[_builtins.int]: + return pulumi.get(self, "initial_limit") + + @_builtins.property + @pulumi.getter(name="initialRequest") + def initial_request(self) -> Optional[_builtins.int]: + return pulumi.get(self, "initial_request") + + @_builtins.property + @pulumi.getter(name="limitCeilingPercent") + def limit_ceiling_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="limitFloorPercent") + def limit_floor_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "limit_floor_percent") + @_builtins.property @pulumi.getter(name="limitMultiplier") def limit_multiplier(self) -> Optional[_builtins.float]: @@ -2481,6 +2570,11 @@ def limit_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "limit_multiplier") + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "limit_use_rss") + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[_builtins.bool]: @@ -2529,6 +2623,11 @@ def min_request(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_request") + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "request_use_rss") + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[_builtins.float]: @@ -2662,6 +2761,8 @@ def __key_warning(key: str): suggest = "adjust_req_even_if_not_set" elif key == "limitMultiplier": suggest = "limit_multiplier" + elif key == "limitUseRss": + suggest = "limit_use_rss" elif key == "limitsAdjustmentEnabled": suggest = "limits_adjustment_enabled" elif key == "limitsRemovalEnabled": @@ -2678,6 +2779,8 @@ def __key_warning(key: str): suggest = "min_request" elif key == "overheadMultiplier": suggest = "overhead_multiplier" + elif key == "requestUseRss": + suggest = "request_use_rss" elif key == "targetPercentile": suggest = "target_percentile" @@ -2696,6 +2799,7 @@ def __init__(__self__, *, adjust_req_even_if_not_set: Optional[_builtins.bool] = None, enabled: Optional[_builtins.bool] = None, limit_multiplier: Optional[_builtins.float] = None, + limit_use_rss: Optional[_builtins.bool] = None, limits_adjustment_enabled: Optional[_builtins.bool] = None, limits_removal_enabled: Optional[_builtins.bool] = None, max_request: Optional[_builtins.int] = None, @@ -2704,6 +2808,7 @@ def __init__(__self__, *, min_data_points: Optional[_builtins.int] = None, min_request: Optional[_builtins.int] = None, overhead_multiplier: Optional[_builtins.float] = None, + request_use_rss: Optional[_builtins.bool] = None, target_percentile: Optional[_builtins.float] = None): """ :param _builtins.bool adjust_req_even_if_not_set: Recommend requests even when the workload has no existing requests set. Default: false. @@ -2725,6 +2830,8 @@ def __init__(__self__, *, pulumi.set(__self__, "enabled", enabled) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -2747,6 +2854,8 @@ def __init__(__self__, *, pulumi.set(__self__, "min_request", min_request) if overhead_multiplier is not None: pulumi.set(__self__, "overhead_multiplier", overhead_multiplier) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) @@ -2774,6 +2883,11 @@ def limit_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "limit_multiplier") + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "limit_use_rss") + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[_builtins.bool]: @@ -2838,6 +2952,11 @@ def overhead_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "overhead_multiplier") + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "request_use_rss") + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[_builtins.float]: @@ -2847,3 +2966,53 @@ def target_percentile(self) -> Optional[_builtins.float]: return pulumi.get(self, "target_percentile") +@pulumi.output_type +class ZonalShiftConfigArgs(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "allowZoneFallback": + suggest = "allow_zone_fallback" + elif key == "evictImpactedNodes": + suggest = "evict_impacted_nodes" + elif key == "respectZonalShift": + suggest = "respect_zonal_shift" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in ZonalShiftConfigArgs. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + ZonalShiftConfigArgs.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + ZonalShiftConfigArgs.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + allow_zone_fallback: Optional[_builtins.bool] = None, + evict_impacted_nodes: Optional[_builtins.bool] = None, + respect_zonal_shift: Optional[_builtins.bool] = None): + if allow_zone_fallback is not None: + pulumi.set(__self__, "allow_zone_fallback", allow_zone_fallback) + if evict_impacted_nodes is not None: + pulumi.set(__self__, "evict_impacted_nodes", evict_impacted_nodes) + if respect_zonal_shift is not None: + pulumi.set(__self__, "respect_zonal_shift", respect_zonal_shift) + + @_builtins.property + @pulumi.getter(name="allowZoneFallback") + def allow_zone_fallback(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "allow_zone_fallback") + + @_builtins.property + @pulumi.getter(name="evictImpactedNodes") + def evict_impacted_nodes(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "evict_impacted_nodes") + + @_builtins.property + @pulumi.getter(name="respectZonalShift") + def respect_zonal_shift(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "respect_zonal_shift") + + diff --git a/sdk/python/pulumi_devzero/resources/workload_policy.py b/sdk/python/pulumi_devzero/resources/workload_policy.py index c230fb2..839ff38 100644 --- a/sdk/python/pulumi_devzero/resources/workload_policy.py +++ b/sdk/python/pulumi_devzero/resources/workload_policy.py @@ -23,24 +23,44 @@ class WorkloadPolicyArgs: def __init__(__self__, *, name: pulumi.Input[_builtins.str], action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, horizontal_scaling: Optional[pulumi.Input['HorizontalScalingArgsArgs']] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -73,10 +93,20 @@ def __init__(__self__, *, pulumi.set(__self__, "name", name) if action_triggers is not None: pulumi.set(__self__, "action_triggers", action_triggers) + if allow_in_place_memory_limit_decrease is not None: + pulumi.set(__self__, "allow_in_place_memory_limit_decrease", allow_in_place_memory_limit_decrease) if cooldown_minutes is None: cooldown_minutes = 300 if cooldown_minutes is not None: pulumi.set(__self__, "cooldown_minutes", cooldown_minutes) + if cpu_ceiling_percent is not None: + pulumi.set(__self__, "cpu_ceiling_percent", cpu_ceiling_percent) + if cpu_floor_percent is not None: + pulumi.set(__self__, "cpu_floor_percent", cpu_floor_percent) + if cpu_limit_ceiling_percent is not None: + pulumi.set(__self__, "cpu_limit_ceiling_percent", cpu_limit_ceiling_percent) + if cpu_limit_floor_percent is not None: + pulumi.set(__self__, "cpu_limit_floor_percent", cpu_limit_floor_percent) if cpu_vertical_scaling is not None: pulumi.set(__self__, "cpu_vertical_scaling", cpu_vertical_scaling) if cron_schedule is not None: @@ -89,6 +119,8 @@ def __init__(__self__, *, pulumi.set(__self__, "detection_triggers", detection_triggers) if drift_delta_percent is not None: pulumi.set(__self__, "drift_delta_percent", drift_delta_percent) + if enable_in_place_vertical_scaling is not None: + pulumi.set(__self__, "enable_in_place_vertical_scaling", enable_in_place_vertical_scaling) if enable_pmax_protection is not None: pulumi.set(__self__, "enable_pmax_protection", enable_pmax_protection) if gpu_vertical_scaling is not None: @@ -99,12 +131,38 @@ def __init__(__self__, *, pulumi.set(__self__, "horizontal_scaling", horizontal_scaling) if hysteresis_vs_target is not None: pulumi.set(__self__, "hysteresis_vs_target", hysteresis_vs_target) + if jvm_cpu_startup_floor_millicores is not None: + pulumi.set(__self__, "jvm_cpu_startup_floor_millicores", jvm_cpu_startup_floor_millicores) + if jvm_heap_headroom_multiplier is not None: + pulumi.set(__self__, "jvm_heap_headroom_multiplier", jvm_heap_headroom_multiplier) + if jvm_heap_optimization_enabled is not None: + pulumi.set(__self__, "jvm_heap_optimization_enabled", jvm_heap_optimization_enabled) + if jvm_heap_target_percentile is not None: + pulumi.set(__self__, "jvm_heap_target_percentile", jvm_heap_target_percentile) + if jvm_max_heap_bytes is not None: + pulumi.set(__self__, "jvm_max_heap_bytes", jvm_max_heap_bytes) + if jvm_min_heap_bytes is not None: + pulumi.set(__self__, "jvm_min_heap_bytes", jvm_min_heap_bytes) + if jvm_non_heap_overhead_bytes is not None: + pulumi.set(__self__, "jvm_non_heap_overhead_bytes", jvm_non_heap_overhead_bytes) + if jvm_non_heap_overhead_percent is not None: + pulumi.set(__self__, "jvm_non_heap_overhead_percent", jvm_non_heap_overhead_percent) + if jvm_prefer_container_support is not None: + pulumi.set(__self__, "jvm_prefer_container_support", jvm_prefer_container_support) if live_migration_enabled is not None: pulumi.set(__self__, "live_migration_enabled", live_migration_enabled) if loopback_period_seconds is None: loopback_period_seconds = 86400 if loopback_period_seconds is not None: pulumi.set(__self__, "loopback_period_seconds", loopback_period_seconds) + if memory_ceiling_percent is not None: + pulumi.set(__self__, "memory_ceiling_percent", memory_ceiling_percent) + if memory_floor_percent is not None: + pulumi.set(__self__, "memory_floor_percent", memory_floor_percent) + if memory_limit_ceiling_percent is not None: + pulumi.set(__self__, "memory_limit_ceiling_percent", memory_limit_ceiling_percent) + if memory_limit_floor_percent is not None: + pulumi.set(__self__, "memory_limit_floor_percent", memory_limit_floor_percent) if memory_vertical_scaling is not None: pulumi.set(__self__, "memory_vertical_scaling", memory_vertical_scaling) if min_change_percent is None: @@ -119,6 +177,8 @@ def __init__(__self__, *, min_vpa_window_data_points = 30 if min_vpa_window_data_points is not None: pulumi.set(__self__, "min_vpa_window_data_points", min_vpa_window_data_points) + if pdb_enabled is not None: + pulumi.set(__self__, "pdb_enabled", pdb_enabled) if pmax_ratio_threshold is None: pmax_ratio_threshold = 3 if pmax_ratio_threshold is not None: @@ -154,6 +214,15 @@ def action_triggers(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builti def action_triggers(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "action_triggers", value) + @_builtins.property + @pulumi.getter(name="allowInPlaceMemoryLimitDecrease") + def allow_in_place_memory_limit_decrease(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "allow_in_place_memory_limit_decrease") + + @allow_in_place_memory_limit_decrease.setter + def allow_in_place_memory_limit_decrease(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "allow_in_place_memory_limit_decrease", value) + @_builtins.property @pulumi.getter(name="cooldownMinutes") def cooldown_minutes(self) -> Optional[pulumi.Input[_builtins.int]]: @@ -166,6 +235,42 @@ def cooldown_minutes(self) -> Optional[pulumi.Input[_builtins.int]]: def cooldown_minutes(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "cooldown_minutes", value) + @_builtins.property + @pulumi.getter(name="cpuCeilingPercent") + def cpu_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_ceiling_percent") + + @cpu_ceiling_percent.setter + def cpu_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuFloorPercent") + def cpu_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_floor_percent") + + @cpu_floor_percent.setter + def cpu_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_floor_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuLimitCeilingPercent") + def cpu_limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_limit_ceiling_percent") + + @cpu_limit_ceiling_percent.setter + def cpu_limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuLimitFloorPercent") + def cpu_limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_limit_floor_percent") + + @cpu_limit_floor_percent.setter + def cpu_limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="cpuVerticalScaling") def cpu_vertical_scaling(self) -> Optional[pulumi.Input['VerticalScalingArgsArgs']]: @@ -235,6 +340,15 @@ def drift_delta_percent(self) -> Optional[pulumi.Input[_builtins.float]]: def drift_delta_percent(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "drift_delta_percent", value) + @_builtins.property + @pulumi.getter(name="enableInPlaceVerticalScaling") + def enable_in_place_vertical_scaling(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "enable_in_place_vertical_scaling") + + @enable_in_place_vertical_scaling.setter + def enable_in_place_vertical_scaling(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "enable_in_place_vertical_scaling", value) + @_builtins.property @pulumi.getter(name="enablePmaxProtection") def enable_pmax_protection(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -292,6 +406,87 @@ def hysteresis_vs_target(self) -> Optional[pulumi.Input[_builtins.float]]: def hysteresis_vs_target(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "hysteresis_vs_target", value) + @_builtins.property + @pulumi.getter(name="jvmCpuStartupFloorMillicores") + def jvm_cpu_startup_floor_millicores(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_cpu_startup_floor_millicores") + + @jvm_cpu_startup_floor_millicores.setter + def jvm_cpu_startup_floor_millicores(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_cpu_startup_floor_millicores", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapHeadroomMultiplier") + def jvm_heap_headroom_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_heap_headroom_multiplier") + + @jvm_heap_headroom_multiplier.setter + def jvm_heap_headroom_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_heap_headroom_multiplier", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapOptimizationEnabled") + def jvm_heap_optimization_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "jvm_heap_optimization_enabled") + + @jvm_heap_optimization_enabled.setter + def jvm_heap_optimization_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "jvm_heap_optimization_enabled", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapTargetPercentile") + def jvm_heap_target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_heap_target_percentile") + + @jvm_heap_target_percentile.setter + def jvm_heap_target_percentile(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_heap_target_percentile", value) + + @_builtins.property + @pulumi.getter(name="jvmMaxHeapBytes") + def jvm_max_heap_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_max_heap_bytes") + + @jvm_max_heap_bytes.setter + def jvm_max_heap_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_max_heap_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmMinHeapBytes") + def jvm_min_heap_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_min_heap_bytes") + + @jvm_min_heap_bytes.setter + def jvm_min_heap_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_min_heap_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadBytes") + def jvm_non_heap_overhead_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_non_heap_overhead_bytes") + + @jvm_non_heap_overhead_bytes.setter + def jvm_non_heap_overhead_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_non_heap_overhead_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadPercent") + def jvm_non_heap_overhead_percent(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_non_heap_overhead_percent") + + @jvm_non_heap_overhead_percent.setter + def jvm_non_heap_overhead_percent(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_non_heap_overhead_percent", value) + + @_builtins.property + @pulumi.getter(name="jvmPreferContainerSupport") + def jvm_prefer_container_support(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "jvm_prefer_container_support") + + @jvm_prefer_container_support.setter + def jvm_prefer_container_support(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "jvm_prefer_container_support", value) + @_builtins.property @pulumi.getter(name="liveMigrationEnabled") def live_migration_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -316,6 +511,42 @@ def loopback_period_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: def loopback_period_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "loopback_period_seconds", value) + @_builtins.property + @pulumi.getter(name="memoryCeilingPercent") + def memory_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_ceiling_percent") + + @memory_ceiling_percent.setter + def memory_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryFloorPercent") + def memory_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_floor_percent") + + @memory_floor_percent.setter + def memory_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_floor_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryLimitCeilingPercent") + def memory_limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_limit_ceiling_percent") + + @memory_limit_ceiling_percent.setter + def memory_limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryLimitFloorPercent") + def memory_limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_limit_floor_percent") + + @memory_limit_floor_percent.setter + def memory_limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="memoryVerticalScaling") def memory_vertical_scaling(self) -> Optional[pulumi.Input['VerticalScalingArgsArgs']]: @@ -361,6 +592,15 @@ def min_vpa_window_data_points(self) -> Optional[pulumi.Input[_builtins.int]]: def min_vpa_window_data_points(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_vpa_window_data_points", value) + @_builtins.property + @pulumi.getter(name="pdbEnabled") + def pdb_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "pdb_enabled") + + @pdb_enabled.setter + def pdb_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "pdb_enabled", value) + @_builtins.property @pulumi.getter(name="pmaxRatioThreshold") def pmax_ratio_threshold(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -417,25 +657,45 @@ def __init__(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, horizontal_scaling: Optional[pulumi.Input[Union['HorizontalScalingArgsArgs', 'HorizontalScalingArgsArgsDict']]] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -493,25 +753,45 @@ def _internal_init(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, horizontal_scaling: Optional[pulumi.Input[Union['HorizontalScalingArgsArgs', 'HorizontalScalingArgsArgsDict']]] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -526,24 +806,43 @@ def _internal_init(__self__, __props__ = WorkloadPolicyArgs.__new__(WorkloadPolicyArgs) __props__.__dict__["action_triggers"] = action_triggers + __props__.__dict__["allow_in_place_memory_limit_decrease"] = allow_in_place_memory_limit_decrease if cooldown_minutes is None: cooldown_minutes = 300 __props__.__dict__["cooldown_minutes"] = cooldown_minutes + __props__.__dict__["cpu_ceiling_percent"] = cpu_ceiling_percent + __props__.__dict__["cpu_floor_percent"] = cpu_floor_percent + __props__.__dict__["cpu_limit_ceiling_percent"] = cpu_limit_ceiling_percent + __props__.__dict__["cpu_limit_floor_percent"] = cpu_limit_floor_percent __props__.__dict__["cpu_vertical_scaling"] = cpu_vertical_scaling __props__.__dict__["cron_schedule"] = cron_schedule __props__.__dict__["defragmentation_schedule"] = defragmentation_schedule __props__.__dict__["description"] = description __props__.__dict__["detection_triggers"] = detection_triggers __props__.__dict__["drift_delta_percent"] = drift_delta_percent + __props__.__dict__["enable_in_place_vertical_scaling"] = enable_in_place_vertical_scaling __props__.__dict__["enable_pmax_protection"] = enable_pmax_protection __props__.__dict__["gpu_vertical_scaling"] = gpu_vertical_scaling __props__.__dict__["gpu_vram_vertical_scaling"] = gpu_vram_vertical_scaling __props__.__dict__["horizontal_scaling"] = horizontal_scaling __props__.__dict__["hysteresis_vs_target"] = hysteresis_vs_target + __props__.__dict__["jvm_cpu_startup_floor_millicores"] = jvm_cpu_startup_floor_millicores + __props__.__dict__["jvm_heap_headroom_multiplier"] = jvm_heap_headroom_multiplier + __props__.__dict__["jvm_heap_optimization_enabled"] = jvm_heap_optimization_enabled + __props__.__dict__["jvm_heap_target_percentile"] = jvm_heap_target_percentile + __props__.__dict__["jvm_max_heap_bytes"] = jvm_max_heap_bytes + __props__.__dict__["jvm_min_heap_bytes"] = jvm_min_heap_bytes + __props__.__dict__["jvm_non_heap_overhead_bytes"] = jvm_non_heap_overhead_bytes + __props__.__dict__["jvm_non_heap_overhead_percent"] = jvm_non_heap_overhead_percent + __props__.__dict__["jvm_prefer_container_support"] = jvm_prefer_container_support __props__.__dict__["live_migration_enabled"] = live_migration_enabled if loopback_period_seconds is None: loopback_period_seconds = 86400 __props__.__dict__["loopback_period_seconds"] = loopback_period_seconds + __props__.__dict__["memory_ceiling_percent"] = memory_ceiling_percent + __props__.__dict__["memory_floor_percent"] = memory_floor_percent + __props__.__dict__["memory_limit_ceiling_percent"] = memory_limit_ceiling_percent + __props__.__dict__["memory_limit_floor_percent"] = memory_limit_floor_percent __props__.__dict__["memory_vertical_scaling"] = memory_vertical_scaling if min_change_percent is None: min_change_percent = 0.2 @@ -557,6 +856,7 @@ def _internal_init(__self__, if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name + __props__.__dict__["pdb_enabled"] = pdb_enabled if pmax_ratio_threshold is None: pmax_ratio_threshold = 3 __props__.__dict__["pmax_ratio_threshold"] = pmax_ratio_threshold @@ -586,25 +886,45 @@ def get(resource_name: str, __props__ = WorkloadPolicyArgs.__new__(WorkloadPolicyArgs) __props__.__dict__["action_triggers"] = None + __props__.__dict__["allow_in_place_memory_limit_decrease"] = None __props__.__dict__["cooldown_minutes"] = None + __props__.__dict__["cpu_ceiling_percent"] = None + __props__.__dict__["cpu_floor_percent"] = None + __props__.__dict__["cpu_limit_ceiling_percent"] = None + __props__.__dict__["cpu_limit_floor_percent"] = None __props__.__dict__["cpu_vertical_scaling"] = None __props__.__dict__["cron_schedule"] = None __props__.__dict__["defragmentation_schedule"] = None __props__.__dict__["description"] = None __props__.__dict__["detection_triggers"] = None __props__.__dict__["drift_delta_percent"] = None + __props__.__dict__["enable_in_place_vertical_scaling"] = None __props__.__dict__["enable_pmax_protection"] = None __props__.__dict__["gpu_vertical_scaling"] = None __props__.__dict__["gpu_vram_vertical_scaling"] = None __props__.__dict__["horizontal_scaling"] = None __props__.__dict__["hysteresis_vs_target"] = None + __props__.__dict__["jvm_cpu_startup_floor_millicores"] = None + __props__.__dict__["jvm_heap_headroom_multiplier"] = None + __props__.__dict__["jvm_heap_optimization_enabled"] = None + __props__.__dict__["jvm_heap_target_percentile"] = None + __props__.__dict__["jvm_max_heap_bytes"] = None + __props__.__dict__["jvm_min_heap_bytes"] = None + __props__.__dict__["jvm_non_heap_overhead_bytes"] = None + __props__.__dict__["jvm_non_heap_overhead_percent"] = None + __props__.__dict__["jvm_prefer_container_support"] = None __props__.__dict__["live_migration_enabled"] = None __props__.__dict__["loopback_period_seconds"] = None + __props__.__dict__["memory_ceiling_percent"] = None + __props__.__dict__["memory_floor_percent"] = None + __props__.__dict__["memory_limit_ceiling_percent"] = None + __props__.__dict__["memory_limit_floor_percent"] = None __props__.__dict__["memory_vertical_scaling"] = None __props__.__dict__["min_change_percent"] = None __props__.__dict__["min_data_points"] = None __props__.__dict__["min_vpa_window_data_points"] = None __props__.__dict__["name"] = None + __props__.__dict__["pdb_enabled"] = None __props__.__dict__["pmax_ratio_threshold"] = None __props__.__dict__["scheduler_plugins"] = None __props__.__dict__["stability_cv_max"] = None @@ -619,6 +939,11 @@ def action_triggers(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "action_triggers") + @_builtins.property + @pulumi.getter(name="allowInPlaceMemoryLimitDecrease") + def allow_in_place_memory_limit_decrease(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "allow_in_place_memory_limit_decrease") + @_builtins.property @pulumi.getter(name="cooldownMinutes") def cooldown_minutes(self) -> pulumi.Output[Optional[_builtins.int]]: @@ -627,6 +952,26 @@ def cooldown_minutes(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "cooldown_minutes") + @_builtins.property + @pulumi.getter(name="cpuCeilingPercent") + def cpu_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="cpuFloorPercent") + def cpu_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_floor_percent") + + @_builtins.property + @pulumi.getter(name="cpuLimitCeilingPercent") + def cpu_limit_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="cpuLimitFloorPercent") + def cpu_limit_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_limit_floor_percent") + @_builtins.property @pulumi.getter(name="cpuVerticalScaling") def cpu_vertical_scaling(self) -> pulumi.Output[Optional['outputs.VerticalScalingArgs']]: @@ -672,6 +1017,11 @@ def drift_delta_percent(self) -> pulumi.Output[Optional[_builtins.float]]: """ return pulumi.get(self, "drift_delta_percent") + @_builtins.property + @pulumi.getter(name="enableInPlaceVerticalScaling") + def enable_in_place_vertical_scaling(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "enable_in_place_vertical_scaling") + @_builtins.property @pulumi.getter(name="enablePmaxProtection") def enable_pmax_protection(self) -> pulumi.Output[Optional[_builtins.bool]]: @@ -709,6 +1059,51 @@ def hysteresis_vs_target(self) -> pulumi.Output[Optional[_builtins.float]]: """ return pulumi.get(self, "hysteresis_vs_target") + @_builtins.property + @pulumi.getter(name="jvmCpuStartupFloorMillicores") + def jvm_cpu_startup_floor_millicores(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_cpu_startup_floor_millicores") + + @_builtins.property + @pulumi.getter(name="jvmHeapHeadroomMultiplier") + def jvm_heap_headroom_multiplier(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_heap_headroom_multiplier") + + @_builtins.property + @pulumi.getter(name="jvmHeapOptimizationEnabled") + def jvm_heap_optimization_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "jvm_heap_optimization_enabled") + + @_builtins.property + @pulumi.getter(name="jvmHeapTargetPercentile") + def jvm_heap_target_percentile(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_heap_target_percentile") + + @_builtins.property + @pulumi.getter(name="jvmMaxHeapBytes") + def jvm_max_heap_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_max_heap_bytes") + + @_builtins.property + @pulumi.getter(name="jvmMinHeapBytes") + def jvm_min_heap_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_min_heap_bytes") + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadBytes") + def jvm_non_heap_overhead_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_non_heap_overhead_bytes") + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadPercent") + def jvm_non_heap_overhead_percent(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_non_heap_overhead_percent") + + @_builtins.property + @pulumi.getter(name="jvmPreferContainerSupport") + def jvm_prefer_container_support(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "jvm_prefer_container_support") + @_builtins.property @pulumi.getter(name="liveMigrationEnabled") def live_migration_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: @@ -725,6 +1120,26 @@ def loopback_period_seconds(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "loopback_period_seconds") + @_builtins.property + @pulumi.getter(name="memoryCeilingPercent") + def memory_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="memoryFloorPercent") + def memory_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_floor_percent") + + @_builtins.property + @pulumi.getter(name="memoryLimitCeilingPercent") + def memory_limit_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="memoryLimitFloorPercent") + def memory_limit_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_limit_floor_percent") + @_builtins.property @pulumi.getter(name="memoryVerticalScaling") def memory_vertical_scaling(self) -> pulumi.Output[Optional['outputs.VerticalScalingArgs']]: @@ -762,6 +1177,11 @@ def name(self) -> pulumi.Output[_builtins.str]: """ return pulumi.get(self, "name") + @_builtins.property + @pulumi.getter(name="pdbEnabled") + def pdb_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "pdb_enabled") + @_builtins.property @pulumi.getter(name="pmaxRatioThreshold") def pmax_ratio_threshold(self) -> pulumi.Output[Optional[_builtins.float]]: diff --git a/sdk/python/pulumi_devzero/resources/workload_policy_target.py b/sdk/python/pulumi_devzero/resources/workload_policy_target.py index 4927b44..f654351 100644 --- a/sdk/python/pulumi_devzero/resources/workload_policy_target.py +++ b/sdk/python/pulumi_devzero/resources/workload_policy_target.py @@ -24,15 +24,18 @@ def __init__(__self__, *, cluster_ids: pulumi.Input[Sequence[pulumi.Input[_builtins.str]]], name: pulumi.Input[_builtins.str], policy_id: pulumi.Input[_builtins.str], + annotation_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name_pattern: Optional[pulumi.Input['NamePatternArgsArgs']] = None, namespace_pattern: Optional[pulumi.Input['NamePatternArgsArgs']] = None, namespace_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, node_group_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None): """ The set of arguments for constructing a WorkloadPolicyTarget resource. @@ -40,12 +43,16 @@ def __init__(__self__, *, pulumi.set(__self__, "cluster_ids", cluster_ids) pulumi.set(__self__, "name", name) pulumi.set(__self__, "policy_id", policy_id) + if annotation_selector is not None: + pulumi.set(__self__, "annotation_selector", annotation_selector) if description is not None: pulumi.set(__self__, "description", description) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if kind_filter is not None: pulumi.set(__self__, "kind_filter", kind_filter) + if kind_filter_not_in is not None: + pulumi.set(__self__, "kind_filter_not_in", kind_filter_not_in) if name_pattern is not None: pulumi.set(__self__, "name_pattern", name_pattern) if namespace_pattern is not None: @@ -58,6 +65,8 @@ def __init__(__self__, *, pulumi.set(__self__, "priority", priority) if workload_names is not None: pulumi.set(__self__, "workload_names", workload_names) + if workload_names_not_in is not None: + pulumi.set(__self__, "workload_names_not_in", workload_names_not_in) if workload_selector is not None: pulumi.set(__self__, "workload_selector", workload_selector) @@ -88,6 +97,15 @@ def policy_id(self) -> pulumi.Input[_builtins.str]: def policy_id(self, value: pulumi.Input[_builtins.str]): pulumi.set(self, "policy_id", value) + @_builtins.property + @pulumi.getter(name="annotationSelector") + def annotation_selector(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: + return pulumi.get(self, "annotation_selector") + + @annotation_selector.setter + def annotation_selector(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): + pulumi.set(self, "annotation_selector", value) + @_builtins.property @pulumi.getter def description(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -115,6 +133,15 @@ def kind_filter(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.s def kind_filter(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "kind_filter", value) + @_builtins.property + @pulumi.getter(name="kindFilterNotIn") + def kind_filter_not_in(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]: + return pulumi.get(self, "kind_filter_not_in") + + @kind_filter_not_in.setter + def kind_filter_not_in(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): + pulumi.set(self, "kind_filter_not_in", value) + @_builtins.property @pulumi.getter(name="namePattern") def name_pattern(self) -> Optional[pulumi.Input['NamePatternArgsArgs']]: @@ -169,6 +196,15 @@ def workload_names(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtin def workload_names(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "workload_names", value) + @_builtins.property + @pulumi.getter(name="workloadNamesNotIn") + def workload_names_not_in(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]: + return pulumi.get(self, "workload_names_not_in") + + @workload_names_not_in.setter + def workload_names_not_in(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): + pulumi.set(self, "workload_names_not_in", value) + @_builtins.property @pulumi.getter(name="workloadSelector") def workload_selector(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -185,10 +221,12 @@ class WorkloadPolicyTarget(pulumi.CustomResource): def __init__(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, + annotation_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, name_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, namespace_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, @@ -197,6 +235,7 @@ def __init__(__self__, policy_id: Optional[pulumi.Input[_builtins.str]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): """ @@ -229,10 +268,12 @@ def __init__(__self__, resource_name: str, *args, **kwargs): def _internal_init(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, + annotation_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, name_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, namespace_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, @@ -241,6 +282,7 @@ def _internal_init(__self__, policy_id: Optional[pulumi.Input[_builtins.str]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) @@ -251,12 +293,14 @@ def _internal_init(__self__, raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') __props__ = WorkloadPolicyTargetArgs.__new__(WorkloadPolicyTargetArgs) + __props__.__dict__["annotation_selector"] = annotation_selector if cluster_ids is None and not opts.urn: raise TypeError("Missing required property 'cluster_ids'") __props__.__dict__["cluster_ids"] = cluster_ids __props__.__dict__["description"] = description __props__.__dict__["enabled"] = enabled __props__.__dict__["kind_filter"] = kind_filter + __props__.__dict__["kind_filter_not_in"] = kind_filter_not_in if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name @@ -269,6 +313,7 @@ def _internal_init(__self__, __props__.__dict__["policy_id"] = policy_id __props__.__dict__["priority"] = priority __props__.__dict__["workload_names"] = workload_names + __props__.__dict__["workload_names_not_in"] = workload_names_not_in __props__.__dict__["workload_selector"] = workload_selector super(WorkloadPolicyTarget, __self__).__init__( 'devzero:resources:WorkloadPolicyTarget', @@ -292,10 +337,12 @@ def get(resource_name: str, __props__ = WorkloadPolicyTargetArgs.__new__(WorkloadPolicyTargetArgs) + __props__.__dict__["annotation_selector"] = None __props__.__dict__["cluster_ids"] = None __props__.__dict__["description"] = None __props__.__dict__["enabled"] = None __props__.__dict__["kind_filter"] = None + __props__.__dict__["kind_filter_not_in"] = None __props__.__dict__["name"] = None __props__.__dict__["name_pattern"] = None __props__.__dict__["namespace_pattern"] = None @@ -304,9 +351,18 @@ def get(resource_name: str, __props__.__dict__["policy_id"] = None __props__.__dict__["priority"] = None __props__.__dict__["workload_names"] = None + __props__.__dict__["workload_names_not_in"] = None __props__.__dict__["workload_selector"] = None return WorkloadPolicyTarget(resource_name, opts=opts, __props__=__props__) + @_builtins.property + @pulumi.getter(name="annotationSelector") + def annotation_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: + """ + Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + """ + return pulumi.get(self, "annotation_selector") + @_builtins.property @pulumi.getter(name="clusterIds") def cluster_ids(self) -> pulumi.Output[Sequence[_builtins.str]]: @@ -327,7 +383,7 @@ def description(self) -> pulumi.Output[Optional[_builtins.str]]: @pulumi.getter def enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: """ - Enable or disable this target. + Enable or disable this target. Defaults to true. """ return pulumi.get(self, "enabled") @@ -339,6 +395,14 @@ def kind_filter(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "kind_filter") + @_builtins.property + @pulumi.getter(name="kindFilterNotIn") + def kind_filter_not_in(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: + """ + Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + """ + return pulumi.get(self, "kind_filter_not_in") + @_builtins.property @pulumi.getter def name(self) -> pulumi.Output[_builtins.str]: @@ -373,9 +437,10 @@ def namespace_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArg @_builtins.property @pulumi.getter(name="nodeGroupNames") + @_utilities.deprecated("""node_group_names is deprecated by the DevZero API and no longer evaluated.""") def node_group_names(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ - Restrict matching to specific node groups by name. + DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. """ return pulumi.get(self, "node_group_names") @@ -403,6 +468,14 @@ def workload_names(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "workload_names") + @_builtins.property + @pulumi.getter(name="workloadNamesNotIn") + def workload_names_not_in(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: + """ + Explicit list of workload names to exclude. + """ + return pulumi.get(self, "workload_names_not_in") + @_builtins.property @pulumi.getter(name="workloadSelector") def workload_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: diff --git a/sdk/python/pulumi_devzero/resources/workload_rule.py b/sdk/python/pulumi_devzero/resources/workload_rule.py index c35c00f..d9a60c1 100644 --- a/sdk/python/pulumi_devzero/resources/workload_rule.py +++ b/sdk/python/pulumi_devzero/resources/workload_rule.py @@ -33,10 +33,12 @@ def __init__(__self__, *, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input['EmergencyResponseConfigArgsArgs']] = None, gpu_rule: Optional[pulumi.Input['ResourceRuleConfigArgsArgs']] = None, hpa_rule: Optional[pulumi.Input['HPARuleConfigArgsArgs']] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input['ResourceRuleConfigArgsArgs']] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, startup_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, @@ -85,6 +87,8 @@ def __init__(__self__, *, pulumi.set(__self__, "defragmentation_schedule", defragmentation_schedule) if detection_triggers is not None: pulumi.set(__self__, "detection_triggers", detection_triggers) + if disabled is not None: + pulumi.set(__self__, "disabled", disabled) if emergency_response is not None: pulumi.set(__self__, "emergency_response", emergency_response) if gpu_rule is not None: @@ -93,6 +97,8 @@ def __init__(__self__, *, pulumi.set(__self__, "hpa_rule", hpa_rule) if live_migration_enabled is not None: pulumi.set(__self__, "live_migration_enabled", live_migration_enabled) + if lookback_period_seconds is not None: + pulumi.set(__self__, "lookback_period_seconds", lookback_period_seconds) if memory_rule is not None: pulumi.set(__self__, "memory_rule", memory_rule) if scheduler_plugins is not None: @@ -246,6 +252,15 @@ def detection_triggers(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_bui def detection_triggers(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "detection_triggers", value) + @_builtins.property + @pulumi.getter + def disabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "disabled") + + @disabled.setter + def disabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "disabled", value) + @_builtins.property @pulumi.getter(name="emergencyResponse") def emergency_response(self) -> Optional[pulumi.Input['EmergencyResponseConfigArgsArgs']]: @@ -294,6 +309,15 @@ def live_migration_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: def live_migration_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): pulumi.set(self, "live_migration_enabled", value) + @_builtins.property + @pulumi.getter(name="lookbackPeriodSeconds") + def lookback_period_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "lookback_period_seconds") + + @lookback_period_seconds.setter + def lookback_period_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "lookback_period_seconds", value) + @_builtins.property @pulumi.getter(name="memoryRule") def memory_rule(self) -> Optional[pulumi.Input['ResourceRuleConfigArgsArgs']]: @@ -358,11 +382,13 @@ def __init__(__self__, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input[Union['EmergencyResponseConfigArgsArgs', 'EmergencyResponseConfigArgsArgsDict']]] = None, gpu_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, hpa_rule: Optional[pulumi.Input[Union['HPARuleConfigArgsArgs', 'HPARuleConfigArgsArgsDict']]] = None, kind: Optional[pulumi.Input[_builtins.str]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, namespace: Optional[pulumi.Input[_builtins.str]] = None, @@ -429,11 +455,13 @@ def _internal_init(__self__, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input[Union['EmergencyResponseConfigArgsArgs', 'EmergencyResponseConfigArgsArgsDict']]] = None, gpu_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, hpa_rule: Optional[pulumi.Input[Union['HPARuleConfigArgsArgs', 'HPARuleConfigArgsArgsDict']]] = None, kind: Optional[pulumi.Input[_builtins.str]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, namespace: Optional[pulumi.Input[_builtins.str]] = None, @@ -460,6 +488,7 @@ def _internal_init(__self__, __props__.__dict__["cron_schedule"] = cron_schedule __props__.__dict__["defragmentation_schedule"] = defragmentation_schedule __props__.__dict__["detection_triggers"] = detection_triggers + __props__.__dict__["disabled"] = disabled __props__.__dict__["emergency_response"] = emergency_response __props__.__dict__["gpu_rule"] = gpu_rule __props__.__dict__["hpa_rule"] = hpa_rule @@ -467,6 +496,7 @@ def _internal_init(__self__, raise TypeError("Missing required property 'kind'") __props__.__dict__["kind"] = kind __props__.__dict__["live_migration_enabled"] = live_migration_enabled + __props__.__dict__["lookback_period_seconds"] = lookback_period_seconds __props__.__dict__["memory_rule"] = memory_rule if name is None and not opts.urn: raise TypeError("Missing required property 'name'") @@ -508,11 +538,13 @@ def get(resource_name: str, __props__.__dict__["cron_schedule"] = None __props__.__dict__["defragmentation_schedule"] = None __props__.__dict__["detection_triggers"] = None + __props__.__dict__["disabled"] = None __props__.__dict__["emergency_response"] = None __props__.__dict__["gpu_rule"] = None __props__.__dict__["hpa_rule"] = None __props__.__dict__["kind"] = None __props__.__dict__["live_migration_enabled"] = None + __props__.__dict__["lookback_period_seconds"] = None __props__.__dict__["memory_rule"] = None __props__.__dict__["name"] = None __props__.__dict__["namespace"] = None @@ -593,6 +625,11 @@ def detection_triggers(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]] """ return pulumi.get(self, "detection_triggers") + @_builtins.property + @pulumi.getter + def disabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "disabled") + @_builtins.property @pulumi.getter(name="emergencyResponse") def emergency_response(self) -> pulumi.Output[Optional['outputs.EmergencyResponseConfigArgs']]: @@ -633,6 +670,11 @@ def live_migration_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: """ return pulumi.get(self, "live_migration_enabled") + @_builtins.property + @pulumi.getter(name="lookbackPeriodSeconds") + def lookback_period_seconds(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "lookback_period_seconds") + @_builtins.property @pulumi.getter(name="memoryRule") def memory_rule(self) -> pulumi.Output[Optional['outputs.ResourceRuleConfigArgs']]: From 4373e32b2da6628aff7ddb558028445acb5100f8 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 08:53:57 +0200 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20address=20review=20findings=20?= =?UTF-8?q?=E2=80=94=20exact=20float=20read-backs,=20precise=20source=20sk?= =?UTF-8?q?ip,=20retry=20guard,=20kind=20validation,=20TS=205.2=20consumer?= =?UTF-8?q?=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - emergencyResponse float32 fields (oomMemoryMultiplier, cpuThrottling*) read back via shortest-round-trip conversion like every other float — the raw float64 cast produced 0.800000011920929-style refresh drift. - NodePolicy.Read skips exactly the known-virtual source ("cluster") instead of any unknown source, so a future backend source tag cannot silently orphan a managed policy. - retryInterceptor passes straight through when maxAttempts < 1 instead of returning (nil, nil). - workloadRule.kind validated against the supported kinds (Deployment/StatefulSet/DaemonSet/CronJob/Job) — the API accepts any string and a typo would create a rule that never matches. - Stale cluster token docs removed (Describe + Update comment still said tokens rotate on import). - NodeJS consumer test pins @types/node to ^18 via npm overrides: the latest @pulumi/pulumi pulls an @types/node that needs TS >= 5.6, which has been failing the TS 5.2 matrix on main's nightly since Aug 9. --- provider/pkg/provider/client.go | 2 +- provider/pkg/resources/cluster.go | 3 +-- provider/pkg/resources/node_policy.go | 6 ++++-- provider/pkg/resources/validation.go | 6 ++++++ provider/pkg/resources/workload_rule.go | 6 +++--- scripts/ci/test-nodejs.sh | 5 ++++- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/provider/pkg/provider/client.go b/provider/pkg/provider/client.go index eba2be0..7b0b3ed 100644 --- a/provider/pkg/provider/client.go +++ b/provider/pkg/provider/client.go @@ -62,7 +62,7 @@ func isIdempotentProcedure(procedure string) bool { func retryInterceptor(maxAttempts int, initialDelay time.Duration) connect.UnaryInterceptorFunc { return func(next connect.UnaryFunc) connect.UnaryFunc { return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - if !isIdempotentProcedure(req.Spec().Procedure) { + if maxAttempts < 1 || !isIdempotentProcedure(req.Spec().Procedure) { return next(ctx, req) } delay := initialDelay diff --git a/provider/pkg/resources/cluster.go b/provider/pkg/resources/cluster.go index 4240d87..964e870 100644 --- a/provider/pkg/resources/cluster.go +++ b/provider/pkg/resources/cluster.go @@ -25,7 +25,7 @@ type ClusterState struct { // Annotate provides descriptions for SDK documentation and marks secret fields. func (s *ClusterState) Annotate(a infer.Annotator) { a.Describe(&s.Name, "The name of the cluster.") - a.Describe(&s.Token, "Authentication token for the cluster. Rotated automatically if empty on update (e.g. after import).") + a.Describe(&s.Token, "Bearer token minted for the cluster at creation. Not retrievable afterwards; imported clusters have an empty token (rotate it deliberately from the DevZero UI if you need it in state).") } // Cluster is the resource implementation. @@ -106,7 +106,6 @@ func (c *Cluster) Read(ctx context.Context, req infer.ReadRequest[ClusterArgs, C } // Update calls ClusterMutationService.UpdateCluster. -// If the existing token is empty (e.g. after import), it also calls ResetClusterToken. func (c *Cluster) Update(ctx context.Context, req infer.UpdateRequest[ClusterArgs, ClusterState]) (infer.UpdateResponse[ClusterState], error) { if req.DryRun { return infer.UpdateResponse[ClusterState]{Output: ClusterState{ClusterArgs: req.Inputs, Token: req.State.Token}}, nil diff --git a/provider/pkg/resources/node_policy.go b/provider/pkg/resources/node_policy.go index 40161f8..7c4a634 100644 --- a/provider/pkg/resources/node_policy.go +++ b/provider/pkg/resources/node_policy.go @@ -457,9 +457,11 @@ func (n *NodePolicy) Read(ctx context.Context, req infer.ReadRequest[NodePolicyA } // ListNodePolicies also returns read-only virtual policies mirrored from - // non-dakr Karpenter resources (source == "cluster"); skip them. + // non-dakr Karpenter resources; skip exactly those (source == "cluster") + // rather than any unknown source, so a future backend source tag cannot + // silently orphan a managed policy. for _, p := range resp.Msg.Policies { - if p.Source != "" && p.Source != "dakr" { + if p.Source == "cluster" { continue } if p.Id == req.ID { diff --git a/provider/pkg/resources/validation.go b/provider/pkg/resources/validation.go index 7c75e6d..ba8fbc8 100644 --- a/provider/pkg/resources/validation.go +++ b/provider/pkg/resources/validation.go @@ -32,6 +32,9 @@ var ( validHPAMetrics = map[string]bool{ "cpu": true, "memory": true, "gpu": true, "network_ingress": true, "network_egress": true, } + validRuleKinds = map[string]bool{ + "Deployment": true, "StatefulSet": true, "DaemonSet": true, "CronJob": true, "Job": true, + } ) func sortedKeys(m map[string]bool) string { @@ -94,6 +97,9 @@ func validateWorkloadPolicyTargetArgs(a WorkloadPolicyTargetArgs) error { } func validateWorkloadRuleArgs(a WorkloadRuleArgs) error { + if !validRuleKinds[a.Kind] { + return fmt.Errorf("kind: unknown value %q (valid values: %s)", a.Kind, sortedKeys(validRuleKinds)) + } if err := validateEnumList("actionTriggers", a.ActionTriggers, validActionTriggers); err != nil { return err } diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 32f975e..7c4ef7f 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -877,12 +877,12 @@ func emergencyResponseFromProto(p *apiv1.EmergencyResponseConfig) *EmergencyResp } return &EmergencyResponseConfigArgs{ OomEnabled: p.OomEnabled, - OomMemoryMultiplier: float64(p.OomMemoryMultiplier), + OomMemoryMultiplier: f32(p.OomMemoryMultiplier), OomMaxReactions: int(p.OomMaxReactions), OomCooldownSeconds: int(p.OomCooldownSeconds), CpuThrottlingEnabled: p.CpuThrottlingEnabled, - CpuThrottlingThreshold: float64(p.CpuThrottlingThreshold), - CpuThrottlingMultiplier: float64(p.CpuThrottlingMultiplier), + CpuThrottlingThreshold: f32(p.CpuThrottlingThreshold), + CpuThrottlingMultiplier: f32(p.CpuThrottlingMultiplier), } } diff --git a/scripts/ci/test-nodejs.sh b/scripts/ci/test-nodejs.sh index 0d074db..2a818c9 100755 --- a/scripts/ci/test-nodejs.sh +++ b/scripts/ci/test-nodejs.sh @@ -45,7 +45,10 @@ cat > package.json <<'PKG' { "name": "consumer-test", "version": "1.0.0", - "private": true + "private": true, + "overrides": { + "@types/node": "^18" + } } PKG From cc1d82d9e8bd005300debe5b1078c15f940f6579 Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 09:24:00 +0200 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20review-suggested=20cleanups=20?= =?UTF-8?q?=E2=80=94=20isNotFound/truePtr=20helpers,=20clearer=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - isNotFound(err) collapses the repeated connect.CodeOf NotFound checks across all Read/Delete paths; truePtr() collapses the proto-bool to optional-pointer read-back idiom. - f32 renamed to f32to64 (the old name read as the opposite direction). - fakeIdempotentRequest renamed to fakeProcedureRequest — it also backs newMutatingRequest. --- provider/pkg/provider/client_test.go | 10 ++-- provider/pkg/resources/cluster.go | 4 +- provider/pkg/resources/node_policy.go | 2 +- provider/pkg/resources/node_policy_target.go | 2 +- provider/pkg/resources/validation.go | 15 +++++ provider/pkg/resources/workload_policy.go | 58 ++++++++----------- .../pkg/resources/workload_policy_target.go | 4 +- provider/pkg/resources/workload_rule.go | 27 +++++---- 8 files changed, 64 insertions(+), 58 deletions(-) diff --git a/provider/pkg/provider/client_test.go b/provider/pkg/provider/client_test.go index 13a8ab6..ab3e291 100644 --- a/provider/pkg/provider/client_test.go +++ b/provider/pkg/provider/client_test.go @@ -50,25 +50,25 @@ func TestRetryInterceptor_SuccessOnFirstAttempt(t *testing.T) { } } -// fakeIdempotentRequest wraps a connect request and reports a Get-style +// fakeProcedureRequest wraps a connect request and reports a Get-style // procedure, since retryInterceptor only retries idempotent (read) RPCs. -type fakeIdempotentRequest struct { +type fakeProcedureRequest struct { connect.AnyRequest procedure string } -func (f *fakeIdempotentRequest) Spec() connect.Spec { +func (f *fakeProcedureRequest) Spec() connect.Spec { return connect.Spec{Procedure: f.procedure} } func newIdempotentRequest() connect.AnyRequest { req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - return &fakeIdempotentRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sService/GetCluster"} + return &fakeProcedureRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sService/GetCluster"} } func newMutatingRequest() connect.AnyRequest { req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - return &fakeIdempotentRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sRecommendationService/CreateNodePolicies"} + return &fakeProcedureRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sRecommendationService/CreateNodePolicies"} } func TestRetryInterceptor_RetriesOnUnavailable(t *testing.T) { diff --git a/provider/pkg/resources/cluster.go b/provider/pkg/resources/cluster.go index 964e870..3e69425 100644 --- a/provider/pkg/resources/cluster.go +++ b/provider/pkg/resources/cluster.go @@ -77,7 +77,7 @@ func (c *Cluster) Read(ctx context.Context, req infer.ReadRequest[ClusterArgs, C ClusterId: req.ID, })) if err != nil { - if connect.CodeOf(err) == connect.CodeNotFound { + if isNotFound(err) { // Deleted out of band — drop from state. return infer.ReadResponse[ClusterArgs, ClusterState]{}, nil } @@ -158,7 +158,7 @@ func (c *Cluster) Delete(ctx context.Context, req infer.DeleteRequest[ClusterSta TeamId: cs.TeamID, ClusterId: req.ID, })) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteCluster: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/node_policy.go b/provider/pkg/resources/node_policy.go index 7c4a634..7ef15c0 100644 --- a/provider/pkg/resources/node_policy.go +++ b/provider/pkg/resources/node_policy.go @@ -517,7 +517,7 @@ func (n *NodePolicy) Delete(ctx context.Context, req infer.DeleteRequest[NodePol TeamId: cs.TeamID, PolicyId: req.ID, })) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteNodePolicy: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/node_policy_target.go b/provider/pkg/resources/node_policy_target.go index b94636d..3b347f6 100644 --- a/provider/pkg/resources/node_policy_target.go +++ b/provider/pkg/resources/node_policy_target.go @@ -155,7 +155,7 @@ func (n *NodePolicyTarget) Delete(ctx context.Context, req infer.DeleteRequest[N _, err := cs.RecommendationClient.UpdateNodePolicyTarget(ctx, connect.NewRequest(&apiv1.UpdateNodePolicyTargetRequest{ Target: target, })) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("disable node policy target on destroy: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/validation.go b/provider/pkg/resources/validation.go index ba8fbc8..a83f847 100644 --- a/provider/pkg/resources/validation.go +++ b/provider/pkg/resources/validation.go @@ -4,8 +4,23 @@ import ( "fmt" "sort" "strings" + + "connectrpc.com/connect" ) +// isNotFound reports whether err is a connect NotFound — the shared shape for +// "tolerate on delete, drop from state on read". +func isNotFound(err error) bool { + return connect.CodeOf(err) == connect.CodeNotFound +} + +// truePtr returns a *bool for proto-bool → optional-pointer read-backs where +// only an explicit true should materialize. +func truePtr() *bool { + v := true + return &v +} + // The DevZero API silently ignores unknown enum values (an unknown trigger is // dropped, an unknown kind becomes UNSPECIFIED and matches nothing), so the // provider validates every string-enum input up front and fails the operation diff --git a/provider/pkg/resources/workload_policy.go b/provider/pkg/resources/workload_policy.go index 3993a57..425aade 100644 --- a/provider/pkg/resources/workload_policy.go +++ b/provider/pkg/resources/workload_policy.go @@ -213,7 +213,7 @@ func (w *WorkloadPolicy) Read(ctx context.Context, req infer.ReadRequest[Workloa PolicyId: req.ID, })) if err != nil { - if connect.CodeOf(err) == connect.CodeNotFound { + if isNotFound(err) { // Deleted out of band — drop from state. return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{}, nil } @@ -272,7 +272,7 @@ func (w *WorkloadPolicy) Delete(ctx context.Context, req infer.DeleteRequest[Wor TeamId: cs.TeamID, PolicyId: req.ID, })) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRecommendationPolicy: %w", err) } return infer.DeleteResponse{}, nil @@ -412,7 +412,7 @@ func float32PtrToFloat64Ptr(v *float32) *float64 { if v == nil { return nil } - x := f32(*v) + x := f32to64(*v) return &x } @@ -447,7 +447,7 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.StartupPeriodSeconds = &v } if p.MinChangePercent != nil { - v := f32(*p.MinChangePercent) + v := f32to64(*p.MinChangePercent) a.MinChangePercent = &v } if p.MinDataPoints != nil { @@ -455,15 +455,15 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.MinDataPoints = &v } if p.StabilityCvMax != nil { - v := f32(*p.StabilityCvMax) + v := f32to64(*p.StabilityCvMax) a.StabilityCvMax = &v } if p.HysteresisVsTarget != nil { - v := f32(*p.HysteresisVsTarget) + v := f32to64(*p.HysteresisVsTarget) a.HysteresisVsTarget = &v } if p.DriftDeltaPercent != nil { - v := f32(*p.DriftDeltaPercent) + v := f32to64(*p.DriftDeltaPercent) a.DriftDeltaPercent = &v } if p.MinVpaWindowDataPoints != nil { @@ -475,25 +475,21 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.CooldownMinutes = &v } if p.EnablePmaxProtection { - v := true - a.EnablePmaxProtection = &v + a.EnablePmaxProtection = truePtr() } if p.PmaxRatioThreshold != nil { - v := f32(*p.PmaxRatioThreshold) + v := f32to64(*p.PmaxRatioThreshold) a.PmaxRatioThreshold = &v } if p.EnableInPlaceVerticalScaling { - v := true - a.EnableInPlaceVerticalScaling = &v + a.EnableInPlaceVerticalScaling = truePtr() } if p.AllowInPlaceMemoryLimitDecrease { - v := true - a.AllowInPlaceMemoryLimitDecrease = &v + a.AllowInPlaceMemoryLimitDecrease = truePtr() } if p.PdbEnabled { - v := true - a.PdbEnabled = &v + a.PdbEnabled = truePtr() } a.CpuFloorPercent = int64PtrToIntPtr(p.CpuFloorPercent) @@ -506,8 +502,7 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.MemoryLimitCeilingPercent = int64PtrToIntPtr(p.MemoryLimitCeilingPercent) if p.JvmHeapOptimizationEnabled { - v := true - a.JvmHeapOptimizationEnabled = &v + a.JvmHeapOptimizationEnabled = truePtr() } a.JvmHeapTargetPercentile = float32PtrToFloat64Ptr(p.JvmHeapTargetPercentile) a.JvmHeapHeadroomMultiplier = float32PtrToFloat64Ptr(p.JvmHeapHeadroomMultiplier) @@ -516,8 +511,7 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.JvmMinHeapBytes = int64PtrToIntPtr(p.JvmMinHeapBytes) a.JvmMaxHeapBytes = int64PtrToIntPtr(p.JvmMaxHeapBytes) if p.JvmPreferContainerSupport { - v := true - a.JvmPreferContainerSupport = &v + a.JvmPreferContainerSupport = truePtr() } a.JvmCpuStartupFloorMillicores = int64PtrToIntPtr(p.JvmCpuStartupFloorMillicores) @@ -655,26 +649,26 @@ func verticalScalingFromProto(t *apiv1.VerticalScalingOptimizationTarget) *Verti v.MaxRequest = &x } if t.OverheadMultiplier != nil { - x := f32(*t.OverheadMultiplier) + x := f32to64(*t.OverheadMultiplier) v.OverheadMultiplier = &x } if t.TargetPercentile != nil { - x := f32(*t.TargetPercentile) + x := f32to64(*t.TargetPercentile) v.TargetPercentile = &x } if t.MaxScaleUpPercent != nil { - x := f32(*t.MaxScaleUpPercent) + x := f32to64(*t.MaxScaleUpPercent) v.MaxScaleUpPercent = &x } if t.MaxScaleDownPercent != nil { - x := f32(*t.MaxScaleDownPercent) + x := f32to64(*t.MaxScaleDownPercent) v.MaxScaleDownPercent = &x } if t.LimitsAdjustmentEnabled != nil { v.LimitsAdjustmentEnabled = t.LimitsAdjustmentEnabled } if t.LimitMultiplier != nil { - x := f32(*t.LimitMultiplier) + x := f32to64(*t.LimitMultiplier) v.LimitMultiplier = &x } if t.MinDataPoints != nil { @@ -682,12 +676,10 @@ func verticalScalingFromProto(t *apiv1.VerticalScalingOptimizationTarget) *Verti v.MinDataPoints = &x } if t.AdjustReqEvenIfNotSet { - adj := true - v.AdjustReqEvenIfNotSet = &adj + v.AdjustReqEvenIfNotSet = truePtr() } if t.LimitsRemovalEnabled { - lre := true - v.LimitsRemovalEnabled = &lre + v.LimitsRemovalEnabled = truePtr() } v.RequestUseRss = t.RequestUseRss v.LimitUseRss = t.LimitUseRss @@ -750,7 +742,7 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MaxReplicas = &x } if t.TargetUtilization != nil { - x := f32(*t.TargetUtilization) + x := f32to64(*t.TargetUtilization) h.TargetUtilization = &x } if t.PrimaryMetric != nil { @@ -761,7 +753,7 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MinDataPoints = &x } if t.MaxReplicaChangePercent != nil { - x := f32(*t.MaxReplicaChangePercent) + x := f32to64(*t.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &x } h.NetworkTargetThroughputBytesPerSec = int64PtrToIntPtr(t.NetworkTargetThroughputBytesPerSec) @@ -818,11 +810,11 @@ func hpaMetricFromProto(m *apiv1.HPAMetricType) *string { return &s } -// f32(v) converts a float32 coming from the API into the float64 the Pulumi +// f32to64(v) converts a float32 coming from the API into the float64 the Pulumi // SDKs use, picking the shortest decimal that round-trips (so a stored 0.7 // comes back as 0.7, not 0.699999988079071 — which would show as a perpetual // diff after refresh). -func f32(v float32) float64 { +func f32to64(v float32) float64 { f, _ := strconv.ParseFloat(strconv.FormatFloat(float64(v), 'g', -1, 32), 64) return f } diff --git a/provider/pkg/resources/workload_policy_target.go b/provider/pkg/resources/workload_policy_target.go index 69a487b..b3c5638 100644 --- a/provider/pkg/resources/workload_policy_target.go +++ b/provider/pkg/resources/workload_policy_target.go @@ -148,7 +148,7 @@ func (w *WorkloadPolicyTarget) Read(ctx context.Context, req infer.ReadRequest[W resp, err := cs.RecommendationClient.GetWorkloadPolicyTarget(ctx, getReq) if err != nil { - if connect.CodeOf(err) == connect.CodeNotFound { + if isNotFound(err) { // Deleted out of band — drop from state. return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{}, nil } @@ -210,7 +210,7 @@ func (w *WorkloadPolicyTarget) Delete(ctx context.Context, req infer.DeleteReque deleteReq.Header().Set("Authorization", "Bearer "+cs.Token) _, err := cs.RecommendationClient.DeleteWorkloadPolicyTarget(ctx, deleteReq) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadPolicyTarget: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 7c4ef7f..e2bdd97 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -297,7 +297,7 @@ func (w *WorkloadRule) Read(ctx context.Context, req infer.ReadRequest[WorkloadR RuleId: req.ID, })) if err != nil { - if connect.CodeOf(err) == connect.CodeNotFound { + if isNotFound(err) { // Deleted out of band — drop from state. return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{}, nil } @@ -415,7 +415,7 @@ func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[Workl TeamId: cs.TeamID, RuleId: req.ID, })) - if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRule: %w", err) } return infer.DeleteResponse{}, nil @@ -504,8 +504,7 @@ func ruleProtoToArgs(r *apiv1.WorkloadRule) WorkloadRuleArgs { Containers: containerRuleConfigsFromProto(r.Containers), } if r.Disabled { - v := true - a.Disabled = &v + a.Disabled = truePtr() } if r.LookbackPeriodSeconds != nil { v := int(*r.LookbackPeriodSeconds) @@ -623,19 +622,19 @@ func resourceRuleConfigFromProto(p *apiv1.ResourceRuleConfig) *ResourceRuleConfi r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := f32(*p.LimitMultiplier) + v := f32to64(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := f32(*p.TargetPercentile) + v := f32to64(*p.TargetPercentile) r.TargetPercentile = &v } if p.MaxScaleUpPercent != nil { - v := f32(*p.MaxScaleUpPercent) + v := f32to64(*p.MaxScaleUpPercent) r.MaxScaleUpPercent = &v } if p.MaxScaleDownPercent != nil { - v := f32(*p.MaxScaleDownPercent) + v := f32to64(*p.MaxScaleDownPercent) r.MaxScaleDownPercent = &v } r.InitialRequest = int64PtrToIntPtr(p.InitialRequest) @@ -703,7 +702,7 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigArgs { h.MaxReplicas = &v } if p.MaxReplicaChangePercent != nil { - v := f32(*p.MaxReplicaChangePercent) + v := f32to64(*p.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &v } if p.ScaleDownCooldownSeconds != nil { @@ -877,12 +876,12 @@ func emergencyResponseFromProto(p *apiv1.EmergencyResponseConfig) *EmergencyResp } return &EmergencyResponseConfigArgs{ OomEnabled: p.OomEnabled, - OomMemoryMultiplier: f32(p.OomMemoryMultiplier), + OomMemoryMultiplier: f32to64(p.OomMemoryMultiplier), OomMaxReactions: int(p.OomMaxReactions), OomCooldownSeconds: int(p.OomCooldownSeconds), CpuThrottlingEnabled: p.CpuThrottlingEnabled, - CpuThrottlingThreshold: f32(p.CpuThrottlingThreshold), - CpuThrottlingMultiplier: f32(p.CpuThrottlingMultiplier), + CpuThrottlingThreshold: f32to64(p.CpuThrottlingThreshold), + CpuThrottlingMultiplier: f32to64(p.CpuThrottlingMultiplier), } } @@ -968,11 +967,11 @@ func containerResourceConfigFromProto(p *apiv1.ContainerResourceConfig) *Resourc r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := f32(*p.LimitMultiplier) + v := f32to64(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := f32(*p.TargetPercentile) + v := f32to64(*p.TargetPercentile) r.TargetPercentile = &v } r.RequestUseRss = p.RequestUseRss From 4f2dd059ae7901f840fa28d3a7717b665baa728b Mon Sep 17 00:00:00 2001 From: tzvonimir Date: Fri, 21 Aug 2026 16:00:42 +0200 Subject: [PATCH 8/8] test: all-fields round-trip harness, Diff coverage, workload-policy-target lifecycle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - roundtrip_test.go: a reflection-based populator fills EVERY pulumi-tagged field of every args struct (enum-valued strings get valid members), then each resource converts args -> proto -> args -> proto and requires the two protos to be identical — so a newly added field that stops round-tripping in either direction fails the suite. Spot-checks assert the specific new field groups (zonal shift, startup taints, JVM knobs, floor/ceiling bounds, RSS flags, HPA extras, lookback/disabled, connectorId) survive the cycle. A guard test fails if a future field type isn't handled by the populator. - WorkloadRule.Diff unit tests: identity fields (clusterId/namespace/kind/ name) require replacement, non-identity changes update in place, and a no-change plan reports no changes. - Fake server gains the WorkloadPolicyTarget handlers plus a full lifecycle test (create with annotationSelector/notIn filters, enabled default, update propagation, drop-from-state after out-of-band deletion, tolerant delete). --- provider/pkg/resources/fake_server_test.go | 152 ++++++++ provider/pkg/resources/roundtrip_test.go | 382 +++++++++++++++++++++ 2 files changed, 534 insertions(+) create mode 100644 provider/pkg/resources/roundtrip_test.go diff --git a/provider/pkg/resources/fake_server_test.go b/provider/pkg/resources/fake_server_test.go index 3a953d7..347b5de 100644 --- a/provider/pkg/resources/fake_server_test.go +++ b/provider/pkg/resources/fake_server_test.go @@ -182,6 +182,89 @@ func (f *fakeBackend) DeleteWorkloadRecommendationPolicy(_ context.Context, req return connect.NewResponse(&apiv1.DeleteWorkloadRecommendationPolicyResponse{Success: true}), nil } +func (f *fakeBackend) CreateWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.CreateWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.CreateWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if len(req.Msg.ClusterIds) == 0 { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("cluster_ids must name at least one cluster")) + } + t := &apiv1.WorkloadPolicyTarget{ + TargetId: f.id("wpt"), + PolicyId: req.Msg.PolicyId, + TeamId: req.Msg.TeamId, + Name: req.Msg.Name, + Description: req.Msg.Description, + Priority: req.Msg.Priority, + Enabled: req.Msg.Enabled, + NamespaceSelector: req.Msg.NamespaceSelector, + WorkloadSelector: req.Msg.WorkloadSelector, + AnnotationSelector: req.Msg.AnnotationSelector, + KindFilter: req.Msg.KindFilter, + KindFilterNotIn: req.Msg.KindFilterNotIn, + NamePattern: req.Msg.NamePattern, + NamespacePattern: req.Msg.NamespacePattern, + WorkloadNames: req.Msg.WorkloadNames, + WorkloadNamesNotIn: req.Msg.WorkloadNamesNotIn, + ClusterIds: req.Msg.ClusterIds, + } + t.NodeGroupNames = req.Msg.NodeGroupNames //nolint:staticcheck // deprecated upstream but still round-tripped + f.wpt[t.TargetId] = t + return connect.NewResponse(&apiv1.CreateWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) GetWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.GetWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.GetWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t, ok := f.wpt[req.Msg.TargetId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) UpdateWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.UpdateWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.UpdateWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t, ok := f.wpt[req.Msg.TargetId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + t.Name = req.Msg.Name + t.Description = req.Msg.Description + t.Priority = req.Msg.Priority + t.Enabled = req.Msg.Enabled + t.NamespaceSelector = req.Msg.NamespaceSelector + t.WorkloadSelector = req.Msg.WorkloadSelector + t.AnnotationSelector = req.Msg.AnnotationSelector + t.KindFilter = req.Msg.KindFilter + t.KindFilterNotIn = req.Msg.KindFilterNotIn + t.NamePattern = req.Msg.NamePattern + t.NamespacePattern = req.Msg.NamespacePattern + t.WorkloadNames = req.Msg.WorkloadNames + t.WorkloadNamesNotIn = req.Msg.WorkloadNamesNotIn + t.NodeGroupNames = req.Msg.NodeGroupNames //nolint:staticcheck // deprecated upstream but still round-tripped + if len(req.Msg.ClusterIds) > 0 { + t.ClusterIds = req.Msg.ClusterIds + } + return connect.NewResponse(&apiv1.UpdateWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) DeleteWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.DeleteWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + found := false + for _, id := range req.Msg.TargetIds { + if _, ok := f.wpt[id]; ok { + delete(f.wpt, id) + found = true + } + } + if !found { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("no workload policy targets found for deletion")) + } + return connect.NewResponse(&apiv1.DeleteWorkloadPolicyTargetResponse{}), nil +} + func (f *fakeBackend) UpsertManualWorkloadRule(_ context.Context, req *connect.Request[apiv1.UpsertManualWorkloadRuleRequest]) (*connect.Response[apiv1.UpsertManualWorkloadRuleResponse], error) { f.mu.Lock() defer f.mu.Unlock() @@ -519,3 +602,72 @@ func TestLifecycle_NodePolicyTarget_EnabledDefaultsTrue(t *testing.T) { t.Fatalf("expected the target to be created enabled, got %+v", tgt) } } + +func TestLifecycle_WorkloadPolicyTarget(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadPolicyTarget{} + + desc := "team a targets" + args := WorkloadPolicyTargetArgs{ + Name: "t1", + PolicyId: "wp-0001", + ClusterIds: []string{"c1"}, + Description: &desc, + KindFilter: []string{"Deployment"}, + KindFilterNotIn: []string{"CronJob"}, + WorkloadNamesNotIn: []string{"excluded"}, + AnnotationSelector: &LabelSelectorArgs{MatchLabels: map[string]string{"team": "a"}}, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadPolicyTargetArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + out := created.Output + if out.AnnotationSelector == nil || out.AnnotationSelector.MatchLabels["team"] != "a" { + t.Fatalf("annotationSelector did not round-trip: %+v", out.AnnotationSelector) + } + if len(out.KindFilterNotIn) != 1 || len(out.WorkloadNamesNotIn) != 1 { + t.Fatalf("notIn filters did not round-trip: %+v", out) + } + if out.Enabled == nil || !*out.Enabled { + t.Fatal("enabled must default to true") + } + + // Update: disable + rename. + disabled := false + updatedArgs := args + updatedArgs.Name = "t1-renamed" + updatedArgs.Enabled = &disabled + updated, err := w.Update(ctx, infer.UpdateRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ + ID: created.ID, Inputs: updatedArgs, State: created.Output, + }) + if err != nil { + t.Fatalf("Update: %v", err) + } + if updated.Output.Name != "t1-renamed" || updated.Output.Enabled == nil || *updated.Output.Enabled { + t.Fatalf("update did not round-trip: %+v", updated.Output) + } + fake.mu.Lock() + stored := fake.wpt[created.ID] + fake.mu.Unlock() + if stored == nil || stored.Name != "t1-renamed" || stored.Enabled { + t.Fatalf("update not propagated backend-side: %+v", stored) + } + + // Out-of-band delete → Read drops from state; Delete tolerates NotFound. + fake.mu.Lock() + delete(fake.wpt, created.ID) + fake.mu.Unlock() + gone, err := w.Read(ctx, infer.ReadRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: created.ID, Inputs: updatedArgs, State: updated.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadPolicyTargetState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} diff --git a/provider/pkg/resources/roundtrip_test.go b/provider/pkg/resources/roundtrip_test.go new file mode 100644 index 0000000..6b7bd7b --- /dev/null +++ b/provider/pkg/resources/roundtrip_test.go @@ -0,0 +1,382 @@ +package resources + +import ( + "context" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/pulumi/pulumi-go-provider/infer" + "google.golang.org/protobuf/proto" + + apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" +) + +// --------------------------------------------------------------------------- +// All-fields round-trip harness. +// +// populateArgs fills EVERY pulumi-tagged field of an args struct — pointers, +// slices, maps, nested structs — with a concrete value (enum-valued strings +// get a valid member from fieldOverrides). Each resource's round-trip test +// then converts args → proto → args → proto and requires the two protos to be +// identical (proto.Equal). Any field that toProto forgets to send, or that +// fromProto forgets to read back, breaks the equality and fails the test — +// so newly added fields cannot silently stop round-tripping. +// --------------------------------------------------------------------------- + +// fieldOverrides supplies valid values for pulumi fields whose converters +// only accept a fixed vocabulary. Keyed by the pulumi tag name, applied at +// any nesting depth. +var fieldOverrides = map[string]string{ + "actionTriggers": "on_schedule", + "detectionTriggers": "pod_creation", + "kind": "Deployment", + "kindFilter": "Deployment", + "kindFilterNotIn": "CronJob", + "operator": "In", + "effect": "NoSchedule", + "primaryMetric": "cpu", + "instanceStorePolicy": "INSTANCE_STORE_POLICY_RAID0", + "consolidationPolicy": "WhenEmptyOrUnderutilized", + "type": "CPU", + "selectPolicy": "Max", +} + +func populateArgs(t *testing.T, v reflect.Value, tag string) { + t.Helper() + switch v.Kind() { + case reflect.Ptr: + v.Set(reflect.New(v.Type().Elem())) + populateArgs(t, v.Elem(), tag) + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + f := v.Type().Field(i) + fieldTag, ok := f.Tag.Lookup("pulumi") + if !ok { + continue + } + name := strings.Split(fieldTag, ",")[0] + populateArgs(t, v.Field(i), name) + } + case reflect.Slice: + elem := reflect.New(v.Type().Elem()).Elem() + populateArgs(t, elem, tag) + v.Set(reflect.Append(reflect.MakeSlice(v.Type(), 0, 1), elem)) + case reflect.Map: + m := reflect.MakeMap(v.Type()) + val := reflect.New(v.Type().Elem()).Elem() + populateArgs(t, val, tag) + m.SetMapIndex(reflect.ValueOf("k"), val) + v.Set(m) + case reflect.String: + if o, ok := fieldOverrides[tag]; ok { + v.SetString(o) + } else { + v.SetString("x-" + tag) + } + case reflect.Int, reflect.Int32, reflect.Int64: + v.SetInt(7) + case reflect.Float32, reflect.Float64: + v.SetFloat(0.75) + case reflect.Bool: + v.SetBool(true) + default: + t.Fatalf("populateArgs: unhandled kind %s for field %q", v.Kind(), tag) + } +} + +func requireProtoStable(t *testing.T, name string, proto1, proto2 proto.Message) { + t.Helper() + if !proto.Equal(proto1, proto2) { + t.Fatalf("%s: proto round-trip is lossy — a field is dropped in toProto or fromProto.\nfirst: %v\nsecond: %v", name, proto1, proto2) + } +} + +func TestRoundTrip_AllFields_NodePolicy(t *testing.T) { + var args NodePolicyArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + args.Raw = nil // raw YAML is write-only passthrough; keep the test on structured fields + + p1 := nodePolicyArgsToProto("team", "id", args) + back := nodePolicyProtoToArgs(p1) + p2 := nodePolicyArgsToProto("team", "id", back) + requireProtoStable(t, "NodePolicy", p1, p2) + + // Spot-check a few of the newly added fields survived the full cycle. + if p2.ZonalShift == nil || !p2.ZonalShift.RespectZonalShift { + t.Fatal("zonalShift did not round-trip") + } + if len(p2.StartupTaints) != 1 { + t.Fatal("startupTaints did not round-trip") + } + if p2.InstanceLocalNvme == nil { + t.Fatal("instanceLocalNvme did not round-trip") + } + if p2.CloudProviderId == nil || *p2.CloudProviderId != 7 { + t.Fatal("cloudProviderId did not round-trip") + } + if p2.Azure == nil || p2.Azure.ImageVersion == nil { + t.Fatal("azure.imageVersion did not round-trip") + } + if p2.MasterOverrideRoleName == "" { + t.Fatal("masterOverrideRoleName did not round-trip") + } +} + +func TestRoundTrip_AllFields_NodePolicyTarget(t *testing.T) { + var args NodePolicyTargetArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + p1 := nodePolicyTargetArgsToProto("team", "id", args) + back := nodePolicyTargetProtoToArgs(p1) + p2 := nodePolicyTargetArgsToProto("team", "id", back) + requireProtoStable(t, "NodePolicyTarget", p1, p2) +} + +func TestRoundTrip_AllFields_WorkloadPolicy(t *testing.T) { + var args WorkloadPolicyArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + p1 := argsToProto("team", "id", args) + back := protoToArgs(p1) + p2 := argsToProto("team", "id", back) + requireProtoStable(t, "WorkloadPolicy", p1, p2) + + // Spot-check the newly added field groups. + if !p2.EnableInPlaceVerticalScaling || !p2.AllowInPlaceMemoryLimitDecrease || !p2.PdbEnabled { + t.Fatal("in-place/pdb flags did not round-trip") + } + if p2.CpuFloorPercent == nil || p2.MemoryLimitCeilingPercent == nil { + t.Fatal("floor/ceiling percents did not round-trip") + } + if !p2.JvmHeapOptimizationEnabled || p2.JvmMaxHeapBytes == nil || p2.JvmCpuStartupFloorMillicores == nil { + t.Fatal("JVM knobs did not round-trip") + } + if p2.CpuVerticalScaling.RequestUseRss == nil || p2.MemoryVerticalScaling.LimitUseRss == nil { + t.Fatal("RSS flags did not round-trip") + } + hs := p2.HorizontalScaling + if hs.NetworkTargetThroughputBytesPerSec == nil || hs.TargetMemoryUtilization == nil || hs.CompositeFormula == nil || hs.ScaleDownCooldownSeconds == nil { + t.Fatal("horizontal scaling extras did not round-trip") + } +} + +func TestRoundTrip_AllFields_WorkloadPolicyTarget(t *testing.T) { + var args WorkloadPolicyTargetArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + req1 := targetArgsToCreateRequest("team", args) + // Synthesize the target the server would echo back for these fields. + echo := &apiv1.WorkloadPolicyTarget{ + TargetId: "id", + PolicyId: req1.PolicyId, + TeamId: req1.TeamId, + Name: req1.Name, + Description: req1.Description, + Priority: req1.Priority, + Enabled: req1.Enabled, + NamespaceSelector: req1.NamespaceSelector, + WorkloadSelector: req1.WorkloadSelector, + AnnotationSelector: req1.AnnotationSelector, + KindFilter: req1.KindFilter, + KindFilterNotIn: req1.KindFilterNotIn, + NamePattern: req1.NamePattern, + NamespacePattern: req1.NamespacePattern, + WorkloadNames: req1.WorkloadNames, + WorkloadNamesNotIn: req1.WorkloadNamesNotIn, + NodeGroupNames: req1.NodeGroupNames, //nolint:staticcheck // deprecated upstream but still round-tripped + ClusterIds: req1.ClusterIds, + } + back := targetProtoToArgs(echo) + req2 := targetArgsToCreateRequest("team", back) + requireProtoStable(t, "WorkloadPolicyTarget", req1, req2) + + if req2.AnnotationSelector == nil { + t.Fatal("annotationSelector did not round-trip") + } + if len(req2.WorkloadNamesNotIn) != 1 || len(req2.KindFilterNotIn) != 1 { + t.Fatal("notIn filters did not round-trip") + } +} + +func TestRoundTrip_AllFields_WorkloadRule(t *testing.T) { + var args WorkloadRuleArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + auto := false + args.AutoGenerate = &auto // manual mode so Fields are populated + + req1 := ruleArgsToUpsertRequest("team", args, true) + if req1.Fields == nil { + t.Fatal("expected manual fields") + } + // Synthesize the rule the server would echo back for these fields. + f := req1.Fields + echo := &apiv1.WorkloadRule{ + RuleId: "id", + ClusterId: req1.ClusterId, + Namespace: req1.Namespace, + Kind: req1.Kind, + Name: req1.Name, + CurrentSource: "pulumi_manual", + CpuRule: f.CpuRule, + MemoryRule: f.MemoryRule, + GpuRule: f.GpuRule, + HpaRule: f.HpaRule, + EmergencyResponse: f.EmergencyResponse, + ActionTriggers: f.ActionTriggers, + DetectionTriggers: f.DetectionTriggers, + SchedulerPlugins: f.SchedulerPlugins, + LiveMigrationEnabled: f.LiveMigrationEnabled, + UseInPlaceVerticalScaling: f.UseInPlaceVerticalScaling, + Containers: f.Containers, + StartupPeriodSeconds: f.StartupPeriodSeconds, + CronSchedule: f.CronSchedule, + CooldownMinutes: f.CooldownMinutes, + DefragmentationSchedule: f.DefragmentationSchedule, + LookbackPeriodSeconds: f.LookbackPeriodSeconds, + } + if f.Disabled != nil { + echo.Disabled = *f.Disabled + } + back := ruleProtoToArgs(echo) + back.AutoGenerate = &auto + req2 := ruleArgsToUpsertRequest("team", back, true) + requireProtoStable(t, "WorkloadRule", req1.Fields, req2.Fields) + + f2 := req2.Fields + if f2.LookbackPeriodSeconds == nil || f2.Disabled == nil { + t.Fatal("lookback/disabled did not round-trip") + } + if f2.CpuRule.InitialRequest == nil || f2.CpuRule.FloorPercent == nil || f2.CpuRule.LimitCeilingPercent == nil { + t.Fatal("initial/floor/ceiling bounds did not round-trip") + } + if f2.MemoryRule.RequestUseRss == nil || f2.MemoryRule.LimitUseRss == nil { + t.Fatal("RSS flags did not round-trip") + } + if len(f2.HpaRule.Metrics) != 1 || f2.HpaRule.Metrics[0].ConnectorId == nil { + t.Fatal("metric connectorId did not round-trip") + } + if len(f2.Containers) != 1 || f2.Containers[0].CpuRule.RequestUseRss == nil { + t.Fatal("container RSS flags did not round-trip") + } +} + +// --------------------------------------------------------------------------- +// Diff (replace-on-identity-change) tests +// --------------------------------------------------------------------------- + +func diffReq(old, new WorkloadRuleArgs) infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState] { + return infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState]{ + ID: "wr-1", + State: WorkloadRuleState{WorkloadRuleArgs: old}, + Inputs: new, + } +} + +func TestWorkloadRuleDiff(t *testing.T) { + w := &WorkloadRule{} + base := WorkloadRuleArgs{ClusterID: "c1", Namespace: "prod", Kind: "Deployment", Name: "api"} + + t.Run("no change", func(t *testing.T) { + resp, err := w.Diff(context.Background(), diffReq(base, base)) + if err != nil { + t.Fatal(err) + } + if resp.HasChanges { + t.Fatalf("expected no changes, got %v", resp.DetailedDiff) + } + }) + + for _, field := range []string{"clusterId", "namespace", "kind", "name"} { + t.Run("identity change replaces: "+field, func(t *testing.T) { + changed := base + switch field { + case "clusterId": + changed.ClusterID = "c2" + case "namespace": + changed.Namespace = "staging" + case "kind": + changed.Kind = "StatefulSet" + case "name": + changed.Name = "api-v2" + } + resp, err := w.Diff(context.Background(), diffReq(base, changed)) + if err != nil { + t.Fatal(err) + } + if !resp.HasChanges { + t.Fatal("expected changes") + } + d, ok := resp.DetailedDiff[field] + if !ok { + t.Fatalf("expected a diff entry for %q, got %v", field, resp.DetailedDiff) + } + if !strings.Contains(string(d.Kind), "replace") { + t.Fatalf("expected %q to require replacement, got kind %q", field, d.Kind) + } + }) + } + + t.Run("non-identity change updates in place", func(t *testing.T) { + changed := base + cron := "*/30 * * * *" + changed.CronSchedule = &cron + resp, err := w.Diff(context.Background(), diffReq(base, changed)) + if err != nil { + t.Fatal(err) + } + if !resp.HasChanges { + t.Fatal("expected changes") + } + d, ok := resp.DetailedDiff["cronSchedule"] + if !ok { + t.Fatalf("expected a diff entry for cronSchedule, got %v", resp.DetailedDiff) + } + if strings.Contains(string(d.Kind), "replace") { + t.Fatalf("cronSchedule change must not force replacement, got kind %q", d.Kind) + } + }) +} + +// Guard: every top-level pulumi field of every args struct is either populated +// by populateArgs or explicitly excluded above — fail if a future field type +// isn't handled, so the harness can't silently skip it. +func TestPopulateArgsHandlesAllFieldKinds(t *testing.T) { + for _, target := range []any{ + &NodePolicyArgs{}, &NodePolicyTargetArgs{}, &WorkloadPolicyArgs{}, + &WorkloadPolicyTargetArgs{}, &WorkloadRuleArgs{}, + } { + v := reflect.ValueOf(target).Elem() + populateArgs(t, v, "") + // verify nothing pulumi-tagged stayed zero + var walk func(v reflect.Value, path string) + walk = func(v reflect.Value, path string) { + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() { + t.Errorf("%s: pointer left nil", path) + return + } + walk(v.Elem(), path) + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + f := v.Type().Field(i) + if _, ok := f.Tag.Lookup("pulumi"); !ok { + continue + } + walk(v.Field(i), path+"."+f.Name) + } + case reflect.Slice, reflect.Map: + if v.Len() == 0 { + t.Errorf("%s: collection left empty", path) + } + case reflect.String: + if v.String() == "" { + t.Errorf("%s: string left empty", path) + } + } + } + walk(v, fmt.Sprintf("%T", target)) + } +}